Matteo Bruni : d3dx9: Handle D3DXCONSTTABLE_LARGEADDRESSAWARE flag.
Alexandre Julliard
julliard at winehq.org
Fri Feb 18 15:15:00 CST 2022
Module: wine
Branch: master
Commit: 67f6073b9e299303a63fc4a7ce7640a9b9c8d693
URL: https://source.winehq.org/git/wine.git/?a=commit;h=67f6073b9e299303a63fc4a7ce7640a9b9c8d693
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Fri Feb 18 11:14:29 2022 +0100
d3dx9: Handle D3DXCONSTTABLE_LARGEADDRESSAWARE flag.
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3dx9_36/shader.c | 16 ++++++++++++----
dlls/d3dx9_36/tests/shader.c | 28 ++++++++++++++++++++++++++++
2 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index d5b58222ca2..2241455898e 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -681,11 +681,13 @@ HRESULT WINAPI D3DXPreprocessShaderFromResourceW(HMODULE module, const WCHAR *re
}
-struct ID3DXConstantTableImpl {
+struct ID3DXConstantTableImpl
+{
ID3DXConstantTable ID3DXConstantTable_iface;
LONG ref;
char *ctab;
DWORD size;
+ DWORD flags;
D3DXCONSTANTTABLE_DESC desc;
struct ctab_constant *constants;
};
@@ -860,6 +862,9 @@ static inline struct ctab_constant *get_valid_constant(struct ID3DXConstantTable
if (c) return c;
}
+ if (table->flags & D3DXCONSTTABLE_LARGEADDRESSAWARE)
+ return NULL;
+
return get_constant_by_name(table, NULL, handle);
}
@@ -1959,9 +1964,10 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(const DWORD *byte_code, DWORD flags,
const D3DXSHADER_CONSTANTINFO *constant_info;
DWORD i;
- TRACE("byte_code %p, flags %x, constant_table %p\n", byte_code, flags, constant_table);
+ TRACE("byte_code %p, flags %#x, constant_table %p.\n", byte_code, flags, constant_table);
- if (constant_table) *constant_table = NULL;
+ if (constant_table)
+ *constant_table = NULL;
if (!byte_code || !constant_table)
{
@@ -1975,7 +1981,8 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(const DWORD *byte_code, DWORD flags,
return D3D_OK;
}
- if (flags) FIXME("Flags (%#x) are not handled, yet!\n", flags);
+ if (flags & ~D3DXCONSTTABLE_LARGEADDRESSAWARE)
+ FIXME("Flags %#x not handled.\n", flags);
hr = D3DXFindShaderComment(byte_code, MAKEFOURCC('C','T','A','B'), &data, &size);
if (hr != D3D_OK)
@@ -2014,6 +2021,7 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(const DWORD *byte_code, DWORD flags,
object->size = size;
memcpy(object->ctab, data, object->size);
+ object->flags = flags;
object->desc.Creator = ctab_header->Creator ? object->ctab + ctab_header->Creator : NULL;
object->desc.Version = ctab_header->Version;
object->desc.Constants = ctab_header->Constants;
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index a698afcb53b..fe3dfde9001 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -556,6 +556,34 @@ static void test_get_shader_constant_table_ex(void)
ID3DXConstantTable_Release(constant_table);
+ hr = D3DXGetShaderConstantTableEx(shader_with_ctab_constants, D3DXCONSTTABLE_LARGEADDRESSAWARE, &constant_table);
+ ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr);
+ ok(!!constant_table, "Unexpected constant table %p.\n", constant_table);
+
+ hr = ID3DXConstantTable_GetDesc(constant_table, &desc);
+ ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr);
+ ok(!strcmp(desc.Creator, "Wine project"), "Unexpected Creator %s.\n", debugstr_a(desc.Creator));
+ ok(desc.Version == D3DVS_VERSION(3, 0), "Unexpected Version %#x.\n", desc.Version);
+ ok(desc.Constants == 3, "Unexpected Constants %u.\n", desc.Constants);
+
+ constant = ID3DXConstantTable_GetConstant(constant_table, NULL, 0);
+ ok(!!constant, "No constant found.\n");
+ hr = ID3DXConstantTable_GetConstantDesc(constant_table, constant, &constant_desc, &nb);
+ ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr);
+ ok(!strcmp(constant_desc.Name, "Constant1"), "Unexpected Name %s.\n", debugstr_a(constant_desc.Name));
+ ok(constant_desc.Class == D3DXPC_VECTOR, "Unexpected Class %u.\n", constant_desc.Class);
+ ok(constant_desc.Type == D3DXPT_FLOAT, "Unexpected Type %u.\n", constant_desc.Type);
+ ok(constant_desc.Rows == 1, "Unexpected Rows %u.\n", constant_desc.Rows);
+ ok(constant_desc.Columns == 4, "Unexpected Columns %u.\n", constant_desc.Columns);
+
+ if (0)
+ {
+ /* Native d3dx crashes with this. */
+ hr = ID3DXConstantTable_GetConstantDesc(constant_table, "Constant3", &constant_desc, &nb);
+ }
+
+ ID3DXConstantTable_Release(constant_table);
+
hr = D3DXGetShaderConstantTableEx(fx_shader_with_ctab, 0, &constant_table);
ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
ok(!constant_table, "D3DXGetShaderConstantTableEx() returned a non-NULL constant table.\n");
More information about the wine-cvs
mailing list