d3d11/tests: Add test for 2D array texture UAVs.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2016-12-09 11:30:47 +01:00 committed by Alexandre Julliard
parent 26aa82416f
commit 0f08eddb15
1 changed files with 74 additions and 8 deletions

View File

@ -11403,7 +11403,7 @@ static void test_uav_load(void)
UINT miplevel_count; UINT miplevel_count;
UINT array_size; UINT array_size;
DXGI_FORMAT format; DXGI_FORMAT format;
D3D11_SUBRESOURCE_DATA data[1]; D3D11_SUBRESOURCE_DATA data[3];
}; };
/* FIXME: Use a single R32_TYPELESS RT with multiple RTVs. */ /* FIXME: Use a single R32_TYPELESS RT with multiple RTVs. */
@ -11421,6 +11421,7 @@ static void test_uav_load(void)
ID3D11PixelShader *ps; ID3D11PixelShader *ps;
ID3D11Device *device; ID3D11Device *device;
unsigned int i, x, y; unsigned int i, x, y;
ID3D11Buffer *cb;
HRESULT hr; HRESULT hr;
static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f}; static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
@ -11506,6 +11507,37 @@ static void test_uav_load(void)
0x00102012, 0x00000000, 0x0010000a, 0x00000000, 0x0100003e, 0x00102012, 0x00000000, 0x0010000a, 0x00000000, 0x0100003e,
}; };
static const struct shader ps_ld_2d_int = {ps_ld_2d_int_code, sizeof(ps_ld_2d_int_code)}; static const struct shader ps_ld_2d_int = {ps_ld_2d_int_code, sizeof(ps_ld_2d_int_code)};
static const DWORD ps_ld_2d_uint_arr_code[] =
{
#if 0
RWTexture2DArray<uint> u;
uint layer;
uint main(float4 position : SV_Position) : SV_Target
{
float3 s;
u.GetDimensions(s.x, s.y, s.z);
s.z = layer;
return u[s * float3(position.x / 640.0f, position.y / 480.0f, 1.0f)];
}
#endif
0x43425844, 0xa7630358, 0xd7e7228f, 0xa9f1be03, 0x838554f1, 0x00000001, 0x000001bc, 0x00000003,
0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x7469736f, 0x006e6f69,
0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001,
0x00000000, 0x00000e01, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000120, 0x00000050,
0x00000048, 0x0100086a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x0400409c, 0x0011e000,
0x00000001, 0x00004444, 0x04002064, 0x00101032, 0x00000000, 0x00000001, 0x03000065, 0x00102012,
0x00000000, 0x02000068, 0x00000001, 0x8900003d, 0x80000202, 0x00111103, 0x00100032, 0x00000000,
0x00004001, 0x00000000, 0x0011ee46, 0x00000001, 0x07000038, 0x00100032, 0x00000000, 0x00100046,
0x00000000, 0x00101046, 0x00000000, 0x06000056, 0x001000c2, 0x00000000, 0x00208006, 0x00000000,
0x00000000, 0x0a000038, 0x001000f2, 0x00000000, 0x00100e46, 0x00000000, 0x00004002, 0x3acccccd,
0x3b088889, 0x3f800000, 0x3f800000, 0x0500001c, 0x001000f2, 0x00000000, 0x00100e46, 0x00000000,
0x890000a3, 0x80000202, 0x00111103, 0x00100012, 0x00000000, 0x00100e46, 0x00000000, 0x0011ee46,
0x00000001, 0x05000036, 0x00102012, 0x00000000, 0x0010000a, 0x00000000, 0x0100003e,
};
static const struct shader ps_ld_2d_uint_arr = {ps_ld_2d_uint_arr_code, sizeof(ps_ld_2d_uint_arr_code)};
static const float float_data[] = static const float float_data[] =
{ {
0.50f, 0.25f, 1.00f, 0.00f, 0.50f, 0.25f, 1.00f, 0.00f,
@ -11520,6 +11552,20 @@ static void test_uav_load(void)
0x80, 0x90, 0xa0, 0xb0, 0x80, 0x90, 0xa0, 0xb0,
0xc0, 0xd0, 0xe0, 0xf0, 0xc0, 0xd0, 0xe0, 0xf0,
}; };
static const unsigned int uint_data2[] =
{
0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xc000, 0xc000, 0xffff,
0xffff, 0xc000, 0xc000, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff,
};
static const unsigned int uint_data3[] =
{
0xaa, 0xaa, 0xcc, 0xcc,
0xaa, 0xaa, 0xdd, 0xdd,
0xbb, 0xbb, 0xee, 0xee,
0xbb, 0xbb, 0xff, 0xff,
};
static const int int_data[] = static const int int_data[] =
{ {
-1, 0x10, 0x20, 0x30, -1, 0x10, 0x20, 0x30,
@ -11531,6 +11577,10 @@ static void test_uav_load(void)
{{float_data, 4 * sizeof(*float_data), 0}}}; {{float_data, 4 * sizeof(*float_data), 0}}};
static const struct texture uint_2d = {4, 4, 1, 1, DXGI_FORMAT_R32_UINT, static const struct texture uint_2d = {4, 4, 1, 1, DXGI_FORMAT_R32_UINT,
{{uint_data, 4 * sizeof(*uint_data), 0}}}; {{uint_data, 4 * sizeof(*uint_data), 0}}};
static const struct texture uint2d_arr = {4, 4, 1, 3, DXGI_FORMAT_R32_UINT,
{{uint_data, 4 * sizeof(*uint_data), 0},
{uint_data2, 4 * sizeof(*uint_data2), 0},
{uint_data3, 4 * sizeof(*uint_data3), 0}}};
static const struct texture int_2d = {4, 4, 1, 1, DXGI_FORMAT_R32_SINT, static const struct texture int_2d = {4, 4, 1, 1, DXGI_FORMAT_R32_SINT,
{{int_data, 4 * sizeof(*int_data), 0}}}; {{int_data, 4 * sizeof(*int_data), 0}}};
@ -11539,18 +11589,27 @@ static void test_uav_load(void)
const struct shader *ps; const struct shader *ps;
const struct texture *texture; const struct texture *texture;
struct uav_desc uav_desc; struct uav_desc uav_desc;
struct uvec4 constant;
const DWORD *expected_colors; const DWORD *expected_colors;
} }
tests[] = tests[] =
{ {
#define TEX_2D D3D11_UAV_DIMENSION_TEXTURE2D #define TEX_2D D3D11_UAV_DIMENSION_TEXTURE2D
#define TEX_2D_ARRAY D3D11_UAV_DIMENSION_TEXTURE2DARRAY
#define R32_FLOAT DXGI_FORMAT_R32_FLOAT #define R32_FLOAT DXGI_FORMAT_R32_FLOAT
#define R32_UINT DXGI_FORMAT_R32_UINT #define R32_UINT DXGI_FORMAT_R32_UINT
#define R32_SINT DXGI_FORMAT_R32_SINT #define R32_SINT DXGI_FORMAT_R32_SINT
{&ps_ld_2d_float, &float_2d, {R32_FLOAT, TEX_2D, 0}, (const DWORD *)float_data}, {&ps_ld_2d_float, &float_2d, {R32_FLOAT, TEX_2D, 0}, {}, (const DWORD *)float_data},
{&ps_ld_2d_uint, &uint_2d, {R32_UINT, TEX_2D, 0}, (const DWORD *)uint_data}, {&ps_ld_2d_uint, &uint_2d, {R32_UINT, TEX_2D, 0}, {}, (const DWORD *)uint_data},
{&ps_ld_2d_int, &int_2d, {R32_SINT, TEX_2D, 0}, (const DWORD *)int_data}, {&ps_ld_2d_int, &int_2d, {R32_SINT, TEX_2D, 0}, {}, (const DWORD *)int_data},
{&ps_ld_2d_uint_arr, &uint2d_arr, {R32_UINT, TEX_2D_ARRAY, 0, 0, ~0u}, {0}, (const DWORD *)uint_data},
{&ps_ld_2d_uint_arr, &uint2d_arr, {R32_UINT, TEX_2D_ARRAY, 0, 0, ~0u}, {1}, (const DWORD *)uint_data2},
{&ps_ld_2d_uint_arr, &uint2d_arr, {R32_UINT, TEX_2D_ARRAY, 0, 0, ~0u}, {2}, (const DWORD *)uint_data3},
{&ps_ld_2d_uint_arr, &uint2d_arr, {R32_UINT, TEX_2D_ARRAY, 0, 1, ~0u}, {0}, (const DWORD *)uint_data2},
{&ps_ld_2d_uint_arr, &uint2d_arr, {R32_UINT, TEX_2D_ARRAY, 0, 1, ~0u}, {1}, (const DWORD *)uint_data3},
{&ps_ld_2d_uint_arr, &uint2d_arr, {R32_UINT, TEX_2D_ARRAY, 0, 2, ~0u}, {0}, (const DWORD *)uint_data3},
#undef TEX_2D #undef TEX_2D
#undef TEX_2D_ARRAY
#undef R32_FLOAT #undef R32_FLOAT
#undef R32_UINT #undef R32_UINT
#undef R32_SINT #undef R32_SINT
@ -11593,6 +11652,9 @@ static void test_uav_load(void)
texture_desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; texture_desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, sizeof(struct uvec4), NULL);
ID3D11DeviceContext_PSSetConstantBuffers(context, 0, 1, &cb);
ps = NULL; ps = NULL;
uav = NULL; uav = NULL;
texture = NULL; texture = NULL;
@ -11604,6 +11666,9 @@ static void test_uav_load(void)
ID3D11RenderTargetView *current_rtv; ID3D11RenderTargetView *current_rtv;
ID3D11Texture2D *current_rt; ID3D11Texture2D *current_rt;
ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0,
NULL, &test->constant, 0, 0);
if (current_ps != test->ps) if (current_ps != test->ps)
{ {
if (ps) if (ps)
@ -11687,6 +11752,7 @@ static void test_uav_load(void)
ID3D11Texture2D_Release(texture); ID3D11Texture2D_Release(texture);
ID3D11UnorderedAccessView_Release(uav); ID3D11UnorderedAccessView_Release(uav);
ID3D11Buffer_Release(cb);
ID3D11RenderTargetView_Release(rtv_float); ID3D11RenderTargetView_Release(rtv_float);
ID3D11RenderTargetView_Release(rtv_sint); ID3D11RenderTargetView_Release(rtv_sint);
ID3D11RenderTargetView_Release(rtv_uint); ID3D11RenderTargetView_Release(rtv_uint);