[PATCH 5/5] d3dcompiler/tests: Add tests for samplers.

Zebediah Figura z.figura12 at gmail.com
Wed Aug 12 19:33:40 CDT 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/tests/hlsl_d3d11.c | 226 +++++++++++++++++++++++--
 dlls/d3dcompiler_43/tests/hlsl_d3d9.c  | 120 ++++++++++++-
 2 files changed, 327 insertions(+), 19 deletions(-)

diff --git a/dlls/d3dcompiler_43/tests/hlsl_d3d11.c b/dlls/d3dcompiler_43/tests/hlsl_d3d11.c
index aff75a5eafa..7a1243b9ccf 100644
--- a/dlls/d3dcompiler_43/tests/hlsl_d3d11.c
+++ b/dlls/d3dcompiler_43/tests/hlsl_d3d11.c
@@ -524,6 +524,126 @@ static void test_trig(void)
     release_test_context(&test_context);
 }
 
+static void test_sampling(void)
+{
+    struct test_context test_context;
+    ID3D11ShaderResourceView *srv;
+    ID3D11SamplerState *sampler;
+    ID3D10Blob *ps_code = NULL;
+    ID3D11Texture2D *texture;
+    unsigned int i;
+    struct vec4 v;
+    HRESULT hr;
+
+    static const char *tests[] =
+    {
+        "sampler s;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return tex2D(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "SamplerState s;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return tex2D(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "sampler2D s;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return tex2D(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "sampler s;\n"
+        "Texture2D t;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return t.Sample(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "SamplerState s;\n"
+        "Texture2D t;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return t.Sample(s, float2(0.5, 0.5));\n"
+        "}",
+    };
+
+    static const D3D11_TEXTURE2D_DESC texture_desc =
+    {
+        .Width = 2,
+        .Height = 2,
+        .MipLevels = 1,
+        .ArraySize = 1,
+        .Format = DXGI_FORMAT_R32G32B32A32_FLOAT,
+        .SampleDesc.Count = 1,
+        .Usage = D3D11_USAGE_DEFAULT,
+        .BindFlags = D3D11_BIND_SHADER_RESOURCE,
+    };
+
+    static const float texture_data[] =
+    {
+        0.0f, 0.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 0.0f, 0.0f,
+        1.0f, 0.0f, 1.0f, 0.0f,
+    };
+
+    static const D3D11_SUBRESOURCE_DATA resource_data = {&texture_data, sizeof(texture_data) / 2};
+
+    static const D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc =
+    {
+        .Format = DXGI_FORMAT_R32G32B32A32_FLOAT,
+        .ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D,
+        .Texture2D.MipLevels = 1,
+    };
+
+    static const D3D11_SAMPLER_DESC sampler_desc =
+    {
+        .Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR,
+        .AddressU = D3D11_TEXTURE_ADDRESS_WRAP,
+        .AddressV = D3D11_TEXTURE_ADDRESS_WRAP,
+        .AddressW = D3D11_TEXTURE_ADDRESS_WRAP,
+    };
+
+    static const float red[] = {1.0f, 0.0f, 0.0f, 1.0f};
+
+    if (!init_test_context(&test_context))
+        return;
+
+    hr = ID3D11Device_CreateTexture2D(test_context.device, &texture_desc, &resource_data, &texture);
+    ok(hr == S_OK, "Failed to create texture, hr %#x.\n", hr);
+    hr = ID3D11Device_CreateShaderResourceView(test_context.device, (ID3D11Resource *)texture, &srv_desc, &srv);
+    ok(hr == S_OK, "Failed to create SRV, hr %#x.\n", hr);
+    ID3D11DeviceContext_PSSetShaderResources(test_context.immediate_context, 0, 1, &srv);
+
+    hr = ID3D11Device_CreateSamplerState(test_context.device, &sampler_desc, &sampler);
+    ok(hr == S_OK, "Failed to create sampler, hr %#x.\n", hr);
+    ID3D11DeviceContext_PSSetSamplers(test_context.immediate_context, 0, 1, &sampler);
+
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
+    {
+        ID3D11DeviceContext_ClearRenderTargetView(test_context.immediate_context, test_context.rtv, red);
+        todo_wine ps_code = compile_shader_flags(tests[i], "ps_4_0", D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY);
+        if (ps_code)
+        {
+            draw_quad(&test_context, ps_code);
+
+            v = get_color_vec4(&test_context, 0, 0);
+            todo_wine ok(compare_vec4(&v, 0.25f, 0.0f, 0.25f, 0.0f, 0),
+                    "Test %u: Got unexpected value {%.8e, %.8e, %.8e, %.8e}.\n", i, v.x, v.y, v.z, v.w);
+
+            ID3D10Blob_Release(ps_code);
+        }
+    }
+
+    ID3D11Texture2D_Release(texture);
+    ID3D11SamplerState_Release(sampler);
+    ID3D11ShaderResourceView_Release(srv);
+    release_test_context(&test_context);
+}
+
 static void check_type_desc(const char *prefix, const D3D11_SHADER_TYPE_DESC *type,
         const D3D11_SHADER_TYPE_DESC *expect)
 {
@@ -537,6 +657,19 @@ static void check_type_desc(const char *prefix, const D3D11_SHADER_TYPE_DESC *ty
     ok(!strcmp(type->Name, expect->Name), "%s: got name %s.\n", prefix, debugstr_a(type->Name));
 }
 
+static void check_resource_binding(const char *prefix, const D3D11_SHADER_INPUT_BIND_DESC *desc,
+        const D3D11_SHADER_INPUT_BIND_DESC *expect)
+{
+    ok(!strcmp(desc->Name, expect->Name), "%s: got name %s.\n", prefix, debugstr_a(desc->Name));
+    ok(desc->Type == expect->Type, "%s: got type %#x.\n", prefix, desc->Type);
+    ok(desc->BindPoint == expect->BindPoint, "%s: got bind point %u.\n", prefix, desc->BindPoint);
+    ok(desc->BindCount == expect->BindCount, "%s: got bind count %u.\n", prefix, desc->BindCount);
+    ok(desc->uFlags == expect->uFlags, "%s: got flags %#x.\n", prefix, desc->uFlags);
+    ok(desc->ReturnType == expect->ReturnType, "%s: got return type %#x.\n", prefix, desc->ReturnType);
+    ok(desc->Dimension == expect->Dimension, "%s: got dimension %#x.\n", prefix, desc->Dimension);
+    ok(desc->NumSamples == expect->NumSamples, "%s: got multisample count %u.\n", prefix, desc->NumSamples);
+}
+
 static void test_reflection(void)
 {
     ID3D11ShaderReflectionConstantBuffer *cbuffer;
@@ -546,8 +679,10 @@ static void test_reflection(void)
     D3D11_SHADER_VARIABLE_DESC var_desc;
     ID3D11ShaderReflection *reflection;
     D3D11_SHADER_TYPE_DESC type_desc;
-    ID3D10Blob *vs_code = NULL;
+    D3D11_SHADER_DESC shader_desc;
+    ID3D10Blob *code = NULL;
     unsigned int i, j, k;
+    char prefix[40];
     ULONG refcount;
     HRESULT hr;
 
@@ -658,14 +793,55 @@ static void test_reflection(void)
         {"b5", D3D_SIT_CBUFFER, 5, 1, D3D_SIF_USERPACKED},
     };
 
-    todo_wine vs_code = compile_shader(vs_source, "vs_5_0");
-    if (!vs_code)
+    static const char ps_source[] =
+        "texture2D a;\n"
+        "sampler c {};\n"
+        "SamplerState d {};\n"
+        "sampler e\n"
+        "{\n"
+        "    Texture = a;\n"
+        "    foo = bar + 2;\n"
+        "};\n"
+        "SamplerState f\n"
+        "{\n"
+        "    Texture = a;\n"
+        "    foo = bar + 2;\n"
+        "};\n"
+        "sampler2D g;\n"
+        "sampler b : register(s5);\n"
+        "float4 main(float2 pos : texcoord) : SV_TARGET\n"
+        "{\n"
+        "    return a.Sample(b, pos) + a.Sample(c, pos) + a.Sample(d, pos) + tex2D(f, pos) + tex2D(e, pos)"
+        "            + tex2D(g, pos);\n"
+        "}";
+
+    static const D3D11_SHADER_INPUT_BIND_DESC ps_bindings[] =
+    {
+        {"c", D3D_SIT_SAMPLER, 0, 1},
+        {"d", D3D_SIT_SAMPLER, 1, 1},
+        {"e", D3D_SIT_SAMPLER, 2, 1},
+        {"f", D3D_SIT_SAMPLER, 3, 1},
+        {"g", D3D_SIT_SAMPLER, 4, 1},
+        {"b", D3D_SIT_SAMPLER, 5, 1, D3D_SIF_USERPACKED},
+        {"f", D3D_SIT_TEXTURE, 0, 1, D3D_SIF_TEXTURE_COMPONENTS, D3D_RETURN_TYPE_FLOAT, D3D_SRV_DIMENSION_TEXTURE2D, ~0u},
+        {"e", D3D_SIT_TEXTURE, 1, 1, D3D_SIF_TEXTURE_COMPONENTS, D3D_RETURN_TYPE_FLOAT, D3D_SRV_DIMENSION_TEXTURE2D, ~0u},
+        {"g", D3D_SIT_TEXTURE, 2, 1, D3D_SIF_TEXTURE_COMPONENTS, D3D_RETURN_TYPE_FLOAT, D3D_SRV_DIMENSION_TEXTURE2D, ~0u},
+        {"a", D3D_SIT_TEXTURE, 3, 1, D3D_SIF_TEXTURE_COMPONENTS, D3D_RETURN_TYPE_FLOAT, D3D_SRV_DIMENSION_TEXTURE2D, ~0u},
+    };
+
+    todo_wine code = compile_shader(vs_source, "vs_5_0");
+    if (!code)
         return;
 
-    hr = pD3DReflect(ID3D10Blob_GetBufferPointer(vs_code), ID3D10Blob_GetBufferSize(vs_code),
+    hr = pD3DReflect(ID3D10Blob_GetBufferPointer(code), ID3D10Blob_GetBufferSize(code),
             &IID_ID3D11ShaderReflection, (void **)&reflection);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
 
+    hr = reflection->lpVtbl->GetDesc(reflection, &shader_desc);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(shader_desc.ConstantBuffers == ARRAY_SIZE(vs_buffers), "Got %u buffers.\n", shader_desc.ConstantBuffers);
+    ok(shader_desc.BoundResources == ARRAY_SIZE(vs_bindings), "Got %u resources.\n", shader_desc.BoundResources);
+
     for (i = 0; i < ARRAY_SIZE(vs_buffers); ++i)
     {
         cbuffer = reflection->lpVtbl->GetConstantBufferByIndex(reflection, i);
@@ -682,7 +858,6 @@ static void test_reflection(void)
         for (j = 0; j < buffer_desc.Variables; ++j)
         {
             const struct shader_variable *expect = &vs_buffers[i].vars[j];
-            char prefix[40];
 
             var = cbuffer->lpVtbl->GetVariableByIndex(cbuffer, j);
             hr = var->lpVtbl->GetDesc(var, &var_desc);
@@ -717,20 +892,36 @@ static void test_reflection(void)
         D3D11_SHADER_INPUT_BIND_DESC desc;
 
         hr = reflection->lpVtbl->GetResourceBindingDesc(reflection, i, &desc);
-        todo_wine ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr);
-        if (hr != S_OK)
-            break;
-        ok(!strcmp(desc.Name, vs_bindings[i].Name), "Test %u: got name %s.\n", i, debugstr_a(desc.Name));
-        ok(desc.Type == vs_bindings[i].Type, "Test %u: got type %#x.\n", i, desc.Type);
-        ok(desc.BindPoint == vs_bindings[i].BindPoint, "Test %u: got bind point %u.\n", i, desc.BindPoint);
-        ok(desc.BindCount == vs_bindings[i].BindCount, "Test %u: got bind count %u.\n", i, desc.BindCount);
-        ok(desc.uFlags == vs_bindings[i].uFlags, "Test %u: got flags %#x.\n", i, desc.uFlags);
-        ok(desc.ReturnType == vs_bindings[i].ReturnType, "Test %u: got return type %#x.\n", i, desc.ReturnType);
-        ok(desc.Dimension == vs_bindings[i].Dimension, "Test %u: got dimension %#x.\n", i, desc.Dimension);
-        ok(desc.NumSamples == vs_bindings[i].NumSamples, "Test %u: got multisample count %u.\n", i, desc.NumSamples);
+        ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr);
+        sprintf(prefix, "Test %u", i);
+        check_resource_binding(prefix, &desc, &vs_bindings[i]);
+    }
+
+    ID3D10Blob_Release(code);
+    refcount = reflection->lpVtbl->Release(reflection);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    code = compile_shader_flags(ps_source, "ps_4_0", D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY);
+    hr = pD3DReflect(ID3D10Blob_GetBufferPointer(code), ID3D10Blob_GetBufferSize(code),
+            &IID_ID3D11ShaderReflection, (void **)&reflection);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = reflection->lpVtbl->GetDesc(reflection, &shader_desc);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!shader_desc.ConstantBuffers, "Got %u buffers.\n", shader_desc.ConstantBuffers);
+    ok(shader_desc.BoundResources == ARRAY_SIZE(ps_bindings), "Got %u resources.\n", shader_desc.BoundResources);
+
+    for (i = 0; i < shader_desc.BoundResources; ++i)
+    {
+        D3D11_SHADER_INPUT_BIND_DESC desc;
+
+        hr = reflection->lpVtbl->GetResourceBindingDesc(reflection, i, &desc);
+        ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr);
+        sprintf(prefix, "Test %u", i);
+        check_resource_binding(prefix, &desc, &ps_bindings[i]);
     }
 
