From aaac25dc67a1b2dd47144102dd0c38d79df8a8dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Tue, 21 Aug 2012 14:52:16 +0200 Subject: [PATCH] d3dx9: ID3DXConstantTable::SetFloat shouldn't change the value of matrix and vector constants. --- dlls/d3dx9_36/shader.c | 3 +++ dlls/d3dx9_36/tests/shader.c | 28 +++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c index d5d5018c391..33e3aeb2977 100644 --- a/dlls/d3dx9_36/shader.c +++ b/dlls/d3dx9_36/shader.c @@ -873,6 +873,9 @@ static HRESULT set_scalar_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev return D3DERR_INVALIDCALL; } + if (desc.Class != D3DXPC_SCALAR) + return D3D_OK; + switch (desc.RegisterSet) { case D3DXRS_FLOAT4: diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c index 12725f29bca..2ecb8020a88 100644 --- a/dlls/d3dx9_36/tests/shader.c +++ b/dlls/d3dx9_36/tests/shader.c @@ -623,7 +623,7 @@ static void test_setting_basic_table(IDirect3DDevice9 *device) out[0], out[1], out[2], out[3], f); IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1); - ok(memcmp(out, (void*)&f4, sizeof(f4)) == 0, + ok(memcmp(out, &f4, sizeof(f4)) == 0, "The variable f4 was not set correctly, out={%f, %f, %f, %f}, should be {%f, %f, %f, %f}\n", out[0], out[1], out[2], out[3], f4.x, f4.y, f4.z, f4.w); @@ -649,6 +649,7 @@ static void test_setting_basic_table(IDirect3DDevice9 *device) /* Clear registers */ memset(out, 0, sizeof(out)); IDirect3DDevice9_SetVertexShaderConstantF(device, 0, out, 4); + IDirect3DDevice9_SetVertexShaderConstantF(device, 7, out, 1); /* SetVector shouldn't change the value of a matrix constant */ res = ID3DXConstantTable_SetVector(ctable, device, "mvp", &f4); @@ -667,6 +668,31 @@ static void test_setting_basic_table(IDirect3DDevice9 *device) out[8], out[9], out[10], out[11], out[12], out[13], out[14], out[15]); + res = ID3DXConstantTable_SetFloat(ctable, device, "mvp", f); + ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable mvp: 0x%08x\n", res); + + IDirect3DDevice9_GetVertexShaderConstantF(device, 0, out, 4); + ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f + && out[4] == 0.0f && out[5] == 0.0f && out[6] == 0.0f && out[7] == 0.0f + && out[8] == 0.0f && out[9] == 0.0f && out[10] == 0.0f && out[11] == 0.0f + && out[12] == 0.0f && out[13] == 0.0f && out[14] == 0.0f && out[15] == 0.0f, + "The variable mvp was not set correctly by ID3DXConstantTable_SetFloat, " + "got {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f %f; %f, %f, %f, %f}, " + "should be all 0.0f\n", + out[0], out[1], out[2], out[3], + out[4], out[5], out[6], out[7], + out[8], out[9], out[10], out[11], + out[12], out[13], out[14], out[15]); + + res = ID3DXConstantTable_SetFloat(ctable, device, "f4", f); + ok(res == D3D_OK, "ID3DXConstantTable_SetFloat failed on variable f4: 0x%08x\n", res); + + IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 1); + ok(out[0] == 0.0f && out[1] == 0.0f && out[2] == 0.0f && out[3] == 0.0f, + "The variable f4 was not set correctly by ID3DXConstantTable_SetFloat, " + "got {%f, %f, %f, %f}, should be all 0.0f\n", + out[0], out[1], out[2], out[3]); + refcnt = ID3DXConstantTable_Release(ctable); ok(refcnt == 0, "The constant table reference count was %u, should be 0\n", refcnt); }