=?UTF-8?Q?Rico=20Sch=C3=BCller=20?=: d3dx9: Use the original bytecode in D3DXGetShaderSamplers() instead of using a constant table.
Alexandre Julliard
julliard at winehq.org
Fri Sep 16 13:28:34 CDT 2011
Module: wine
Branch: master
Commit: 7cfdaedd3ee345bd2f1dcf8ac581fd82645decaa
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7cfdaedd3ee345bd2f1dcf8ac581fd82645decaa
Author: Rico Schüller <kgbricola at web.de>
Date: Fri Sep 16 08:38:24 2011 +0200
d3dx9: Use the original bytecode in D3DXGetShaderSamplers() instead of using a constant table.
---
dlls/d3dx9_36/shader.c | 57 ++++++++++++++++-------------------------
dlls/d3dx9_36/tests/shader.c | 53 +++++++++++++++++++++++++++++++-------
2 files changed, 65 insertions(+), 45 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 50719b2..5a0f1db 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -1273,50 +1273,40 @@ HRESULT WINAPI D3DXGetShaderConstantTable(CONST DWORD* byte_code,
HRESULT WINAPI D3DXGetShaderSamplers(CONST DWORD *byte_code, LPCSTR *samplers, UINT *count)
{
HRESULT hr;
- LPD3DXCONSTANTTABLE constant_table = NULL;
- D3DXCONSTANTTABLE_DESC constant_table_desc;
UINT i, sampler_count = 0;
+ UINT size;
+ LPCSTR data;
+ const D3DXSHADER_CONSTANTTABLE *ctab_header;
+ const D3DXSHADER_CONSTANTINFO *constant_info;
TRACE("byte_code %p, samplers %p, count %p\n", byte_code, samplers, count);
if (count) *count = 0;
- hr = D3DXGetShaderConstantTable(byte_code, &constant_table);
- if (hr != D3D_OK)
- {
- WARN("Failed to get constant table\n");
+ hr = D3DXFindShaderComment(byte_code, MAKEFOURCC('C','T','A','B'), (LPCVOID *)&data, &size);
+ if (hr != D3D_OK) return D3D_OK;
- /* no samplers found, all is fine */
- return D3D_OK;
- }
+ if (size < sizeof(D3DXSHADER_CONSTANTTABLE)) return D3D_OK;
- hr = ID3DXConstantTable_GetDesc(constant_table, &constant_table_desc);
- if (hr != D3D_OK)
- {
- WARN("Failed to get constant table desc\n");
- goto err_out;
- }
+ ctab_header = (const D3DXSHADER_CONSTANTTABLE *)data;
+ if (ctab_header->Size != sizeof(*ctab_header)) return D3D_OK;
- for (i = 0; i < constant_table_desc.Constants; ++i)
+ constant_info = (D3DXSHADER_CONSTANTINFO *)(data + ctab_header->ConstantInfo);
+ for (i = 0; i < ctab_header->Constants; i++)
{
- D3DXHANDLE handle = ID3DXConstantTable_GetConstant(constant_table, NULL, i);
- D3DXCONSTANT_DESC constant_desc;
- UINT size;
+ const D3DXSHADER_TYPEINFO *type;
- hr = ID3DXConstantTable_GetConstantDesc(constant_table, handle, &constant_desc, &size);
- if (hr != D3D_OK)
- {
- WARN("Failed to get constant desc\n");
- goto err_out;
- }
+ TRACE("name = %s\n", data + constant_info[i].Name);
+
+ type = (D3DXSHADER_TYPEINFO *)(data + constant_info[i].TypeInfo);
- if (constant_desc.Type == D3DXPT_SAMPLER
- || constant_desc.Type == D3DXPT_SAMPLER1D
- || constant_desc.Type == D3DXPT_SAMPLER2D
- || constant_desc.Type == D3DXPT_SAMPLER3D
- || constant_desc.Type == D3DXPT_SAMPLERCUBE)
+ if (type->Type == D3DXPT_SAMPLER
+ || type->Type == D3DXPT_SAMPLER1D
+ || type->Type == D3DXPT_SAMPLER2D
+ || type->Type == D3DXPT_SAMPLER3D
+ || type->Type == D3DXPT_SAMPLERCUBE)
{
- if (samplers) samplers[sampler_count] = constant_desc.Name;
+ if (samplers) samplers[sampler_count] = data + constant_info[i].Name;
++sampler_count;
}
@@ -1324,10 +1314,7 @@ HRESULT WINAPI D3DXGetShaderSamplers(CONST DWORD *byte_code, LPCSTR *samplers, U
TRACE("Found %u samplers\n", sampler_count);
-err_out:
-
if (count) *count = sampler_count;
- if (constant_table) ID3DXConstantTable_Release(constant_table);
- return hr;
+ return D3D_OK;
}
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index 0a1b8bf..9220e28 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -768,6 +768,7 @@ static const DWORD get_shader_samplers_blob[] =
static void test_get_shader_samplers(void)
{
LPCSTR samplers[16] = {NULL}; /* maximum number of sampler registers v/ps 3.0 = 16 */
+ LPCSTR sampler_orig;
UINT count = 2;
HRESULT hr;
@@ -785,11 +786,22 @@ static void test_get_shader_samplers(void)
hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, NULL);
ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
- ok(!strcmp(samplers[0], "s"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[0], "s");
- ok(!strcmp(samplers[1], "s1D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[1], "s1D");
- ok(!strcmp(samplers[2], "s2D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[2], "s2D");
- ok(!strcmp(samplers[3], "s3D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[3], "s3D");
- ok(!strcmp(samplers[4], "scube"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[4], "scube");
+ /* check that sampler points to shader blob */
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
+ ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
+ ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
+ ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
+ ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
+ ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
+
ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
/* reset samplers */
@@ -804,12 +816,33 @@ static void test_get_shader_samplers(void)
ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
- ok(!strcmp(samplers[0], "s"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[0], "s");
- ok(!strcmp(samplers[1], "s1D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[1], "s1D");
- ok(!strcmp(samplers[2], "s2D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[2], "s2D");
- ok(!strcmp(samplers[3], "s3D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[3], "s3D");
- ok(!strcmp(samplers[4], "scube"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[4], "scube");
+ /* check that sampler points to shader blob */
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
+ ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
+ ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
+ ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
+ ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
+
+ sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
+ ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
+
ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
+
+ /* check without ctab */
+ hr = D3DXGetShaderSamplers(simple_vs, samplers, &count);
+ ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
+ ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
+
+ /* check invalid ctab */
+ hr = D3DXGetShaderSamplers(shader_with_invalid_ctab, samplers, &count);
+ ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
+ ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
}
START_TEST(shader)
More information about the wine-cvs
mailing list