2 * Copyright 2008 Luis Busquets
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "wine/port.h"
21 #include "wine/debug.h"
22 #include "wine/unicode.h"
26 #include "d3dx9shader.h"
27 #include "d3dx9_36_private.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(d3dx
);
31 LPCSTR WINAPI
D3DXGetPixelShaderProfile(LPDIRECT3DDEVICE9 device
)
35 TRACE("device %p\n", device
);
37 if (!device
) return NULL
;
39 IDirect3DDevice9_GetDeviceCaps(device
,&caps
);
41 switch (caps
.PixelShaderVersion
)
43 case D3DPS_VERSION(1, 1):
46 case D3DPS_VERSION(1, 2):
49 case D3DPS_VERSION(1, 3):
52 case D3DPS_VERSION(1, 4):
55 case D3DPS_VERSION(2, 0):
56 if ((caps
.PS20Caps
.NumTemps
>=22) &&
57 (caps
.PS20Caps
.Caps
&D3DPS20CAPS_ARBITRARYSWIZZLE
) &&
58 (caps
.PS20Caps
.Caps
&D3DPS20CAPS_GRADIENTINSTRUCTIONS
) &&
59 (caps
.PS20Caps
.Caps
&D3DPS20CAPS_PREDICATION
) &&
60 (caps
.PS20Caps
.Caps
&D3DPS20CAPS_NODEPENDENTREADLIMIT
) &&
61 (caps
.PS20Caps
.Caps
&D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT
))
65 if ((caps
.PS20Caps
.NumTemps
>=32) &&
66 (caps
.PS20Caps
.Caps
&D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT
))
72 case D3DPS_VERSION(3, 0):
79 UINT WINAPI
D3DXGetShaderSize(const DWORD
*byte_code
)
81 const DWORD
*ptr
= byte_code
;
83 TRACE("byte_code %p\n", byte_code
);
87 /* Look for the END token, skipping the VERSION token */
88 while (*++ptr
!= D3DSIO_END
)
91 if ((*ptr
& D3DSI_OPCODE_MASK
) == D3DSIO_COMMENT
)
93 ptr
+= ((*ptr
& D3DSI_COMMENTSIZE_MASK
) >> D3DSI_COMMENTSIZE_SHIFT
);
98 /* Return the shader size in bytes */
99 return (ptr
- byte_code
) * sizeof(*ptr
);
102 DWORD WINAPI
D3DXGetShaderVersion(const DWORD
*byte_code
)
104 TRACE("byte_code %p\n", byte_code
);
106 return byte_code
? *byte_code
: 0;
109 LPCSTR WINAPI
D3DXGetVertexShaderProfile(LPDIRECT3DDEVICE9 device
)
113 TRACE("device %p\n", device
);
115 if (!device
) return NULL
;
117 IDirect3DDevice9_GetDeviceCaps(device
,&caps
);
119 switch (caps
.VertexShaderVersion
)
121 case D3DVS_VERSION(1, 1):
123 case D3DVS_VERSION(2, 0):
124 if ((caps
.VS20Caps
.NumTemps
>=13) &&
125 (caps
.VS20Caps
.DynamicFlowControlDepth
==24) &&
126 (caps
.VS20Caps
.Caps
&D3DPS20CAPS_PREDICATION
))
131 case D3DVS_VERSION(3, 0):
138 HRESULT WINAPI
D3DXAssembleShader(LPCSTR data
,
140 CONST D3DXMACRO
* defines
,
141 LPD3DXINCLUDE include
,
143 LPD3DXBUFFER
* shader
,
144 LPD3DXBUFFER
* error_messages
)
146 FIXME("(%p, %d, %p, %p, %x, %p, %p): stub\n", data
, data_len
, defines
, include
, flags
, shader
, error_messages
);
147 return D3DERR_INVALIDCALL
;
150 HRESULT WINAPI
D3DXAssembleShaderFromFileA(LPCSTR filename
,
151 CONST D3DXMACRO
* defines
,
152 LPD3DXINCLUDE include
,
154 LPD3DXBUFFER
* shader
,
155 LPD3DXBUFFER
* error_messages
)
157 LPWSTR filename_w
= NULL
;
161 if (!filename
) return D3DXERR_INVALIDDATA
;
163 len
= MultiByteToWideChar(CP_ACP
, 0, filename
, -1, NULL
, 0);
164 filename_w
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
165 if (!filename_w
) return E_OUTOFMEMORY
;
166 MultiByteToWideChar(CP_ACP
, 0, filename
, -1, filename_w
, len
);
168 ret
= D3DXAssembleShaderFromFileW(filename_w
, defines
, include
, flags
, shader
, error_messages
);
170 HeapFree(GetProcessHeap(), 0, filename_w
);
174 HRESULT WINAPI
D3DXAssembleShaderFromFileW(LPCWSTR filename
,
175 CONST D3DXMACRO
* defines
,
176 LPD3DXINCLUDE include
,
178 LPD3DXBUFFER
* shader
,
179 LPD3DXBUFFER
* error_messages
)
181 FIXME("(%s, %p, %p, %x, %p, %p): stub\n", debugstr_w(filename
), defines
, include
, flags
, shader
, error_messages
);
182 return D3DERR_INVALIDCALL
;
185 HRESULT WINAPI
D3DXAssembleShaderFromResourceA(HMODULE module
,
187 CONST D3DXMACRO
* defines
,
188 LPD3DXINCLUDE include
,
190 LPD3DXBUFFER
* shader
,
191 LPD3DXBUFFER
* error_messages
)
197 if (!(res
= FindResourceA(module
, resource
, (LPCSTR
)RT_RCDATA
)))
198 return D3DXERR_INVALIDDATA
;
199 if (FAILED(load_resource_into_memory(module
, res
, (LPVOID
*)&buffer
, &len
)))
200 return D3DXERR_INVALIDDATA
;
201 return D3DXAssembleShader(buffer
, len
, defines
, include
, flags
,
202 shader
, error_messages
);
205 HRESULT WINAPI
D3DXAssembleShaderFromResourceW(HMODULE module
,
207 CONST D3DXMACRO
* defines
,
208 LPD3DXINCLUDE include
,
210 LPD3DXBUFFER
* shader
,
211 LPD3DXBUFFER
* error_messages
)
217 if (!(res
= FindResourceW(module
, resource
, (LPCWSTR
)RT_RCDATA
)))
218 return D3DXERR_INVALIDDATA
;
219 if (FAILED(load_resource_into_memory(module
, res
, (LPVOID
*)&buffer
, &len
)))
220 return D3DXERR_INVALIDDATA
;
221 return D3DXAssembleShader(buffer
, len
, defines
, include
, flags
,
222 shader
, error_messages
);
225 HRESULT WINAPI
D3DXCompileShader(LPCSTR pSrcData
,
227 CONST D3DXMACRO
* pDefines
,
228 LPD3DXINCLUDE pInclude
,
229 LPCSTR pFunctionName
,
232 LPD3DXBUFFER
* ppShader
,
233 LPD3DXBUFFER
* ppErrorMsgs
,
234 LPD3DXCONSTANTTABLE
* ppConstantTable
)
236 FIXME("(%p, %d, %p, %p, %p, %p, %d, %p, %p, %p): stub\n",
237 pSrcData
, srcDataLen
, pDefines
, pInclude
, pFunctionName
,
238 pProfile
, Flags
, ppShader
, ppErrorMsgs
, ppConstantTable
);
239 return D3DERR_INVALIDCALL
;
242 static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl
;
244 typedef struct ID3DXConstantTableImpl
{
245 const ID3DXConstantTableVtbl
*lpVtbl
;
247 } ID3DXConstantTableImpl
;
249 /*** IUnknown methods ***/
250 static HRESULT WINAPI
ID3DXConstantTableImpl_QueryInterface(ID3DXConstantTable
* iface
, REFIID riid
, void** ppvObject
)
252 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
254 TRACE("(%p)->(%s, %p)\n", This
, debugstr_guid(riid
), ppvObject
);
256 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
257 IsEqualGUID(riid
, &IID_ID3DXConstantTable
))
259 ID3DXConstantTable_AddRef(iface
);
264 ERR("Interface %s not found\n", debugstr_guid(riid
));
266 return E_NOINTERFACE
;
269 static ULONG WINAPI
ID3DXConstantTableImpl_AddRef(ID3DXConstantTable
* iface
)
271 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
273 TRACE("(%p)->(): AddRef from %d\n", This
, This
->ref
);
275 return InterlockedIncrement(&This
->ref
);
278 static ULONG WINAPI
ID3DXConstantTableImpl_Release(ID3DXConstantTable
* iface
)
280 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
281 ULONG ref
= InterlockedDecrement(&This
->ref
);
283 TRACE("(%p)->(): Release from %d\n", This
, ref
+ 1);
286 HeapFree(GetProcessHeap(), 0, This
);
291 /*** ID3DXBuffer methods ***/
292 static LPVOID WINAPI
ID3DXConstantTableImpl_GetBufferPointer(ID3DXConstantTable
* iface
)
294 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
296 FIXME("(%p)->(): stub\n", This
);
301 static DWORD WINAPI
ID3DXConstantTableImpl_GetBufferSize(ID3DXConstantTable
* iface
)
303 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
305 FIXME("(%p)->(): stub\n", This
);
310 /*** ID3DXConstantTable methods ***/
311 static HRESULT WINAPI
ID3DXConstantTableImpl_GetDesc(ID3DXConstantTable
* iface
, D3DXCONSTANTTABLE_DESC
*desc
)
313 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
315 FIXME("(%p)->(%p): stub\n", This
, desc
);
320 static HRESULT WINAPI
ID3DXConstantTableImpl_GetConstantDesc(ID3DXConstantTable
* iface
, D3DXHANDLE constant
,
321 D3DXCONSTANT_DESC
*desc
, UINT
*count
)
323 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
325 FIXME("(%p)->(%p, %p, %p): stub\n", This
, constant
, desc
, count
);
330 static D3DXHANDLE WINAPI
ID3DXConstantTableImpl_GetConstant(ID3DXConstantTable
* iface
, D3DXHANDLE constant
, UINT index
)
332 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
334 FIXME("(%p)->(%p, %d): stub\n", This
, constant
, index
);
339 static D3DXHANDLE WINAPI
ID3DXConstantTableImpl_GetConstantByName(ID3DXConstantTable
* iface
, D3DXHANDLE constant
, LPCSTR name
)
341 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
343 FIXME("(%p)->(%p, %s): stub\n", This
, constant
, name
);
348 static D3DXHANDLE WINAPI
ID3DXConstantTableImpl_GetConstantByElement(ID3DXConstantTable
* iface
, D3DXHANDLE constant
, UINT index
)
350 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
352 FIXME("(%p)->(%p, %d): stub\n", This
, constant
, index
);
357 static HRESULT WINAPI
ID3DXConstantTableImpl_SetDefaults(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
)
359 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
361 FIXME("(%p)->(%p): stub\n", This
, device
);
366 static HRESULT WINAPI
ID3DXConstantTableImpl_SetValue(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
367 D3DXHANDLE constant
, LPCVOID data
, UINT bytes
)
369 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
371 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, data
, bytes
);
376 static HRESULT WINAPI
ID3DXConstantTableImpl_SetBool(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
377 D3DXHANDLE constant
, BOOL b
)
379 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
381 FIXME("(%p)->(%p, %p, %d): stub\n", This
, device
, constant
, b
);
386 static HRESULT WINAPI
ID3DXConstantTableImpl_SetBoolArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
387 D3DXHANDLE constant
, CONST BOOL
* b
, UINT count
)
389 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
391 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, b
, count
);
396 static HRESULT WINAPI
ID3DXConstantTableImpl_SetInt(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
, D3DXHANDLE constant
, INT n
)
398 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
400 FIXME("(%p)->(%p, %p, %d): stub\n", This
, device
, constant
, n
);
405 static HRESULT WINAPI
ID3DXConstantTableImpl_SetIntArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
406 D3DXHANDLE constant
, CONST INT
* n
, UINT count
)
408 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
410 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, n
, count
);
415 static HRESULT WINAPI
ID3DXConstantTableImpl_SetFloat(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
416 D3DXHANDLE constant
, FLOAT f
)
418 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
420 FIXME("(%p)->(%p, %p, %f): stub\n", This
, device
, constant
, f
);
425 static HRESULT WINAPI
ID3DXConstantTableImpl_SetFloatArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
426 D3DXHANDLE constant
, CONST FLOAT
* f
, UINT count
)
428 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
430 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, f
, count
);
435 static HRESULT WINAPI
ID3DXConstantTableImpl_SetVector(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
436 D3DXHANDLE constant
, CONST D3DXVECTOR4
* vector
)
438 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
440 FIXME("(%p)->(%p, %p, %p): stub\n", This
, device
, constant
, vector
);
445 static HRESULT WINAPI
ID3DXConstantTableImpl_SetVectorArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
446 D3DXHANDLE constant
, CONST D3DXVECTOR4
* vector
, UINT count
)
448 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
450 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, vector
, count
);
455 static HRESULT WINAPI
ID3DXConstantTableImpl_SetMatrix(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
456 D3DXHANDLE constant
, CONST D3DXMATRIX
* matrix
)
458 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
460 FIXME("(%p)->(%p, %p, %p): stub\n", This
, device
, constant
, matrix
);
465 static HRESULT WINAPI
ID3DXConstantTableImpl_SetMatrixArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
466 D3DXHANDLE constant
, CONST D3DXMATRIX
* matrix
, UINT count
)
468 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
470 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, matrix
, count
);
475 static HRESULT WINAPI
ID3DXConstantTableImpl_SetMatrixPointerArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
476 D3DXHANDLE constant
, CONST D3DXMATRIX
** matrix
, UINT count
)
478 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
480 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, matrix
, count
);
485 static HRESULT WINAPI
ID3DXConstantTableImpl_SetMatrixTranspose(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
486 D3DXHANDLE constant
, CONST D3DXMATRIX
* matrix
)
488 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
490 FIXME("(%p)->(%p, %p, %p): stub\n", This
, device
, constant
, matrix
);
495 static HRESULT WINAPI
ID3DXConstantTableImpl_SetMatrixTransposeArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
496 D3DXHANDLE constant
, CONST D3DXMATRIX
* matrix
, UINT count
)
498 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
500 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, matrix
, count
);
505 static HRESULT WINAPI
ID3DXConstantTableImpl_SetMatrixTransposePointerArray(ID3DXConstantTable
* iface
, LPDIRECT3DDEVICE9 device
,
506 D3DXHANDLE constant
, CONST D3DXMATRIX
** matrix
, UINT count
)
508 ID3DXConstantTableImpl
*This
= (ID3DXConstantTableImpl
*)iface
;
510 FIXME("(%p)->(%p, %p, %p, %d): stub\n", This
, device
, constant
, matrix
, count
);
515 static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl
=
517 /*** IUnknown methods ***/
518 ID3DXConstantTableImpl_QueryInterface
,
519 ID3DXConstantTableImpl_AddRef
,
520 ID3DXConstantTableImpl_Release
,
521 /*** ID3DXBuffer methods ***/
522 ID3DXConstantTableImpl_GetBufferPointer
,
523 ID3DXConstantTableImpl_GetBufferSize
,
524 /*** ID3DXConstantTable methods ***/
525 ID3DXConstantTableImpl_GetDesc
,
526 ID3DXConstantTableImpl_GetConstantDesc
,
527 ID3DXConstantTableImpl_GetConstant
,
528 ID3DXConstantTableImpl_GetConstantByName
,
529 ID3DXConstantTableImpl_GetConstantByElement
,
530 ID3DXConstantTableImpl_SetDefaults
,
531 ID3DXConstantTableImpl_SetValue
,
532 ID3DXConstantTableImpl_SetBool
,
533 ID3DXConstantTableImpl_SetBoolArray
,
534 ID3DXConstantTableImpl_SetInt
,
535 ID3DXConstantTableImpl_SetIntArray
,
536 ID3DXConstantTableImpl_SetFloat
,
537 ID3DXConstantTableImpl_SetFloatArray
,
538 ID3DXConstantTableImpl_SetVector
,
539 ID3DXConstantTableImpl_SetVectorArray
,
540 ID3DXConstantTableImpl_SetMatrix
,
541 ID3DXConstantTableImpl_SetMatrixArray
,
542 ID3DXConstantTableImpl_SetMatrixPointerArray
,
543 ID3DXConstantTableImpl_SetMatrixTranspose
,
544 ID3DXConstantTableImpl_SetMatrixTransposeArray
,
545 ID3DXConstantTableImpl_SetMatrixTransposePointerArray
548 HRESULT WINAPI
D3DXGetShaderConstantTableEx(CONST DWORD
* pFunction
,
550 LPD3DXCONSTANTTABLE
* ppConstantTable
)
552 ID3DXConstantTableImpl
* object
;
554 FIXME("(%p, %x, %p): semi-stub\n", pFunction
, flags
, ppConstantTable
);
556 if (!pFunction
|| !ppConstantTable
)
557 return D3DERR_INVALIDCALL
;
559 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(ID3DXConstantTableImpl
));
562 ERR("Out of memory\n");
563 return E_OUTOFMEMORY
;
566 object
->lpVtbl
= &ID3DXConstantTable_Vtbl
;
569 *ppConstantTable
= (LPD3DXCONSTANTTABLE
)object
;
574 HRESULT WINAPI
D3DXGetShaderConstantTable(CONST DWORD
* pFunction
,
575 LPD3DXCONSTANTTABLE
* ppConstantTable
)
577 TRACE("(%p, %p): Forwarded to D3DXGetShaderConstantTableEx\n", pFunction
, ppConstantTable
);
579 return D3DXGetShaderConstantTableEx(pFunction
, 0, ppConstantTable
);