[PATCH] d3dx9/tests: Add some tests for constant descriptions in texture shaders.

Nikolay Sivov nsivov at codeweavers.com
Tue Oct 19 01:04:02 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d3dx9_36/tests/texture.c | 191 +++++++++++++++++++++++++++++++++-
 1 file changed, 189 insertions(+), 2 deletions(-)

diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c
index 26e5aa3dbb6..9e2c999c5f2 100644
--- a/dlls/d3dx9_36/tests/texture.c
+++ b/dlls/d3dx9_36/tests/texture.c
@@ -2351,21 +2351,87 @@ float4 main(float3 pos : POSITION, float3 size : PSIZE) : COLOR
         0x00000003, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x10000001, 0x00000001, 0x00000000,
         0x00000001, 0x00000000, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
     };
+#if 0
+float f1[2] = { 0.4f, 0.1f };
+bool b1 = false;
+float4 f2;
+bool b2[2];
+
+struct s
+{
+    bool b3;
+    float f3;
+    float4 f4;
+    uint i1;
+    int i2;
+};
+
+struct s s1;
+
+float4 main(float3 pos : POSITION, float3 size : PSIZE) : COLOR
+{
+    float t = b2[0] * b2[1] * f2.x + s1.i2;
+    return float4(pos, f1[0] + f1[1] + b1 * 0.6f + t);
+}
+#endif
+    static const DWORD shader_code2[] =
+    {
+        0x54580100, 0x0074fffe, 0x42415443, 0x0000001c, 0x000001a3, 0x54580100, 0x00000005, 0x0000001c,
+        0x00000100, 0x000001a0, 0x00000080, 0x00090002, 0x00000001, 0x00000084, 0x00000094, 0x000000a4,
+        0x00070002, 0x00000002, 0x000000a8, 0x00000000, 0x000000b8, 0x00050002, 0x00000002, 0x000000bc,
+        0x000000cc, 0x000000ec, 0x000a0002, 0x00000001, 0x000000f0, 0x00000000, 0x00000100, 0x00000002,
+        0x00000005, 0x00000190, 0x00000000, 0xab003162, 0x00010000, 0x00010001, 0x00000001, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xab003262, 0x00010000, 0x00010001, 0x00000002,
+        0x00000000, 0xab003166, 0x00030000, 0x00010001, 0x00000002, 0x00000000, 0x3ecccccd, 0x00000000,
+        0x00000000, 0x00000000, 0x3dcccccd, 0x00000000, 0x00000000, 0x00000000, 0xab003266, 0x00030001,
+        0x00040001, 0x00000001, 0x00000000, 0x62003173, 0xabab0033, 0x00010000, 0x00010001, 0x00000001,
+        0x00000000, 0xab003366, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xab003466, 0x00030001,
+        0x00040001, 0x00000001, 0x00000000, 0xab003169, 0x00020000, 0x00010001, 0x00000001, 0x00000000,
+        0xab003269, 0x00020000, 0x00010001, 0x00000001, 0x00000000, 0x00000103, 0x00000108, 0x00000118,
+        0x0000011c, 0x0000012c, 0x00000130, 0x00000140, 0x00000144, 0x00000154, 0x00000158, 0x00000005,
+        0x00080001, 0x00050001, 0x00000168, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820,
+        0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x30312072, 0xab00312e, 0x0062fffe, 0x54494c43,
+        0x00000030, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x40000000, 0x3fe33333, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x0059fffe, 0x434c5846, 0x00000008, 0xa0500001, 0x00000002, 0x00000000, 0x00000002,
+        0x0000001c, 0x00000000, 0x00000002, 0x00000020, 0x00000000, 0x00000007, 0x00000000, 0xa0500001,
+        0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000002, 0x00000028, 0x00000000,
+        0x00000007, 0x00000004, 0xa0400001, 0x00000002, 0x00000000, 0x00000007, 0x00000004, 0x00000000,
+        0x00000002, 0x00000010, 0x00000000, 0x00000007, 0x00000000, 0xa0400001, 0x00000002, 0x00000000,
+        0x00000002, 0x00000014, 0x00000000, 0x00000002, 0x00000018, 0x00000000, 0x00000007, 0x00000001,
+        0xa0500001, 0x00000002, 0x00000000, 0x00000002, 0x00000024, 0x00000000, 0x00000001, 0x0000002c,
+        0x00000000, 0x00000007, 0x00000002, 0xa0400001, 0x00000002, 0x00000000, 0x00000007, 0x00000002,
+        0x00000000, 0x00000007, 0x00000001, 0x00000000, 0x00000007, 0x00000004, 0xa0400001, 0x00000002,
+        0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000004,
+        0x00000003, 0x10000003, 0x00000001, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000004,
+        0x00000000, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff,
+    };
     IDirect3DVolumeTexture9 *volume_texture;
     IDirect3DCubeTexture9 *cube_texture;
     D3DXCONSTANTTABLE_DESC ctab_desc;
     ID3DXBuffer *buffer, *buffer2;
+    D3DXCONSTANT_DESC const_desc;
+    unsigned int x, y, z, count;
     D3DPRESENT_PARAMETERS d3dpp;
     IDirect3DTexture9 *texture;
     IDirect3DDevice9 *device;
     ID3DXTextureShader *tx;
