[PATCH 1/5] d3dx9_36: Implemented ID3DXConstantTableImpl_SetFloatArray and ID3DXConstantTable_SetFloat (Try 2)
Travis Athougies
iammisc at gmail.com
Wed Jan 19 19:10:09 CST 2011
Changes from last patch:
- Includes test
- Diff'ed from latest wine git
---
dlls/d3dx9_36/shader.c | 44 +++++++++++++++++++++++++++++++++++++-------
1 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 41feecf..47dc949 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -630,6 +630,11 @@ static inline ID3DXConstantTableImpl *impl_from_ID3DXConstantTable(ID3DXConstant
return CONTAINING_RECORD(iface, ID3DXConstantTableImpl, ID3DXConstantTable_iface);
}
+static inline int is_vertex_shader(DWORD version)
+{
+ return (version & 0xFFFF0000) == 0xFFFE0000;
+}
+
/*** IUnknown methods ***/
static HRESULT WINAPI ID3DXConstantTableImpl_QueryInterface(ID3DXConstantTable* iface, REFIID riid, void** ppvObject)
{
@@ -862,11 +867,7 @@ static HRESULT WINAPI ID3DXConstantTableImpl_SetIntArray(ID3DXConstantTable* ifa
static HRESULT WINAPI ID3DXConstantTableImpl_SetFloat(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
D3DXHANDLE constant, FLOAT f)
{
- ID3DXConstantTableImpl *This = impl_from_ID3DXConstantTable(iface);
-
- FIXME("(%p)->(%p, %p, %f): stub\n", This, device, constant, f);
-
- return E_NOTIMPL;
+ return ID3DXConstantTable_SetFloatArray(iface, device, constant, &f, 1);
}
static HRESULT WINAPI ID3DXConstantTableImpl_SetFloatArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
@@ -874,9 +875,38 @@ static HRESULT WINAPI ID3DXConstantTableImpl_SetFloatArray(ID3DXConstantTable* i
{
ID3DXConstantTableImpl *This = impl_from_ID3DXConstantTable(iface);
- FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, f, count);
+ D3DXCONSTANT_DESC desc;
+ HRESULT hr;
+ UINT i, desc_count = 1;
+ float row[4] = {0.0f, 0.0f, 0.0f, 0.0f};
- return E_NOTIMPL;
+
+ hr = ID3DXConstantTable_GetConstantDesc(iface, constant, &desc, &desc_count);
+ if (FAILED(hr))
+ {
+ TRACE("ID3DXConstantTable_GetConstantDesc failed: %08x", hr);
+ return D3DERR_INVALIDCALL;
+ }
+
+ switch (desc.RegisterSet)
+ {
+ case D3DXRS_FLOAT4:
+ for (i = 0; i < count; i++)
+ {
+ /* We need the for loop since each IDirect3DDevice9_Set*ShaderConstantF expects a float4 */
+ row[0] = f[i];
+ if (is_vertex_shader(This->desc.Version))
+ IDirect3DDevice9_SetVertexShaderConstantF(device, desc.RegisterIndex + i, row, 1);
+ else
+ IDirect3DDevice9_SetPixelShaderConstantF(device, desc.RegisterIndex + i, row, 1);
+ }
+ break;
+ default:
+ FIXME("Handle other register sets\n");
+ return E_NOTIMPL;
+ }
+
+ return D3D_OK;
}
static HRESULT WINAPI ID3DXConstantTableImpl_SetVector(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device,
--
1.7.0.4
More information about the wine-patches
mailing list