1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) Microsoft Corporation. All rights reserved.
4 //
5 // File: d3dx9shader.h
6 // Content: D3DX Shader APIs
7 //
8 //////////////////////////////////////////////////////////////////////////////
9
10 #include "d3dx9.h"
11
12 #ifndef __D3DX9SHADER_H__
13 #define __D3DX9SHADER_H__
14
15
16 //---------------------------------------------------------------------------
17 // D3DXTX_VERSION:
18 // --------------
19 // Version token used to create a procedural texture filler in effects
20 // Used by D3DXFill[]TX functions
21 //---------------------------------------------------------------------------
22 #define D3DXTX_VERSION(_Major,_Minor) (('T' << 24) | ('X' << 16) | ((_Major) << 8) | (_Minor))
23
24
25
26 //----------------------------------------------------------------------------
27 // D3DXSHADER flags:
28 // -----------------
29 // D3DXSHADER_DEBUG
30 // Insert debug file/line/type/symbol information.
31 //
32 // D3DXSHADER_SKIPVALIDATION
33 // Do not validate the generated code against known capabilities and
34 // constraints. This option is only recommended when compiling shaders
35 // you KNOW will work. (ie. have compiled before without this option.)
36 // Shaders are always validated by D3D before they are set to the device.
37 //
38 // D3DXSHADER_SKIPOPTIMIZATION
39 // Instructs the compiler to skip optimization steps during code generation.
40 // Unless you are trying to isolate a problem in your code using this option
41 // is not recommended.
42 //
43 // D3DXSHADER_PACKMATRIX_ROWMAJOR
44 // Unless explicitly specified, matrices will be packed in row-major order
45 // on input and output from the shader.
46 //
47 // D3DXSHADER_PACKMATRIX_COLUMNMAJOR
48 // Unless explicitly specified, matrices will be packed in column-major
49 // order on input and output from the shader. This is generally more
50 // efficient, since it allows vector-matrix multiplication to be performed
51 // using a series of dot-products.
52 //
53 // D3DXSHADER_PARTIALPRECISION
54 // Force all computations in resulting shader to occur at partial precision.
55 // This may result in faster evaluation of shaders on some hardware.
56 //
57 // D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT
58 // Force compiler to compile against the next highest available software
59 // target for vertex shaders. This flag also turns optimizations off,
60 // and debugging on.
61 //
62 // D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT
63 // Force compiler to compile against the next highest available software
64 // target for pixel shaders. This flag also turns optimizations off,
65 // and debugging on.
66 //
67 // D3DXSHADER_NO_PRESHADER
68 // Disables Preshaders. Using this flag will cause the compiler to not
69 // pull out static expression for evaluation on the host cpu
70 //
71 // D3DXSHADER_AVOID_FLOW_CONTROL
72 // Hint compiler to avoid flow-control constructs where possible.
73 //
74 // D3DXSHADER_PREFER_FLOW_CONTROL
75 // Hint compiler to prefer flow-control constructs where possible.
76 //
77 //----------------------------------------------------------------------------
78
79 #define D3DXSHADER_DEBUG (1 << 0)
80 #define D3DXSHADER_SKIPVALIDATION (1 << 1)
81 #define D3DXSHADER_SKIPOPTIMIZATION (1 << 2)
82 #define D3DXSHADER_PACKMATRIX_ROWMAJOR (1 << 3)
83 #define D3DXSHADER_PACKMATRIX_COLUMNMAJOR (1 << 4)
84 #define D3DXSHADER_PARTIALPRECISION (1 << 5)
85 #define D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT (1 << 6)
86 #define D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT (1 << 7)
87 #define D3DXSHADER_NO_PRESHADER (1 << 8)
88 #define D3DXSHADER_AVOID_FLOW_CONTROL (1 << 9)
89 #define D3DXSHADER_PREFER_FLOW_CONTROL (1 << 10)
90 #define D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY (1 << 12)
91 #define D3DXSHADER_IEEE_STRICTNESS (1 << 13)
92 #define D3DXSHADER_USE_LEGACY_D3DX9_31_DLL (1 << 16)
93
94
95 // optimization level flags
96 #define D3DXSHADER_OPTIMIZATION_LEVEL0 (1 << 14)
97 #define D3DXSHADER_OPTIMIZATION_LEVEL1 0
98 #define D3DXSHADER_OPTIMIZATION_LEVEL2 ((1 << 14) | (1 << 15))
99 #define D3DXSHADER_OPTIMIZATION_LEVEL3 (1 << 15)
100
101
102
103 //----------------------------------------------------------------------------
104 // D3DXCONSTTABLE flags:
105 // -------------------
106
107 #define D3DXCONSTTABLE_LARGEADDRESSAWARE (1 << 17)
108
109
110
111 //----------------------------------------------------------------------------
112 // D3DXHANDLE:
113 // -----------
114 // Handle values used to efficiently reference shader and effect parameters.
115 // Strings can be used as handles. However, handles are not always strings.
116 //----------------------------------------------------------------------------
117
118 #ifndef D3DXFX_LARGEADDRESS_HANDLE
119 typedef LPCSTR D3DXHANDLE;
120 #else
121 typedef UINT_PTR D3DXHANDLE;
122 #endif
123 typedef D3DXHANDLE *LPD3DXHANDLE;
124
125
126 //----------------------------------------------------------------------------
127 // D3DXMACRO:
128 // ----------
129 // Preprocessor macro definition. The application pass in a NULL-terminated
130 // array of this structure to various D3DX APIs. This enables the application
131 // to #define tokens at runtime, before the file is parsed.
132 //----------------------------------------------------------------------------
133
134 typedef struct _D3DXMACRO
135 {
136 LPCSTR Name;
137 LPCSTR Definition;
138
139 } D3DXMACRO, *LPD3DXMACRO;
140
141
142 //----------------------------------------------------------------------------
143 // D3DXSEMANTIC:
144 //----------------------------------------------------------------------------
145
146 typedef struct _D3DXSEMANTIC
147 {
148 UINT Usage;
149 UINT UsageIndex;
150
151 } D3DXSEMANTIC, *LPD3DXSEMANTIC;
152
153
154
155 //----------------------------------------------------------------------------
156 // D3DXREGISTER_SET:
157 //----------------------------------------------------------------------------
158
159 typedef enum _D3DXREGISTER_SET
160 {
161 D3DXRS_BOOL,
162 D3DXRS_INT4,
163 D3DXRS_FLOAT4,
164 D3DXRS_SAMPLER,
165
166 // force 32-bit size enum
167 D3DXRS_FORCE_DWORD = 0x7fffffff
168
169 } D3DXREGISTER_SET, *LPD3DXREGISTER_SET;
170
171
172 //----------------------------------------------------------------------------
173 // D3DXPARAMETER_CLASS:
174 //----------------------------------------------------------------------------
175
176 typedef enum _D3DXPARAMETER_CLASS
177 {
178 D3DXPC_SCALAR,
179 D3DXPC_VECTOR,
180 D3DXPC_MATRIX_ROWS,
181 D3DXPC_MATRIX_COLUMNS,
182 D3DXPC_OBJECT,
183 D3DXPC_STRUCT,
184
185 // force 32-bit size enum
186 D3DXPC_FORCE_DWORD = 0x7fffffff
187
188 } D3DXPARAMETER_CLASS, *LPD3DXPARAMETER_CLASS;
189
190
191 //----------------------------------------------------------------------------
192 // D3DXPARAMETER_TYPE:
193 //----------------------------------------------------------------------------
194
195 typedef enum _D3DXPARAMETER_TYPE
196 {
197 D3DXPT_VOID,
198 D3DXPT_BOOL,
199 D3DXPT_INT,
200 D3DXPT_FLOAT,
201 D3DXPT_STRING,
202 D3DXPT_TEXTURE,
203 D3DXPT_TEXTURE1D,
204 D3DXPT_TEXTURE2D,
205 D3DXPT_TEXTURE3D,
206 D3DXPT_TEXTURECUBE,
207 D3DXPT_SAMPLER,
208 D3DXPT_SAMPLER1D,
209 D3DXPT_SAMPLER2D,
210 D3DXPT_SAMPLER3D,
211 D3DXPT_SAMPLERCUBE,
212 D3DXPT_PIXELSHADER,
213 D3DXPT_VERTEXSHADER,
214 D3DXPT_PIXELFRAGMENT,
215 D3DXPT_VERTEXFRAGMENT,
216 D3DXPT_UNSUPPORTED,
217
218 // force 32-bit size enum
219 D3DXPT_FORCE_DWORD = 0x7fffffff
220
221 } D3DXPARAMETER_TYPE, *LPD3DXPARAMETER_TYPE;
222
223
224 //----------------------------------------------------------------------------
225 // D3DXCONSTANTTABLE_DESC:
226 //----------------------------------------------------------------------------
227
228 typedef struct _D3DXCONSTANTTABLE_DESC
229 {
230 LPCSTR Creator; // Creator string
231 DWORD Version; // Shader version
232 UINT Constants; // Number of constants
233
234 } D3DXCONSTANTTABLE_DESC, *LPD3DXCONSTANTTABLE_DESC;
235
236
237 //----------------------------------------------------------------------------
238 // D3DXCONSTANT_DESC:
239 //----------------------------------------------------------------------------
240
241 typedef struct _D3DXCONSTANT_DESC
242 {
243 LPCSTR Name; // Constant name
244
245 D3DXREGISTER_SET RegisterSet; // Register set
246 UINT RegisterIndex; // Register index
247 UINT RegisterCount; // Number of registers occupied
248
249 D3DXPARAMETER_CLASS Class; // Class
250 D3DXPARAMETER_TYPE Type; // Component type
251
252 UINT Rows; // Number of rows
253 UINT Columns; // Number of columns
254 UINT Elements; // Number of array elements
255 UINT StructMembers; // Number of structure member sub-parameters
256
257 UINT Bytes; // Data size, in bytes
258 LPCVOID DefaultValue; // Pointer to default value
259
260 } D3DXCONSTANT_DESC, *LPD3DXCONSTANT_DESC;
261
262
263
264 //----------------------------------------------------------------------------
265 // ID3DXConstantTable:
266 //----------------------------------------------------------------------------
267
268 typedef interface ID3DXConstantTable ID3DXConstantTable;
269 typedef interface ID3DXConstantTable *LPD3DXCONSTANTTABLE;
270
271 // {AB3C758F-093E-4356-B762-4DB18F1B3A01}
272 DEFINE_GUID(IID_ID3DXConstantTable,
273 0xab3c758f, 0x93e, 0x4356, 0xb7, 0x62, 0x4d, 0xb1, 0x8f, 0x1b, 0x3a, 0x1);
274
275
276 #undef INTERFACE
277 #define INTERFACE ID3DXConstantTable
278
DECLARE_INTERFACE_(ID3DXConstantTable,IUnknown)279 DECLARE_INTERFACE_(ID3DXConstantTable, IUnknown)
280 {
281 // IUnknown
282 STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
283 STDMETHOD_(ULONG, AddRef)(THIS) PURE;
284 STDMETHOD_(ULONG, Release)(THIS) PURE;
285
286 // Buffer
287 STDMETHOD_(LPVOID, GetBufferPointer)(THIS) PURE;
288 STDMETHOD_(DWORD, GetBufferSize)(THIS) PURE;
289
290 // Descs
291 STDMETHOD(GetDesc)(THIS_ D3DXCONSTANTTABLE_DESC *pDesc) PURE;
292 STDMETHOD(GetConstantDesc)(THIS_ D3DXHANDLE hConstant, D3DXCONSTANT_DESC *pConstantDesc, UINT *pCount) PURE;
293 STDMETHOD_(UINT, GetSamplerIndex)(THIS_ D3DXHANDLE hConstant) PURE;
294
295 // Handle operations
296 STDMETHOD_(D3DXHANDLE, GetConstant)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE;
297 STDMETHOD_(D3DXHANDLE, GetConstantByName)(THIS_ D3DXHANDLE hConstant, LPCSTR pName) PURE;
298 STDMETHOD_(D3DXHANDLE, GetConstantElement)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE;
299
300 // Set Constants
301 STDMETHOD(SetDefaults)(THIS_ LPDIRECT3DDEVICE9 pDevice) PURE;
302 STDMETHOD(SetValue)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, LPCVOID pData, UINT Bytes) PURE;
303 STDMETHOD(SetBool)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, BOOL b) PURE;
304 STDMETHOD(SetBoolArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST BOOL* pb, UINT Count) PURE;
305 STDMETHOD(SetInt)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, INT n) PURE;
306 STDMETHOD(SetIntArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST INT* pn, UINT Count) PURE;
307 STDMETHOD(SetFloat)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, FLOAT f) PURE;
308 STDMETHOD(SetFloatArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST FLOAT* pf, UINT Count) PURE;
309 STDMETHOD(SetVector)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector) PURE;
310 STDMETHOD(SetVectorArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector, UINT Count) PURE;
311 STDMETHOD(SetMatrix)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE;
312 STDMETHOD(SetMatrixArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE;
313 STDMETHOD(SetMatrixPointerArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE;
314 STDMETHOD(SetMatrixTranspose)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE;
315 STDMETHOD(SetMatrixTransposeArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE;
316 STDMETHOD(SetMatrixTransposePointerArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE;
317 };
318
319
320 //----------------------------------------------------------------------------
321 // ID3DXTextureShader:
322 //----------------------------------------------------------------------------
323
324 typedef interface ID3DXTextureShader ID3DXTextureShader;
325 typedef interface ID3DXTextureShader *LPD3DXTEXTURESHADER;
326
327 // {3E3D67F8-AA7A-405d-A857-BA01D4758426}
328 DEFINE_GUID(IID_ID3DXTextureShader,
329 0x3e3d67f8, 0xaa7a, 0x405d, 0xa8, 0x57, 0xba, 0x1, 0xd4, 0x75, 0x84, 0x26);
330
331 #undef INTERFACE
332 #define INTERFACE ID3DXTextureShader
333
DECLARE_INTERFACE_(ID3DXTextureShader,IUnknown)334 DECLARE_INTERFACE_(ID3DXTextureShader, IUnknown)
335 {
336 // IUnknown
337 STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
338 STDMETHOD_(ULONG, AddRef)(THIS) PURE;
339 STDMETHOD_(ULONG, Release)(THIS) PURE;
340
341 // Gets
342 STDMETHOD(GetFunction)(THIS_ LPD3DXBUFFER *ppFunction) PURE;
343 STDMETHOD(GetConstantBuffer)(THIS_ LPD3DXBUFFER *ppConstantBuffer) PURE;
344
345 // Descs
346 STDMETHOD(GetDesc)(THIS_ D3DXCONSTANTTABLE_DESC *pDesc) PURE;
347 STDMETHOD(GetConstantDesc)(THIS_ D3DXHANDLE hConstant, D3DXCONSTANT_DESC *pConstantDesc, UINT *pCount) PURE;
348
349 // Handle operations
350 STDMETHOD_(D3DXHANDLE, GetConstant)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE;
351 STDMETHOD_(D3DXHANDLE, GetConstantByName)(THIS_ D3DXHANDLE hConstant, LPCSTR pName) PURE;
352 STDMETHOD_(D3DXHANDLE, GetConstantElement)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE;
353
354 // Set Constants
355 STDMETHOD(SetDefaults)(THIS) PURE;
356 STDMETHOD(SetValue)(THIS_ D3DXHANDLE hConstant, LPCVOID pData, UINT Bytes) PURE;
357 STDMETHOD(SetBool)(THIS_ D3DXHANDLE hConstant, BOOL b) PURE;
358 STDMETHOD(SetBoolArray)(THIS_ D3DXHANDLE hConstant, CONST BOOL* pb, UINT Count) PURE;
359 STDMETHOD(SetInt)(THIS_ D3DXHANDLE hConstant, INT n) PURE;
360 STDMETHOD(SetIntArray)(THIS_ D3DXHANDLE hConstant, CONST INT* pn, UINT Count) PURE;
361 STDMETHOD(SetFloat)(THIS_ D3DXHANDLE hConstant, FLOAT f) PURE;
362 STDMETHOD(SetFloatArray)(THIS_ D3DXHANDLE hConstant, CONST FLOAT* pf, UINT Count) PURE;
363 STDMETHOD(SetVector)(THIS_ D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector) PURE;
364 STDMETHOD(SetVectorArray)(THIS_ D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector, UINT Count) PURE;
365 STDMETHOD(SetMatrix)(THIS_ D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE;
366 STDMETHOD(SetMatrixArray)(THIS_ D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE;
367 STDMETHOD(SetMatrixPointerArray)(THIS_ D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE;
368 STDMETHOD(SetMatrixTranspose)(THIS_ D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE;
369 STDMETHOD(SetMatrixTransposeArray)(THIS_ D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE;
370 STDMETHOD(SetMatrixTransposePointerArray)(THIS_ D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE;
371 };
372
373
374 //----------------------------------------------------------------------------
375 // D3DXINCLUDE_TYPE:
376 //----------------------------------------------------------------------------
377
378 typedef enum _D3DXINCLUDE_TYPE
379 {
380 D3DXINC_LOCAL,
381 D3DXINC_SYSTEM,
382
383 // force 32-bit size enum
384 D3DXINC_FORCE_DWORD = 0x7fffffff
385
386 } D3DXINCLUDE_TYPE, *LPD3DXINCLUDE_TYPE;
387
388
389 //----------------------------------------------------------------------------
390 // ID3DXInclude:
391 // -------------
392 // This interface is intended to be implemented by the application, and can
393 // be used by various D3DX APIs. This enables application-specific handling
394 // of #include directives in source files.
395 //
396 // Open()
397 // Opens an include file. If successful, it should fill in ppData and
398 // pBytes. The data pointer returned must remain valid until Close is
399 // subsequently called. The name of the file is encoded in UTF-8 format.
400 // Close()
401 // Closes an include file. If Open was successful, Close is guaranteed
402 // to be called before the API using this interface returns.
403 //----------------------------------------------------------------------------
404
405 typedef interface ID3DXInclude ID3DXInclude;
406 typedef interface ID3DXInclude *LPD3DXINCLUDE;
407
408 #undef INTERFACE
409 #define INTERFACE ID3DXInclude
410
DECLARE_INTERFACE(ID3DXInclude)411 DECLARE_INTERFACE(ID3DXInclude)
412 {
413 STDMETHOD(Open)(THIS_ D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes) PURE;
414 STDMETHOD(Close)(THIS_ LPCVOID pData) PURE;
415 };
416
417
418 //////////////////////////////////////////////////////////////////////////////
419 // APIs //////////////////////////////////////////////////////////////////////
420 //////////////////////////////////////////////////////////////////////////////
421
422 #ifdef __cplusplus
423 extern "C" {
424 #endif //__cplusplus
425
426
427 //----------------------------------------------------------------------------
428 // D3DXAssembleShader:
429 // -------------------
430 // Assembles a shader.
431 //
432 // Parameters:
433 // pSrcFile
434 // Source file name
435 // hSrcModule
436 // Module handle. if NULL, current module will be used
437 // pSrcResource
438 // Resource name in module
439 // pSrcData
440 // Pointer to source code
441 // SrcDataLen
442 // Size of source code, in bytes
443 // pDefines
444 // Optional NULL-terminated array of preprocessor macro definitions.
445 // pInclude
446 // Optional interface pointer to use for handling #include directives.
447 // If this parameter is NULL, #includes will be honored when assembling
448 // from file, and will error when assembling from resource or memory.
449 // Flags
450 // See D3DXSHADER_xxx flags
451 // ppShader
452 // Returns a buffer containing the created shader. This buffer contains
453 // the assembled shader code, as well as any embedded debug info.
454 // ppErrorMsgs
455 // Returns a buffer containing a listing of errors and warnings that were
456 // encountered during assembly. If you are running in a debugger,
457 // these are the same messages you will see in your debug output.
458 //----------------------------------------------------------------------------
459
460
461 HRESULT WINAPI
462 D3DXAssembleShaderFromFileA(
463 LPCSTR pSrcFile,
464 CONST D3DXMACRO* pDefines,
465 LPD3DXINCLUDE pInclude,
466 DWORD Flags,
467 LPD3DXBUFFER* ppShader,
468 LPD3DXBUFFER* ppErrorMsgs);
469
470 HRESULT WINAPI
471 D3DXAssembleShaderFromFileW(
472 LPCWSTR pSrcFile,
473 CONST D3DXMACRO* pDefines,
474 LPD3DXINCLUDE pInclude,
475 DWORD Flags,
476 LPD3DXBUFFER* ppShader,
477 LPD3DXBUFFER* ppErrorMsgs);
478
479 #ifdef UNICODE
480 #define D3DXAssembleShaderFromFile D3DXAssembleShaderFromFileW
481 #else
482 #define D3DXAssembleShaderFromFile D3DXAssembleShaderFromFileA
483 #endif
484
485
486 HRESULT WINAPI
487 D3DXAssembleShaderFromResourceA(
488 HMODULE hSrcModule,
489 LPCSTR pSrcResource,
490 CONST D3DXMACRO* pDefines,
491 LPD3DXINCLUDE pInclude,
492 DWORD Flags,
493 LPD3DXBUFFER* ppShader,
494 LPD3DXBUFFER* ppErrorMsgs);
495
496 HRESULT WINAPI
497 D3DXAssembleShaderFromResourceW(
498 HMODULE hSrcModule,
499 LPCWSTR pSrcResource,
500 CONST D3DXMACRO* pDefines,
501 LPD3DXINCLUDE pInclude,
502 DWORD Flags,
503 LPD3DXBUFFER* ppShader,
504 LPD3DXBUFFER* ppErrorMsgs);
505
506 #ifdef UNICODE
507 #define D3DXAssembleShaderFromResource D3DXAssembleShaderFromResourceW
508 #else
509 #define D3DXAssembleShaderFromResource D3DXAssembleShaderFromResourceA
510 #endif
511
512
513 HRESULT WINAPI
514 D3DXAssembleShader(
515 LPCSTR pSrcData,
516 UINT SrcDataLen,
517 CONST D3DXMACRO* pDefines,
518 LPD3DXINCLUDE pInclude,
519 DWORD Flags,
520 LPD3DXBUFFER* ppShader,
521 LPD3DXBUFFER* ppErrorMsgs);
522
523
524
525 //----------------------------------------------------------------------------
526 // D3DXCompileShader:
527 // ------------------
528 // Compiles a shader.
529 //
530 // Parameters:
531 // pSrcFile
532 // Source file name.
533 // hSrcModule
534 // Module handle. if NULL, current module will be used.
535 // pSrcResource
536 // Resource name in module.
537 // pSrcData
538 // Pointer to source code.
539 // SrcDataLen
540 // Size of source code, in bytes.
541 // pDefines
542 // Optional NULL-terminated array of preprocessor macro definitions.
543 // pInclude
544 // Optional interface pointer to use for handling #include directives.
545 // If this parameter is NULL, #includes will be honored when compiling
546 // from file, and will error when compiling from resource or memory.
547 // pFunctionName
548 // Name of the entrypoint function where execution should begin.
549 // pProfile
550 // Instruction set to be used when generating code. Currently supported
551 // profiles are "vs_1_1", "vs_2_0", "vs_2_a", "vs_2_sw", "ps_1_1",
552 // "ps_1_2", "ps_1_3", "ps_1_4", "ps_2_0", "ps_2_a", "ps_2_sw", "tx_1_0"
553 // Flags
554 // See D3DXSHADER_xxx flags.
555 // ppShader
556 // Returns a buffer containing the created shader. This buffer contains
557 // the compiled shader code, as well as any embedded debug and symbol
558 // table info. (See D3DXGetShaderConstantTable)
559 // ppErrorMsgs
560 // Returns a buffer containing a listing of errors and warnings that were
561 // encountered during the compile. If you are running in a debugger,
562 // these are the same messages you will see in your debug output.
563 // ppConstantTable
564 // Returns a ID3DXConstantTable object which can be used to set
565 // shader constants to the device. Alternatively, an application can
566 // parse the D3DXSHADER_CONSTANTTABLE block embedded as a comment within
567 // the shader.
568 //----------------------------------------------------------------------------
569
570 HRESULT WINAPI
571 D3DXCompileShaderFromFileA(
572 LPCSTR pSrcFile,
573 CONST D3DXMACRO* pDefines,
574 LPD3DXINCLUDE pInclude,
575 LPCSTR pFunctionName,
576 LPCSTR pProfile,
577 DWORD Flags,
578 LPD3DXBUFFER* ppShader,
579 LPD3DXBUFFER* ppErrorMsgs,
580 LPD3DXCONSTANTTABLE* ppConstantTable);
581
582 HRESULT WINAPI
583 D3DXCompileShaderFromFileW(
584 LPCWSTR pSrcFile,
585 CONST D3DXMACRO* pDefines,
586 LPD3DXINCLUDE pInclude,
587 LPCSTR pFunctionName,
588 LPCSTR pProfile,
589 DWORD Flags,
590 LPD3DXBUFFER* ppShader,
591 LPD3DXBUFFER* ppErrorMsgs,
592 LPD3DXCONSTANTTABLE* ppConstantTable);
593
594 #ifdef UNICODE
595 #define D3DXCompileShaderFromFile D3DXCompileShaderFromFileW
596 #else
597 #define D3DXCompileShaderFromFile D3DXCompileShaderFromFileA
598 #endif
599
600
601 HRESULT WINAPI
602 D3DXCompileShaderFromResourceA(
603 HMODULE hSrcModule,
604 LPCSTR pSrcResource,
605 CONST D3DXMACRO* pDefines,
606 LPD3DXINCLUDE pInclude,
607 LPCSTR pFunctionName,
608 LPCSTR pProfile,
609 DWORD Flags,
610 LPD3DXBUFFER* ppShader,
611 LPD3DXBUFFER* ppErrorMsgs,
612 LPD3DXCONSTANTTABLE* ppConstantTable);
613
614 HRESULT WINAPI
615 D3DXCompileShaderFromResourceW(
616 HMODULE hSrcModule,
617 LPCWSTR pSrcResource,
618 CONST D3DXMACRO* pDefines,
619 LPD3DXINCLUDE pInclude,
620 LPCSTR pFunctionName,
621 LPCSTR pProfile,
622 DWORD Flags,
623 LPD3DXBUFFER* ppShader,
624 LPD3DXBUFFER* ppErrorMsgs,
625 LPD3DXCONSTANTTABLE* ppConstantTable);
626
627 #ifdef UNICODE
628 #define D3DXCompileShaderFromResource D3DXCompileShaderFromResourceW
629 #else
630 #define D3DXCompileShaderFromResource D3DXCompileShaderFromResourceA
631 #endif
632
633
634 HRESULT WINAPI
635 D3DXCompileShader(
636 LPCSTR pSrcData,
637 UINT SrcDataLen,
638 CONST D3DXMACRO* pDefines,
639 LPD3DXINCLUDE pInclude,
640 LPCSTR pFunctionName,
641 LPCSTR pProfile,
642 DWORD Flags,
643 LPD3DXBUFFER* ppShader,
644 LPD3DXBUFFER* ppErrorMsgs,
645 LPD3DXCONSTANTTABLE* ppConstantTable);
646
647
648 //----------------------------------------------------------------------------
649 // D3DXDisassembleShader:
650 // ----------------------
651 // Takes a binary shader, and returns a buffer containing text assembly.
652 //
653 // Parameters:
654 // pShader
655 // Pointer to the shader byte code.
656 // ShaderSizeInBytes
657 // Size of the shader byte code in bytes.
658 // EnableColorCode
659 // Emit HTML tags for color coding the output?
660 // pComments
661 // Pointer to a comment string to include at the top of the shader.
662 // ppDisassembly
663 // Returns a buffer containing the disassembled shader.
664 //----------------------------------------------------------------------------
665
666 HRESULT WINAPI
667 D3DXDisassembleShader(
668 CONST DWORD* pShader,
669 BOOL EnableColorCode,
670 LPCSTR pComments,
671 LPD3DXBUFFER* ppDisassembly);
672
673
674 //----------------------------------------------------------------------------
675 // D3DXGetPixelShaderProfile/D3DXGetVertexShaderProfile:
676 // -----------------------------------------------------
677 // Returns the name of the HLSL profile best suited to a given device.
678 //
679 // Parameters:
680 // pDevice
681 // Pointer to the device in question
682 //----------------------------------------------------------------------------
683
684 LPCSTR WINAPI
685 D3DXGetPixelShaderProfile(
686 LPDIRECT3DDEVICE9 pDevice);
687
688 LPCSTR WINAPI
689 D3DXGetVertexShaderProfile(
690 LPDIRECT3DDEVICE9 pDevice);
691
692
693 //----------------------------------------------------------------------------
694 // D3DXFindShaderComment:
695 // ----------------------
696 // Searches through a shader for a particular comment, denoted by a FourCC in
697 // the first DWORD of the comment. If the comment is not found, and no other
698 // error has occurred, S_FALSE is returned.
699 //
700 // Parameters:
701 // pFunction
702 // Pointer to the function DWORD stream
703 // FourCC
704 // FourCC used to identify the desired comment block.
705 // ppData
706 // Returns a pointer to the comment data (not including comment token
707 // and FourCC). Can be NULL.
708 // pSizeInBytes
709 // Returns the size of the comment data in bytes. Can be NULL.
710 //----------------------------------------------------------------------------
711
712 HRESULT WINAPI
713 D3DXFindShaderComment(
714 CONST DWORD* pFunction,
715 DWORD FourCC,
716 LPCVOID* ppData,
717 UINT* pSizeInBytes);
718
719
720 //----------------------------------------------------------------------------
721 // D3DXGetShaderSize:
722 // ------------------
723 // Returns the size of the shader byte-code, in bytes.
724 //
725 // Parameters:
726 // pFunction
727 // Pointer to the function DWORD stream
728 //----------------------------------------------------------------------------
729
730 UINT WINAPI
731 D3DXGetShaderSize(
732 CONST DWORD* pFunction);
733
734
735 //----------------------------------------------------------------------------
736 // D3DXGetShaderVersion:
737 // -----------------------
738 // Returns the shader version of a given shader. Returns zero if the shader
739 // function is NULL.
740 //
741 // Parameters:
742 // pFunction
743 // Pointer to the function DWORD stream
744 //----------------------------------------------------------------------------
745
746 DWORD WINAPI
747 D3DXGetShaderVersion(
748 CONST DWORD* pFunction);
749
750 //----------------------------------------------------------------------------
751 // D3DXGetShaderSemantics:
752 // -----------------------
753 // Gets semantics for all input elements referenced inside a given shader.
754 //
755 // Parameters:
756 // pFunction
757 // Pointer to the function DWORD stream
758 // pSemantics
759 // Pointer to an array of D3DXSEMANTIC structures. The function will
760 // fill this array with the semantics for each input element referenced
761 // inside the shader. This array is assumed to contain at least
762 // MAXD3DDECLLENGTH elements.
763 // pCount
764 // Returns the number of elements referenced by the shader
765 //----------------------------------------------------------------------------
766
767 HRESULT WINAPI
768 D3DXGetShaderInputSemantics(
769 CONST DWORD* pFunction,
770 D3DXSEMANTIC* pSemantics,
771 UINT* pCount);
772
773 HRESULT WINAPI
774 D3DXGetShaderOutputSemantics(
775 CONST DWORD* pFunction,
776 D3DXSEMANTIC* pSemantics,
777 UINT* pCount);
778
779
780 //----------------------------------------------------------------------------
781 // D3DXGetShaderSamplers:
782 // ----------------------
783 // Gets semantics for all input elements referenced inside a given shader.
784 //
785 // pFunction
786 // Pointer to the function DWORD stream
787 // pSamplers
788 // Pointer to an array of LPCSTRs. The function will fill this array
789 // with pointers to the sampler names contained within pFunction, for
790 // each sampler referenced inside the shader. This array is assumed to
791 // contain at least 16 elements.
792 // pCount
793 // Returns the number of samplers referenced by the shader
794 //----------------------------------------------------------------------------
795
796 HRESULT WINAPI
797 D3DXGetShaderSamplers(
798 CONST DWORD* pFunction,
799 LPCSTR* pSamplers,
800 UINT* pCount);
801
802
803 //----------------------------------------------------------------------------
804 // D3DXGetShaderConstantTable:
805 // ---------------------------
806 // Gets shader constant table embedded inside shader. A constant table is
807 // generated by D3DXAssembleShader and D3DXCompileShader, and is embedded in
808 // the body of the shader.
809 //
810 // Parameters:
811 // pFunction
812 // Pointer to the function DWORD stream
813 // Flags
814 // See D3DXCONSTTABLE_xxx
815 // ppConstantTable
816 // Returns a ID3DXConstantTable object which can be used to set
817 // shader constants to the device. Alternatively, an application can
818 // parse the D3DXSHADER_CONSTANTTABLE block embedded as a comment within
819 // the shader.
820 //----------------------------------------------------------------------------
821
822 HRESULT WINAPI
823 D3DXGetShaderConstantTable(
824 CONST DWORD* pFunction,
825 LPD3DXCONSTANTTABLE* ppConstantTable);
826
827 HRESULT WINAPI
828 D3DXGetShaderConstantTableEx(
829 CONST DWORD* pFunction,
830 DWORD Flags,
831 LPD3DXCONSTANTTABLE* ppConstantTable);
832
833
834
835 //----------------------------------------------------------------------------
836 // D3DXCreateTextureShader:
837 // ------------------------
838 // Creates a texture shader object, given the compiled shader.
839 //
840 // Parameters
841 // pFunction
842 // Pointer to the function DWORD stream
843 // ppTextureShader
844 // Returns a ID3DXTextureShader object which can be used to procedurally
845 // fill the contents of a texture using the D3DXFillTextureTX functions.
846 //----------------------------------------------------------------------------
847
848 HRESULT WINAPI
849 D3DXCreateTextureShader(
850 CONST DWORD* pFunction,
851 LPD3DXTEXTURESHADER* ppTextureShader);
852
853
854 //----------------------------------------------------------------------------
855 // D3DXPreprocessShader:
856 // ---------------------
857 // Runs the preprocessor on the specified shader or effect, but does
858 // not actually compile it. This is useful for evaluating the #includes
859 // and #defines in a shader and then emitting a reformatted token stream
860 // for debugging purposes or for generating a self-contained shader.
861 //
862 // Parameters:
863 // pSrcFile
864 // Source file name
865 // hSrcModule
866 // Module handle. if NULL, current module will be used
867 // pSrcResource
868 // Resource name in module
869 // pSrcData
870 // Pointer to source code
871 // SrcDataLen
872 // Size of source code, in bytes
873 // pDefines
874 // Optional NULL-terminated array of preprocessor macro definitions.
875 // pInclude
876 // Optional interface pointer to use for handling #include directives.
877 // If this parameter is NULL, #includes will be honored when assembling
878 // from file, and will error when assembling from resource or memory.
879 // ppShaderText
880 // Returns a buffer containing a single large string that represents
881 // the resulting formatted token stream
882 // ppErrorMsgs
883 // Returns a buffer containing a listing of errors and warnings that were
884 // encountered during assembly. If you are running in a debugger,
885 // these are the same messages you will see in your debug output.
886 //----------------------------------------------------------------------------
887
888 HRESULT WINAPI
889 D3DXPreprocessShaderFromFileA(
890 LPCSTR pSrcFile,
891 CONST D3DXMACRO* pDefines,
892 LPD3DXINCLUDE pInclude,
893 LPD3DXBUFFER* ppShaderText,
894 LPD3DXBUFFER* ppErrorMsgs);
895
896 HRESULT WINAPI
897 D3DXPreprocessShaderFromFileW(
898 LPCWSTR pSrcFile,
899 CONST D3DXMACRO* pDefines,
900 LPD3DXINCLUDE pInclude,
901 LPD3DXBUFFER* ppShaderText,
902 LPD3DXBUFFER* ppErrorMsgs);
903
904 #ifdef UNICODE
905 #define D3DXPreprocessShaderFromFile D3DXPreprocessShaderFromFileW
906 #else
907 #define D3DXPreprocessShaderFromFile D3DXPreprocessShaderFromFileA
908 #endif
909
910 HRESULT WINAPI
911 D3DXPreprocessShaderFromResourceA(
912 HMODULE hSrcModule,
913 LPCSTR pSrcResource,
914 CONST D3DXMACRO* pDefines,
915 LPD3DXINCLUDE pInclude,
916 LPD3DXBUFFER* ppShaderText,
917 LPD3DXBUFFER* ppErrorMsgs);
918
919 HRESULT WINAPI
920 D3DXPreprocessShaderFromResourceW(
921 HMODULE hSrcModule,
922 LPCWSTR pSrcResource,
923 CONST D3DXMACRO* pDefines,
924 LPD3DXINCLUDE pInclude,
925 LPD3DXBUFFER* ppShaderText,
926 LPD3DXBUFFER* ppErrorMsgs);
927
928 #ifdef UNICODE
929 #define D3DXPreprocessShaderFromResource D3DXPreprocessShaderFromResourceW
930 #else
931 #define D3DXPreprocessShaderFromResource D3DXPreprocessShaderFromResourceA
932 #endif
933
934 HRESULT WINAPI
935 D3DXPreprocessShader(
936 LPCSTR pSrcData,
937 UINT SrcDataSize,
938 CONST D3DXMACRO* pDefines,
939 LPD3DXINCLUDE pInclude,
940 LPD3DXBUFFER* ppShaderText,
941 LPD3DXBUFFER* ppErrorMsgs);
942
943
944 #ifdef __cplusplus
945 }
946 #endif //__cplusplus
947
948
949 //////////////////////////////////////////////////////////////////////////////
950 // Shader comment block layouts //////////////////////////////////////////////
951 //////////////////////////////////////////////////////////////////////////////
952
953 //----------------------------------------------------------------------------
954 // D3DXSHADER_CONSTANTTABLE:
955 // -------------------------
956 // Shader constant information; included as an CTAB comment block inside
957 // shaders. All offsets are BYTE offsets from start of CONSTANTTABLE struct.
958 // Entries in the table are sorted by Name in ascending order.
959 //----------------------------------------------------------------------------
960
961 typedef struct _D3DXSHADER_CONSTANTTABLE
962 {
963 DWORD Size; // sizeof(D3DXSHADER_CONSTANTTABLE)
964 DWORD Creator; // LPCSTR offset
965 DWORD Version; // shader version
966 DWORD Constants; // number of constants
967 DWORD ConstantInfo; // D3DXSHADER_CONSTANTINFO[Constants] offset
968 DWORD Flags; // flags shader was compiled with
969 DWORD Target; // LPCSTR offset
970
971 } D3DXSHADER_CONSTANTTABLE, *LPD3DXSHADER_CONSTANTTABLE;
972
973
974 typedef struct _D3DXSHADER_CONSTANTINFO
975 {
976 DWORD Name; // LPCSTR offset
977 WORD RegisterSet; // D3DXREGISTER_SET
978 WORD RegisterIndex; // register number
979 WORD RegisterCount; // number of registers
980 WORD Reserved; // reserved
981 DWORD TypeInfo; // D3DXSHADER_TYPEINFO offset
982 DWORD DefaultValue; // offset of default value
983
984 } D3DXSHADER_CONSTANTINFO, *LPD3DXSHADER_CONSTANTINFO;
985
986
987 typedef struct _D3DXSHADER_TYPEINFO
988 {
989 WORD Class; // D3DXPARAMETER_CLASS
990 WORD Type; // D3DXPARAMETER_TYPE
991 WORD Rows; // number of rows (matrices)
992 WORD Columns; // number of columns (vectors and matrices)
993 WORD Elements; // array dimension
994 WORD StructMembers; // number of struct members
995 DWORD StructMemberInfo; // D3DXSHADER_STRUCTMEMBERINFO[Members] offset
996
997 } D3DXSHADER_TYPEINFO, *LPD3DXSHADER_TYPEINFO;
998
999
1000 typedef struct _D3DXSHADER_STRUCTMEMBERINFO
1001 {
1002 DWORD Name; // LPCSTR offset
1003 DWORD TypeInfo; // D3DXSHADER_TYPEINFO offset
1004
1005 } D3DXSHADER_STRUCTMEMBERINFO, *LPD3DXSHADER_STRUCTMEMBERINFO;
1006
1007
1008
1009 #endif //__D3DX9SHADER_H__
1010
1011