[PATCH 6/6] d3d11/tests: Add test for clearing buffer unordered access views.
Józef Kucia
jkucia at codeweavers.com
Fri May 12 08:09:22 CDT 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/d3d11/tests/d3d11.c | 349 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 349 insertions(+)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 6626ea2..8008893 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -9509,6 +9509,354 @@ static void test_clear_depth_stencil_view(void)
ok(!refcount, "Device has %u references left.\n", refcount);
}
+static unsigned int to_sint8(unsigned int x)
+{
+ union
+ {
+ signed int s;
+ unsigned int u;
+ } bits;
+ bits.u = x;
+ return min(max(bits.s, -128), 127) & 0xff;
+}
+
+#define check_rgba_sint8(data, uvec) check_rgba_sint8_(__LINE__, data, uvec)
+static void check_rgba_sint8_(unsigned int line, DWORD data, const struct uvec4 *v)
+{
+ unsigned int x = to_sint8(v->x);
+ unsigned int y = to_sint8(v->y);
+ unsigned int z = to_sint8(v->z);
+ unsigned int w = to_sint8(v->w);
+ DWORD expected[] =
+ {
+ /* Windows 7 - Nvidia, WARP */
+ (v->x & 0xff) | (v->y & 0xff) << 8 | (v->z & 0xff) << 16 | (v->w & 0xff) << 24,
+ /* Windows 10 - AMD */
+ x | y << 8 | z << 16 | w << 24,
+ /* Windows 10 - Intel */
+ x | x << 8 | x << 16 | x << 24,
+ };
+
+ ok_(__FILE__, line)(data == expected[0] || data == expected[1] || broken(data == expected[2]),
+ "Got %#x, expected %#x or %#x at %u, uvec4 %#x, %#x, %#x, %#x.\n",
+ data, expected[0], expected[1], x, v->x, v->y, v->z, v->w);
+}
+
+static void test_clear_buffer_unordered_access_view(void)
+{
+ D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc;
+ ID3D11UnorderedAccessView *uav, *uav2;
+ struct device_desc device_desc;
+ D3D11_BUFFER_DESC buffer_desc;
+ ID3D11DeviceContext *context;
+ struct resource_readback rb;
+ ID3D11Buffer *buffer;
+ ID3D11Device *device;
+ struct uvec4 uvec4;
+ unsigned int i, x;
+ ULONG refcount;
+ HRESULT hr;
+
+ static const D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_11_0;
+ static const struct uvec4 fe_uvec4 = {0xfefefefe, 0xfefefefe, 0xfefefefe, 0xfefefefe};
+ static const struct uvec4 uvec4_data[] =
+ {
+ {0x00000000, 0x00000000, 0x00000000, 0x00000000},
+
+ {0x00000000, 0xffffffff, 0xffffffff, 0xffffffff},
+ {0xffffffff, 0x00000000, 0x00000000, 0x00000000},
+ {0x00000000, 0xffffffff, 0x00000000, 0x00000000},
+ {0x00000000, 0x00000000, 0xffffffff, 0x00000000},
+ {0x00000000, 0x00000000, 0x00000000, 0xffffffff},
+
+ {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff},
+ {0x80000000, 0x80000000, 0x80000000, 0x80000000},
+ {0x000000ff, 0x00000080, 0x80000080, 0x00000080},
+ {0x000000ff, 0x0000007f, 0x000000ef, 0x000000fe},
+ {0x800000ff, 0x8000007f, 0x800000ef, 0x800000fe},
+ {0xfefefefe, 0xf0f0f0f0, 0xefefefef, 0x0f0f0f0f},
+ {0xaaaaaaaa, 0xdeadbeef, 0xdeadbabe, 0xdeadf00d},
+
+ {0x00000001, 0x00000002, 0x00000003, 0x00000004},
+ {0x000000ff, 0x000000fe, 0x000000fd, 0x000000fc},
+ {0x000000f2, 0x000000f1, 0x000000f0, 0x000000ef},
+ {0x0000000a, 0x0000000d, 0x0000000e, 0x0000000f},
+ {0x0000001a, 0x0000002d, 0x0000003e, 0x0000004f},
+ {0x00000050, 0x00000060, 0x00000070, 0x00000080},
+ {0x00000090, 0x000000a0, 0x000000b0, 0x000000c0},
+ {0x000000d0, 0x000000e0, 0x000000f0, 0x000000ff},
+ {0x00000073, 0x00000077, 0x0000007a, 0x0000007b},
+ {0x0000007c, 0x0000007d, 0x0000007e, 0x0000007f},
+
+ {0x80000001, 0x80000002, 0x80000003, 0x80000004},
+ {0x800000ff, 0x800000fe, 0x800000fd, 0x800000fc},
+ {0x800000f2, 0x800000f1, 0x800000f0, 0x800000ef},
+ {0x8000000a, 0x0000000d, 0x8000000e, 0x8000000f},
+ {0x8000001a, 0x8000002d, 0x8000003e, 0x8000004f},
+ {0x80000050, 0x80000060, 0x80000070, 0x00000080},
+ {0x80000090, 0x800000a0, 0x800000b0, 0x800000c0},
+ {0x800000d0, 0x800000e0, 0x800000f0, 0x800000ff},
+ {0x80000073, 0x80000077, 0x8000007a, 0x8000007b},
+ {0x8000007c, 0x8000007d, 0x8000007e, 0x8000007f},
+
+ {0x7fffff01, 0x7fffff02, 0x7fffff03, 0x7fffff04},
+ {0x7fffffff, 0x7ffffffe, 0x7ffffffd, 0x7ffffffc},
+ {0x7ffffff2, 0x7ffffff1, 0x7ffffff0, 0x7fffffef},
+ {0x7fffff0a, 0x7fffff0d, 0x7fffff0e, 0x7fffff0f},
+ {0x7fffff1a, 0x7fffff2d, 0x7fffff3e, 0x7fffff4f},
+ {0x7fffff50, 0x7fffff60, 0x7fffff70, 0x7fffff80},
+ {0x8fffff90, 0x7fffffa0, 0x7fffffb0, 0x7fffffc0},
+ {0x7fffffd0, 0x7fffffe0, 0x7ffffff0, 0x7fffffff},
+ {0x7fffff73, 0x7fffff77, 0x7fffff7a, 0x7fffff7b},
+ {0x7fffff7c, 0x7fffff7d, 0x7fffff7e, 0x7fffff7f},
+
+ {0xffffff01, 0xffffff02, 0xffffff03, 0xffffff04},
+ {0xffffffff, 0xfffffffe, 0xfffffffd, 0xfffffffc},
+ {0xfffffff2, 0xfffffff1, 0xfffffff0, 0xffffffef},
+ {0xffffff0a, 0xffffff0d, 0xffffff0e, 0xffffff0f},
+ {0xffffff1a, 0xffffff2d, 0xffffff3e, 0xffffff4f},
+ {0xffffff50, 0xffffff60, 0xffffff70, 0xffffff80},
+ {0xffffff90, 0xffffffa0, 0xffffffb0, 0xffffffc0},
+ {0xffffffd0, 0xffffffe0, 0xfffffff0, 0xffffffff},
+ {0xffffff73, 0xffffff77, 0xffffff7a, 0xffffff7b},
+ {0xffffff7c, 0xffffff7d, 0xffffff7e, 0xffffff7f},
+ };
+
+ device_desc.feature_level = &feature_level;
+ device_desc.flags = 0;
+ if (!(device = create_device(&device_desc)))
+ {
+ skip("Failed to create device for feature level %#x.\n", feature_level);
+ return;
+ }
+
+ ID3D11Device_GetImmediateContext(device, &context);
+
+ /* Structured buffer views */
+ buffer_desc.ByteWidth = 64;
+ buffer_desc.Usage = D3D11_USAGE_DEFAULT;
+ buffer_desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
+ buffer_desc.CPUAccessFlags = 0;
+ buffer_desc.MiscFlags = 0;
+ buffer_desc.StructureByteStride = 0;
+ buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
+ buffer_desc.StructureByteStride = 4;
+ hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &buffer);
+ ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr);
+
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, NULL, &uav);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+
+ uav_desc.Format = DXGI_FORMAT_UNKNOWN;
+ uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+ U(uav_desc).Buffer.FirstElement = 0;
+ U(uav_desc).Buffer.NumElements = 4;
+ U(uav_desc).Buffer.Flags = 0;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav2);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(uvec4_data); ++i)
+ {
+ uvec4 = uvec4_data[i];
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav, &uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ {
+ DWORD data = get_readback_color(&rb, x, 0);
+ ok(data == uvec4.x, "Got unexpected value %#x at %u.\n", data, x);
+ }
+ release_resource_readback(&rb);
+
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav2, &fe_uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ {
+ DWORD data = get_readback_color(&rb, x, 0);
+ uvec4 = x < U(uav_desc).Buffer.NumElements ? fe_uvec4 : uvec4_data[i];
+ ok(data == uvec4.x, "Got unexpected value %#x at %u.\n", data, x);
+ }
+ release_resource_readback(&rb);
+ }
+
+ ID3D11Buffer_Release(buffer);
+ ID3D11UnorderedAccessView_Release(uav);
+ ID3D11UnorderedAccessView_Release(uav2);
+
+ /* Raw buffer views */
+ buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
+ hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &buffer);
+ ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr);
+
+ uav_desc.Format = DXGI_FORMAT_R32_TYPELESS;
+ uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+ U(uav_desc).Buffer.FirstElement = 0;
+ U(uav_desc).Buffer.NumElements = 16;
+ U(uav_desc).Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+ U(uav_desc).Buffer.FirstElement = 8;
+ U(uav_desc).Buffer.NumElements = 8;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav2);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(uvec4_data); ++i)
+ {
+ uvec4 = uvec4_data[i];
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav, &uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ {
+ DWORD data = get_readback_color(&rb, x, 0);
+ ok(data == uvec4.x, "Got unexpected value %#x at %u.\n", data, x);
+ }
+ release_resource_readback(&rb);
+
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav2, &fe_uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ {
+ DWORD data = get_readback_color(&rb, x, 0);
+ uvec4 = U(uav_desc).Buffer.FirstElement <= x ? fe_uvec4 : uvec4_data[i];
+ ok(data == uvec4.x, "Got unexpected value %#x at %u.\n", data, x);
+ }
+ release_resource_readback(&rb);
+ }
+
+ ID3D11Buffer_Release(buffer);
+ ID3D11UnorderedAccessView_Release(uav);
+ ID3D11UnorderedAccessView_Release(uav2);
+
+ /* Typed buffer views */
+ buffer_desc.MiscFlags = 0;
+ hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &buffer);
+ ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr);
+
+ uav_desc.Format = DXGI_FORMAT_R32_SINT;
+ uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+ U(uav_desc).Buffer.FirstElement = 0;
+ U(uav_desc).Buffer.NumElements = 16;
+ U(uav_desc).Buffer.Flags = 0;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+ U(uav_desc).Buffer.FirstElement = 9;
+ U(uav_desc).Buffer.NumElements = 7;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav2);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(uvec4_data); ++i)
+ {
+ uvec4 = uvec4_data[i];
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav, &uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ {
+ DWORD data = get_readback_color(&rb, x, 0);
+ ok(data == uvec4.x, "Got unexpected value %#x at %u.\n", data, x);
+ }
+ release_resource_readback(&rb);
+
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav2, &fe_uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ {
+ DWORD data = get_readback_color(&rb, x, 0);
+ uvec4 = U(uav_desc).Buffer.FirstElement <= x ? fe_uvec4 : uvec4_data[i];
+ ok(data == uvec4.x, "Got unexpected value %#x at %u.\n", data, x);
+ }
+ release_resource_readback(&rb);
+ }
+
+ ID3D11UnorderedAccessView_Release(uav);
+ ID3D11UnorderedAccessView_Release(uav2);
+
+ uav_desc.Format = DXGI_FORMAT_R32G32B32A32_SINT;
+ uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+ U(uav_desc).Buffer.FirstElement = 0;
+ U(uav_desc).Buffer.NumElements = 4;
+ U(uav_desc).Buffer.Flags = 0;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+ U(uav_desc).Buffer.FirstElement = 2;
+ U(uav_desc).Buffer.NumElements = 2;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav2);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(uvec4_data); ++i)
+ {
+ uvec4 = uvec4_data[i];
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav, &uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4); ++x)
+ {
+ const struct uvec4 *data = get_readback_uvec4(&rb, x, 0);
+ const struct uvec4 broken_result = {uvec4.x, uvec4.x, uvec4.x, uvec4.x}; /* Intel */
+ ok(compare_uvec4(data, &uvec4) || broken(compare_uvec4(data, &broken_result)),
+ "Got {%#x, %#x, %#x, %#x}, expected {%#x, %#x, %#x, %#x} at %u.\n",
+ data->x, data->y, data->z, data->w, uvec4.x, uvec4.y, uvec4.z, uvec4.w, i);
+ }
+ release_resource_readback(&rb);
+
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav2, &fe_uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4); ++x)
+ {
+ const struct uvec4 *data = get_readback_uvec4(&rb, x, 0);
+ struct uvec4 broken_result;
+ uvec4 = U(uav_desc).Buffer.FirstElement <= x ? fe_uvec4 : uvec4_data[i];
+ broken_result.x = broken_result.y = broken_result.z = broken_result.w = uvec4.x;
+ ok(compare_uvec4(data, &uvec4) || broken(compare_uvec4(data, &broken_result)),
+ "Got {%#x, %#x, %#x, %#x}, expected {%#x, %#x, %#x, %#x} at %u.\n",
+ data->x, data->y, data->z, data->w, uvec4.x, uvec4.y, uvec4.z, uvec4.w, i);
+ }
+ release_resource_readback(&rb);
+ }
+
+ uvec4.x = uvec4.y = uvec4.z = uvec4.w = 0xdeadbeef;
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav, &uvec4.x);
+ ID3D11UnorderedAccessView_Release(uav);
+ ID3D11UnorderedAccessView_Release(uav2);
+
+ uav_desc.Format = DXGI_FORMAT_R8G8B8A8_SINT;
+ uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+ U(uav_desc).Buffer.FirstElement = 0;
+ U(uav_desc).Buffer.NumElements = 16;
+ U(uav_desc).Buffer.Flags = 0;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+ U(uav_desc).Buffer.FirstElement = 8;
+ U(uav_desc).Buffer.NumElements = 8;
+ hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav2);
+ ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(uvec4_data); ++i)
+ {
+ uvec4 = uvec4_data[i];
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav, &uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ todo_wine check_rgba_sint8(get_readback_color(&rb, x, 0), &uvec4);
+ release_resource_readback(&rb);
+
+ ID3D11DeviceContext_ClearUnorderedAccessViewUint(context, uav2, &fe_uvec4.x);
+ get_buffer_readback(buffer, &rb);
+ for (x = 0; x < buffer_desc.ByteWidth / sizeof(uvec4.x); ++x)
+ {
+ uvec4 = U(uav_desc).Buffer.FirstElement <= x ? fe_uvec4 : uvec4_data[i];
+ todo_wine check_rgba_sint8(get_readback_color(&rb, x, 0), &uvec4);
+ }
+ release_resource_readback(&rb);
+ }
+
+ ID3D11UnorderedAccessView_Release(uav);
+ ID3D11UnorderedAccessView_Release(uav2);
+
+ ID3D11Buffer_Release(buffer);
+
+ ID3D11DeviceContext_Release(context);
+ refcount = ID3D11Device_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+}
+
static void test_draw_depth_only(void)
{
ID3D11DepthStencilState *depth_stencil_state;
@@ -17961,6 +18309,7 @@ START_TEST(d3d11)
test_swapchain_flip();
test_clear_render_target_view();
test_clear_depth_stencil_view();
+ test_clear_buffer_unordered_access_view();
test_draw_depth_only();
test_draw_uav_only();
test_cb_relative_addressing();
--
2.10.2
More information about the wine-patches
mailing list