-    unsigned int x, y, z;
     unsigned int *data;
     D3DLOCKED_RECT lr;
     D3DLOCKED_BOX lb;
+    D3DXHANDLE h, h2;
     IDirect3D9 *d3d;
     D3DCAPS9 caps;
-    D3DXHANDLE h;
     DWORD size;
     HRESULT hr;
     HWND wnd;
@@ -2577,6 +2643,127 @@ todo_wine
 
     IDirect3DVolumeTexture9_Release(volume_texture);
 
+    IUnknown_Release(tx);
+
+    /* With constant table */
+    hr = D3DXCreateTextureShader(shader_code2, &tx);
+    ok(SUCCEEDED(hr), "Got unexpected hr %#x.\n", hr);
+
+    hr = tx->lpVtbl->GetConstantBuffer(tx, &buffer);
+todo_wine
+    ok(SUCCEEDED(hr), "Failed to get texture shader constant buffer.\n");
+    if (FAILED(hr))
+    {
+        skip("Texture shaders not supported, skipping further tests.\n");
+        IUnknown_Release(tx);
+        return;
+    }
+
+    size = ID3DXBuffer_GetBufferSize(buffer);
+    ok(size == 176, "Unexpected buffer size %u.\n", size);
+
+    hr = tx->lpVtbl->GetDesc(tx, &ctab_desc);
+    ok(hr == S_OK, "Failed to get constant description, hr %#x.\n", hr);
+    ok(ctab_desc.Constants == 5, "Unexpected number of constants %u.\n", ctab_desc.Constants);
+
+    h = tx->lpVtbl->GetConstant(tx, NULL, 0);
+    ok(!!h, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "b1"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 9, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 1, "Unexpected register count %u.\n", const_desc.RegisterCount);
+
+    h = tx->lpVtbl->GetConstant(tx, NULL, 1);
+    ok(!!h, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "b2"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 7, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 2, "Unexpected register count %u.\n", const_desc.RegisterCount);
+
+    h = tx->lpVtbl->GetConstant(tx, NULL, 2);
+    ok(!!h, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "f1"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 5, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 2, "Unexpected register count %u.\n", const_desc.RegisterCount);
+    ok(const_desc.Elements == 2, "Unexpected elements count %u.\n", const_desc.Elements);
+
+    /* Array */
+    h2 = tx->lpVtbl->GetConstantElement(tx, h, 0);
+    ok(!!h2, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h2, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "f1"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 5, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 1, "Unexpected register count %u.\n", const_desc.RegisterCount);
+    ok(const_desc.Elements == 1, "Unexpected elements count %u.\n", const_desc.Elements);
+
+    h2 = tx->lpVtbl->GetConstantElement(tx, h, 1);
+    ok(!!h2, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h2, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "f1"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 6, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 1, "Unexpected register count %u.\n", const_desc.RegisterCount);
+    ok(const_desc.Elements == 1, "Unexpected elements count %u.\n", const_desc.Elements);
+
+    h2 = tx->lpVtbl->GetConstantElement(tx, h, 2);
+    ok(!h2, "Unexpected handle %p.\n", h);
+
+    h = tx->lpVtbl->GetConstant(tx, NULL, 3);
+    ok(!!h, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "f2"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 10, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 1, "Unexpected register count %u.\n", const_desc.RegisterCount);
+
+    /* Structure */
+    h = tx->lpVtbl->GetConstant(tx, NULL, 4);
+    ok(!!h, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "s1"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 0, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 5, "Unexpected register count %u.\n", const_desc.RegisterCount);
+    ok(const_desc.Class == D3DXPC_STRUCT, "Unexpected class %u.\n", const_desc.Class);
+    ok(const_desc.StructMembers == 5, "Unexpected member count %u.\n", const_desc.StructMembers);
+
+    h2 = tx->lpVtbl->GetConstant(tx, h, 0);
+    ok(!!h2, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h2, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "b3"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 0, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 1, "Unexpected register count %u.\n", const_desc.RegisterCount);
+    ok(const_desc.Elements == 1, "Unexpected elements count %u.\n", const_desc.Elements);
+
+    h2 = tx->lpVtbl->GetConstant(tx, h, 1);
+    ok(!!h2, "Unexpected handle %p.\n", h);
+    hr = tx->lpVtbl->GetConstantDesc(tx, h2, &const_desc, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!strcmp(const_desc.Name, "f3"), "Unexpected name %s.\n", const_desc.Name);
+    ok(const_desc.RegisterSet == D3DXRS_FLOAT4, "Unexpected register set %u.\n", const_desc.RegisterSet);
+    ok(const_desc.RegisterIndex == 1, "Unexpected register index %u.\n", const_desc.RegisterIndex);
+    ok(const_desc.RegisterCount == 1, "Unexpected register count %u.\n", const_desc.RegisterCount);
+    ok(const_desc.Elements == 1, "Unexpected elements count %u.\n", const_desc.Elements);
+
+    h2 = tx->lpVtbl->GetConstant(tx, h, 10);
+    ok(!h2, "Unexpected handle %p.\n", h);
+
+    ID3DXBuffer_Release(buffer);
+
  cleanup:
     IDirect3DDevice9_Release(device);
     IDirect3D9_Release(d3d);
-- 
2.33.0




More information about the wine-devel mailing list