[PATCH 1/5] d3dcompiler/tests: Add some tests for uniform tables.

Zebediah Figura z.figura12 at gmail.com
Thu Mar 12 22:20:12 CDT 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/tests/hlsl_d3d9.c | 112 ++++++++++++++++++++++++++
 1 file changed, 112 insertions(+)

diff --git a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
index 7f391833f39..0e50084fb91 100644
--- a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
+++ b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
@@ -730,6 +730,117 @@ static void test_array_dimensions(void)
     release_test_context(&test_context);
 }
 
+static void check_constant_desc(const char *prefix, const D3DXCONSTANT_DESC *desc, const D3DXCONSTANT_DESC *expect)
+{
+    ok(!strcmp(desc->Name, expect->Name), "%s: got Name %s.\n", prefix, debugstr_a(desc->Name));
+    ok(desc->RegisterSet == expect->RegisterSet, "%s: got RegisterSet %#x.\n", prefix, desc->RegisterSet);
+    ok(desc->RegisterCount == expect->RegisterCount, "%s: got RegisterCount %u.\n", prefix, desc->RegisterCount);
+    ok(desc->Class == expect->Class, "%s: got Class %#x.\n", prefix, desc->Class);
+    ok(desc->Type == expect->Type, "%s: got Type %#x.\n", prefix, desc->Type);
+    ok(desc->Rows == expect->Rows, "%s: got Rows %u.\n", prefix, desc->Rows);
+    ok(desc->Columns == expect->Columns, "%s: got Columns %u.\n", prefix, desc->Columns);
+    ok(desc->Elements == expect->Elements, "%s: got Elements %u.\n", prefix, desc->Elements);
+    ok(desc->StructMembers == expect->StructMembers, "%s: got StructMembers %u.\n", prefix, desc->StructMembers);
+    ok(desc->Bytes == expect->Bytes, "%s: got Bytes %u.\n", prefix, desc->Bytes);
+    ok(!desc->DefaultValue, "%s: got DefaultValue %p.\n", prefix, desc->DefaultValue);
+}
+
+static void test_constant_table(void)
+{
+    static const char *source =
+        "uniform float4 a;\n"
+        "uniform float b;\n"
+        "uniform float unused;\n"
+        "uniform float3x1 c;\n"
+        "uniform row_major float3x1 d;\n"
+        "uniform uint e;\n"
+        "uniform struct\n"
+        "{\n"
+        "    float2x2 a;\n"
+        "    float b;\n"
+        "    float c;\n"
+        "} f;\n"
+        "uniform float g[5];\n"
+        "float4 main(uniform float4 h) : COLOR\n"
+        "{\n"
+        "    return a + b + c._31 + d._31 + f.c + g[e] + h;\n"
+        "}";
+
+    D3DXCONSTANTTABLE_DESC table_desc;
+    ID3DXConstantTable *constants;
+    D3DXHANDLE handle, field;
+    D3DXCONSTANT_DESC desc;
+    ID3D10Blob *ps_code;
+    unsigned int i, j;
+    HRESULT hr;
+    UINT count;
+
+    static const D3DXCONSTANT_DESC expect_constants[] =
+    {
+        {"$h", D3DXRS_FLOAT4, 0, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16},
+        {"a", D3DXRS_FLOAT4, 0, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16},
+        {"b", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4},
+        {"c", D3DXRS_FLOAT4, 0, 1, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 3, 1, 1, 0, 12},
+        {"d", D3DXRS_FLOAT4, 0, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12},
+        {"e", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_INT, 1, 1, 1, 0, 4},
+        {"f", D3DXRS_FLOAT4, 0, 4, D3DXPC_STRUCT, D3DXPT_VOID, 1, 6, 1, 3, 24},
+        {"g", D3DXRS_FLOAT4, 0, 5, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 5, 0, 20},
+    };
+
+    static const D3DXCONSTANT_DESC expect_fields[] =
+    {
+        {"a", D3DXRS_FLOAT4, 0, 2, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 2, 2, 1, 0, 16},
+        {"b", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4},
+        {"c", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0, 4},
+    };
+
+    todo_wine ps_code = compile_shader(source, "ps_2_0");
+    if (!ps_code)
+        return;
+
+    hr = pD3DXGetShaderConstantTable(ID3D10Blob_GetBufferPointer(ps_code), &constants);
+    ok(hr == D3D_OK, "Got hr %#x.\n", hr);
+
+    hr = ID3DXConstantTable_GetDesc(constants, &table_desc);
+    ok(hr == D3D_OK, "Got hr %#x.\n", hr);
+    ok(table_desc.Version == D3DPS_VERSION(2, 0), "Got Version %#x.\n", table_desc.Version);
+    ok(table_desc.Constants == 8, "Got %u constants.\n", table_desc.Constants);
+
+    for (i = 0; i < table_desc.Constants; ++i)
+    {
+        char prefix[30];
+
+        handle = ID3DXConstantTable_GetConstant(constants, NULL, i);
+        ok(!!handle, "Failed to get constant.\n");
+        memset(&desc, 0xcc, sizeof(desc));
+        count = 1;
+        hr = ID3DXConstantTable_GetConstantDesc(constants, handle, &desc, &count);
+        ok(hr == D3D_OK, "Got hr %#x.\n", hr);
+        ok(count == 1, "Got count %u.\n", count);
+        sprintf(prefix, "Test %u", i);
+        check_constant_desc(prefix, &desc, &expect_constants[i]);
+
+        if (!strcmp(desc.Name, "f"))
+        {
+            for (j = 0; j < ARRAY_SIZE(expect_fields); ++j)
+            {
+                field = ID3DXConstantTable_GetConstant(constants, handle, j);
+                ok(!!field, "Failed to get constant.\n");
+                memset(&desc, 0xcc, sizeof(desc));
+                count = 1;
+                hr = ID3DXConstantTable_GetConstantDesc(constants, field, &desc, &count);
+                ok(hr == D3D_OK, "Got hr %#x.\n", hr);
+                ok(count == 1, "Got count %u.\n", count);
+                sprintf(prefix, "Test %u, %u", i, j);
+                check_constant_desc(prefix, &desc, &expect_fields[j]);
+            }
+        }
+    }
+
+    ID3DXConstantTable_Release(constants);
+    ID3D10Blob_Release(ps_code);
+}
+
 static void test_fail(void)
 {
     static const char *tests[] =
@@ -874,5 +985,6 @@ START_TEST(hlsl_d3d9)
     test_comma();
     test_return();
     test_array_dimensions();
+    test_constant_table();
     test_fail();
 }
-- 
2.25.1




More information about the wine-devel mailing list