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