[PATCH 1/6] d3d11/tests: Add test for ld_structured instruction.
Józef Kucia
jkucia at codeweavers.com
Sun Feb 26 11:47:59 CST 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/d3d11/tests/d3d11.c | 132 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 106 insertions(+), 26 deletions(-)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 8f37304..329acd4 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -1042,6 +1042,16 @@ static BOOL is_nvidia_device(ID3D11Device *device)
return is_vendor_device(device, 0x10de);
}
+static BOOL check_compute_shaders_via_sm4_support(ID3D11Device *device)
+{
+ D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS options;
+
+ if (FAILED(ID3D11Device_CheckFeatureSupport(device,
+ D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &options, sizeof(options))))
+ return FALSE;
+ return options.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x;
+}
+
static IDXGISwapChain *create_swapchain(ID3D11Device *device, HWND window, const struct swapchain_desc *swapchain_desc)
{
DXGI_SWAP_CHAIN_DESC dxgi_desc;
@@ -14095,17 +14105,26 @@ static void test_render_target_device_mismatch(void)
static void test_buffer_srv(void)
{
+ struct shader
+ {
+ const DWORD *code;
+ size_t size;
+ BOOL requires_raw_and_structured_buffers;
+ };
struct buffer
{
unsigned int byte_count;
unsigned int data_offset;
const void *data;
+ unsigned int structure_byte_stride;
};
+ BOOL raw_and_structured_buffers_supported;
D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
struct d3d11_test_context test_context;
D3D11_SUBRESOURCE_DATA resource_data;
const struct buffer *current_buffer;
+ const struct shader *current_shader;
ID3D11ShaderResourceView *srv;
D3D11_BUFFER_DESC buffer_desc;
ID3D11DeviceContext *context;
@@ -14149,6 +14168,40 @@ static void test_buffer_srv(void)
0x00000000, 0x0010001a, 0x00000000, 0x0500001b, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
0x0700002d, 0x001020f2, 0x00000000, 0x00100006, 0x00000000, 0x00107e46, 0x00000000, 0x0100003e,
};
+ static const struct shader ps_float4 = {ps_float4_code, sizeof(ps_float4_code)};
+ static const DWORD ps_structured_code[] =
+ {
+#if 0
+ StructuredBuffer<float4> b;
+
+ float2 size;
+
+ float4 main(float4 position : SV_POSITION) : SV_Target
+ {
+ float2 p;
+ int2 coords;
+ p.x = position.x / 640.0f;
+ p.y = position.y / 480.0f;
+ coords = int2(p.x * size.x, p.y * size.y);
+ return b[coords.y * size.x + coords.x];
+ }
+#endif
+ 0x43425844, 0x246caabb, 0xf1e7d6b9, 0xcbe720dc, 0xcdc23036, 0x00000001, 0x000001c0, 0x00000004,
+ 0x00000030, 0x00000064, 0x00000098, 0x000001b0, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008,
+ 0x00000020, 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x5449534f,
+ 0x004e4f49, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000110,
+ 0x00000040, 0x00000044, 0x0100486a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x040000a2,
+ 0x00107000, 0x00000000, 0x00000010, 0x04002064, 0x00101032, 0x00000000, 0x00000001, 0x03000065,
+ 0x001020f2, 0x00000000, 0x02000068, 0x00000001, 0x08000038, 0x00100032, 0x00000000, 0x00101516,
+ 0x00000000, 0x00208516, 0x00000000, 0x00000000, 0x0a000038, 0x00100032, 0x00000000, 0x00100046,
+ 0x00000000, 0x00004002, 0x3b088889, 0x3acccccd, 0x00000000, 0x00000000, 0x05000043, 0x00100032,
+ 0x00000000, 0x00100046, 0x00000000, 0x0a000032, 0x00100012, 0x00000000, 0x0010000a, 0x00000000,
+ 0x0020800a, 0x00000000, 0x00000000, 0x0010001a, 0x00000000, 0x0500001c, 0x00100012, 0x00000000,
+ 0x0010000a, 0x00000000, 0x090000a7, 0x001020f2, 0x00000000, 0x0010000a, 0x00000000, 0x00004001,
+ 0x00000000, 0x00107e46, 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00000002, 0x00000000,
+ };
+ static const struct shader ps_structured = {ps_structured_code, sizeof(ps_structured_code), TRUE};
static const DWORD rgba16[] =
{
0xff0000ff, 0xff00ffff, 0xff00ff00, 0xffffff00,
@@ -14166,11 +14219,19 @@ static void test_buffer_srv(void)
0xde, 0xad,
0xba, 0xbe,
};
+ static const struct vec4 rgba_float[] =
+ {
+ {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 0.0f, 0.0f, 1.0f},
+ {0.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 1.0f, 0.0f, 1.0f},
+ };
static const struct buffer rgba16_buffer = {sizeof(rgba16), 0, &rgba16};
static const struct buffer rgba16_offset_buffer = {256 + sizeof(rgba16), 256, &rgba16};
static const struct buffer rgba4_buffer = {sizeof(rgba4), 0, &rgba4};
static const struct buffer r4_buffer = {sizeof(r4), 0, &r4};
static const struct buffer r4_offset_buffer = {256 + sizeof(r4), 256, &r4};
+ static const struct buffer float_buffer = {sizeof(rgba_float), 0, &rgba_float, sizeof(*rgba_float)};
+ static const struct buffer float_offset_buffer = {256 + sizeof(rgba_float), 256,
+ &rgba_float, sizeof(*rgba_float)};
static const DWORD rgba16_colors2x2[] =
{
0xff0000ff, 0xff0000ff, 0xff00ffff, 0xff00ffff,
@@ -14204,23 +14265,27 @@ static void test_buffer_srv(void)
static const struct test
{
+ const struct shader *shader;
const struct buffer *buffer;
DXGI_FORMAT srv_format;
- UINT srv_first_element;
- UINT srv_element_count;
+ unsigned int srv_first_element;
+ unsigned int srv_element_count;
struct vec2 size;
const DWORD *expected_colors;
}
tests[] =
{
- {&rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 16, {4.0f, 4.0f}, rgba16},
- {&rgba16_offset_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 64, 16, {4.0f, 4.0f}, rgba16},
- {&rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba16_colors2x2},
- {&rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 1, {1.0f, 1.0f}, rgba16_colors1x1},
- {&rgba4_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba4_colors},
- {&r4_buffer, DXGI_FORMAT_R8_UNORM, 0, 4, {2.0f, 2.0f}, r4_colors},
- {&r4_offset_buffer, DXGI_FORMAT_R8_UNORM, 256, 4, {2.0f, 2.0f}, r4_colors},
- {NULL, 0, 0, 0, {2.0f, 2.0f}, zero_colors},
+ {&ps_float4, &rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 16, {4.0f, 4.0f}, rgba16},
+ {&ps_float4, &rgba16_offset_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 64, 16, {4.0f, 4.0f}, rgba16},
+ {&ps_float4, &rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba16_colors2x2},
+ {&ps_float4, &rgba16_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 1, {1.0f, 1.0f}, rgba16_colors1x1},
+ {&ps_float4, &rgba4_buffer, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 4, {2.0f, 2.0f}, rgba4_colors},
+ {&ps_float4, &r4_buffer, DXGI_FORMAT_R8_UNORM, 0, 4, {2.0f, 2.0f}, r4_colors},
+ {&ps_float4, &r4_offset_buffer, DXGI_FORMAT_R8_UNORM, 256, 4, {2.0f, 2.0f}, r4_colors},
+ {&ps_structured, &float_buffer, DXGI_FORMAT_UNKNOWN, 0, 4, {2.0f, 2.0f}, rgba4_colors},
+ {&ps_structured, &float_offset_buffer, DXGI_FORMAT_UNKNOWN, 16, 4, {2.0f, 2.0f}, rgba4_colors},
+ {&ps_float4, NULL, 0, 0, 0, {2.0f, 2.0f}, zero_colors},
+ {&ps_float4, NULL, 0, 0, 0, {1.0f, 1.0f}, zero_colors},
};
if (!init_test_context(&test_context, NULL))
@@ -14228,22 +14293,46 @@ static void test_buffer_srv(void)
device = test_context.device;
context = test_context.immediate_context;
+ raw_and_structured_buffers_supported = ID3D11Device_GetFeatureLevel(device) >= D3D_FEATURE_LEVEL_11_0
+ || check_compute_shaders_via_sm4_support(device);
cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, sizeof(cb_size), NULL);
-
- hr = ID3D11Device_CreatePixelShader(device, ps_float4_code, sizeof(ps_float4_code), NULL, &ps);
- ok(SUCCEEDED(hr), "Failed to create pixel shader, hr %#x.\n", hr);
-
- ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0);
ID3D11DeviceContext_PSSetConstantBuffers(context, 0, 1, &cb);
+ ps = NULL;
srv = NULL;
buffer = NULL;
+ current_shader = NULL;
current_buffer = NULL;
for (i = 0; i < sizeof(tests) / sizeof(*tests); ++i)
{
const struct test *test = &tests[i];
+ if (test->shader->requires_raw_and_structured_buffers && !raw_and_structured_buffers_supported)
+ {
+ skip("Test %u: Raw and structured buffers are not supported.\n", i);
+ continue;
+ }
+ /* Structured buffer views with an offset don't seem to work on WARP. */
+ if (test->srv_format == DXGI_FORMAT_UNKNOWN && test->srv_first_element
+ && is_warp_device(device))
+ {
+ skip("Test %u: Broken WARP.\n", i);
+ continue;
+ }
+
+ if (current_shader != test->shader)
+ {
+ if (ps)
+ ID3D11PixelShader_Release(ps);
+
+ current_shader = test->shader;
+
+ hr = ID3D11Device_CreatePixelShader(device, current_shader->code, current_shader->size, NULL, &ps);
+ ok(SUCCEEDED(hr), "Test %u: Failed to create pixel shader, hr %#x.\n", i, hr);
+ ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0);
+ }
+
if (current_buffer != test->buffer)
{
if (buffer)
@@ -14259,7 +14348,8 @@ static void test_buffer_srv(void)
buffer_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
buffer_desc.CPUAccessFlags = 0;
buffer_desc.MiscFlags = 0;
- buffer_desc.StructureByteStride = 0;
+ if ((buffer_desc.StructureByteStride = current_buffer->structure_byte_stride))
+ buffer_desc.MiscFlags |= D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
resource_data.SysMemPitch = 0;
resource_data.SysMemSlicePitch = 0;
if (current_buffer->data_offset)
@@ -14332,16 +14422,6 @@ static void test_buffer_srv(void)
release_test_context(&test_context);
}
-static BOOL check_compute_shaders_via_sm4_support(ID3D11Device *device)
-{
- D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS options;
-
- if (FAILED(ID3D11Device_CheckFeatureSupport(device,
- D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &options, sizeof(options))))
- return FALSE;
- return options.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x;
-}
-
static void test_unaligned_raw_buffer_access(const D3D_FEATURE_LEVEL feature_level)
{
D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc;
--
2.10.2
More information about the wine-patches
mailing list