-    ID3D10Blob_Release(vs_code);
+    ID3D10Blob_Release(code);
     refcount = reflection->lpVtbl->Release(reflection);
     ok(!refcount, "Got unexpected refcount %u.\n", refcount);
 }
@@ -1006,4 +1197,5 @@ START_TEST(hlsl_d3d11)
     test_math();
     test_conditionals();
     test_trig();
+    test_sampling();
 }
diff --git a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
index 8443406402e..87f63023c58 100644
--- a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
+++ b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
@@ -1054,11 +1054,98 @@ static void test_global_initializer(void)
     release_test_context(&test_context);
 }
 
+static void test_samplers(void)
+{
+    struct test_context test_context;
+    IDirect3DTexture9 *texture;
+    ID3D10Blob *ps_code = NULL;
+    D3DLOCKED_RECT map_desc;
+    unsigned int i;
+    struct vec4 v;
+    HRESULT hr;
+
+    static const char *tests[] =
+    {
+        "sampler s;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return tex2D(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "SamplerState s;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return tex2D(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "sampler2D s;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return tex2D(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "sampler s;\n"
+        "Texture2D t;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return t.Sample(s, float2(0.5, 0.5));\n"
+        "}",
+
+        "SamplerState s;\n"
+        "Texture2D t;\n"
+        "float4 main() : COLOR\n"
+        "{\n"
+        "    return t.Sample(s, float2(0.5, 0.5));\n"
+        "}",
+    };
+
+    if (!init_test_context(&test_context))
+        return;
+
+    hr = IDirect3DDevice9_CreateTexture(test_context.device, 2, 2, 1, D3DUSAGE_DYNAMIC,
+            D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL);
+    ok(hr == D3D_OK, "Failed to create texture, hr %#x.\n", hr);
+
+    hr = IDirect3DTexture9_LockRect(texture, 0, &map_desc, NULL, D3DLOCK_DISCARD);
+    ok(hr == D3D_OK, "Failed to map texture, hr %#x.\n", hr);
+    memset(map_desc.pBits, 0, 2 * map_desc.Pitch);
+    ((DWORD *)map_desc.pBits)[1] = 0x00ff00ff;
+    hr = IDirect3DTexture9_UnlockRect(texture, 0);
+    ok(hr == D3D_OK, "Failed to unmap texture, hr %#x.\n", hr);
+
+    hr = IDirect3DDevice9_SetTexture(test_context.device, 0, (IDirect3DBaseTexture9 *)texture);
+    ok(hr == D3D_OK, "Failed to set texture, hr %#x.\n", hr);
+    hr = IDirect3DDevice9_SetSamplerState(test_context.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+    ok(hr == D3D_OK, "Failed to set sampler state, hr %#x.\n", hr);
+
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
+    {
+        hr = IDirect3DDevice9_Clear(test_context.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0);
+        ok(hr == D3D_OK, "Test %u: Failed to clear, hr %#x.\n", i, hr);
+        todo_wine ps_code = compile_shader(tests[i], "ps_2_0");
+        if (ps_code)
+        {
+            draw_quad(test_context.device, ps_code);
+
+            v = get_color_vec4(test_context.device, 0, 0);
+            todo_wine ok(compare_vec4(&v, 0.25f, 0.0f, 0.25f, 0.0f, 128),
+                    "Test %u: Got unexpected value {%.8e, %.8e, %.8e, %.8e}.\n", i, v.x, v.y, v.z, v.w);
+
+            ID3D10Blob_Release(ps_code);
+        }
+    }
+
+    IDirect3DTexture9_Release(texture);
+    release_test_context(&test_context);
+}
+
 static void check_constant_desc(const char *prefix, const D3DXCONSTANT_DESC *desc,
         const D3DXCONSTANT_DESC *expect, BOOL nonzero_defaultvalue)
 {
     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);
+    if (desc->RegisterSet == D3DXRS_SAMPLER)
+        ok(desc->RegisterIndex == expect->RegisterIndex, "%s: got RegisterIndex %u.\n", prefix, desc->RegisterIndex);
     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);
@@ -1093,9 +1180,28 @@ static void test_constant_table(void)
         "uniform matrix_t i;\n"
         "uniform struct matrix_record j;\n"
         "uniform matrix<float,3,1> k;\n"
-        "float4 main(uniform float4 h) : COLOR\n"
+        "sampler l : register(s5);\n"
+        "sampler m {};\n"
+        "texture dummy_texture;\n"
+        "sampler n\n"
+        "{\n"
+        "    Texture = dummy_texture;\n"
+        "    foo = bar + 2;\n"
+        "};\n"
+        "SamplerState o\n"
+        "{\n"
+        "    Texture = dummy_texture;\n"
+        "    foo = bar + 2;\n"
+        "};\n"
+        "texture2D p;\n"
+        "sampler q : register(s7);\n"
+        "SamplerState r : register(s8);\n"
+        "sampler2D s;\n"
+        "float4 main(uniform float4 h, sampler t, uniform sampler u) : COLOR\n"
         "{\n"
-        "    return a + b + c._31 + d._31 + f.d._22 + g[e].x + h + i._33 + j.a._33 + k._31;\n"
+        "    return b + c._31 + d._31 + f.d._22 + tex2D(l, g[e]) + tex3D(m, h.xyz) + i._33 + j.a._33 + k._31\n"
+        "            + tex2D(n, a.xy) + tex2D(o, a.xy) + p.Sample(r, a.xy) + p.Sample(q, a.xy) + tex2D(s, a.xy)\n"
+        "            + tex2D(t, a.xy) + tex2D(u, a.xy);\n"
         "}";
 
     D3DXCONSTANTTABLE_DESC table_desc;
@@ -1110,6 +1216,7 @@ static void test_constant_table(void)
     static const D3DXCONSTANT_DESC expect_constants[] =
     {
         {"$h", D3DXRS_FLOAT4, 0, 1, D3DXPC_VECTOR, D3DXPT_FLOAT, 1, 4, 1, 0, 16},
+        {"$u", D3DXRS_SAMPLER, 10, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4},
         {"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},
@@ -1120,6 +1227,14 @@ static void test_constant_table(void)
         {"i", D3DXRS_FLOAT4, 0, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 3, 1, 0, 36},
         {"j", D3DXRS_FLOAT4, 0, 3, D3DXPC_STRUCT, D3DXPT_VOID, 1, 9, 1, 1, 36},
         {"k", D3DXRS_FLOAT4, 0, 3, D3DXPC_MATRIX_ROWS, D3DXPT_FLOAT, 3, 1, 1, 0, 12},
+        {"l", D3DXRS_SAMPLER, 5, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4},
+        {"m", D3DXRS_SAMPLER, 2, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER3D, 1, 1, 1, 0, 4},
+        {"n", D3DXRS_SAMPLER, 3, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4},
+        {"o", D3DXRS_SAMPLER, 4, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4},
+        {"q+p", D3DXRS_SAMPLER, 0, 1, D3DXPC_OBJECT, D3DXPT_TEXTURE2D, 1, 4, 1, 0, 16},
+        {"r+p", D3DXRS_SAMPLER, 1, 1, D3DXPC_OBJECT, D3DXPT_TEXTURE2D, 1, 4, 1, 0, 16},
+        {"s", D3DXRS_SAMPLER, 6, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4},
+        {"t", D3DXRS_SAMPLER, 9, 1, D3DXPC_OBJECT, D3DXPT_SAMPLER2D, 1, 1, 1, 0, 4},
     };
 
     static const D3DXCONSTANT_DESC expect_fields_f[] =
@@ -1604,6 +1719,7 @@ START_TEST(hlsl_d3d9)
     test_struct_assignment();
     test_struct_semantics();
     test_global_initializer();
+    test_samplers();
 
     test_constant_table();
     test_fail();
-- 
2.27.0




More information about the wine-devel mailing list