tests/shader_runner: Require explicit formats for UAV resources.

The current default is r32g32b32a32 but it requires special support
which is not available on all GPUs, so it is not a very convenient
default.

Instead of changing the default making it different from RTV resoures,
the format is required to always be explicit for UAVs.

The exceptions are counter_buffer and buffers with "stride", which don't
require a format because it is already implied.
This commit is contained in:
Francisco Casas 2024-07-31 21:48:19 -04:00 committed by Henri Verbeet
parent 738ecc9eb1
commit 164076d176
Notes: Henri Verbeet 2024-08-22 16:43:21 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/991
6 changed files with 20 additions and 2 deletions

View File

@ -8,6 +8,7 @@ size (2d, 2, 2)
0.3 0.4 0.3 0.4
[uav 1] [uav 1]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.5 0.6 0.7 0.8 0.5 0.6 0.7 0.8
@ -59,6 +60,7 @@ probe uav 1 (0, 0) rgba (2.0, 1.0, 4.0, 3.0)
[uav 2] [uav 2]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4
@ -92,10 +94,12 @@ probe uav 2 (0, 0) rgba (0.9, 0.8, 0.7, 0.6)
% Test that we can declare and use an array of UAVs. % Test that we can declare and use an array of UAVs.
[uav 1] [uav 1]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4
[uav 2] [uav 2]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.5 0.6 0.7 0.8 0.5 0.6 0.7 0.8

View File

@ -2,7 +2,6 @@
shader model >= 5.0 shader model >= 5.0
[uav 1] [uav 1]
format r32 uint
size (counter_buffer, 1) size (counter_buffer, 1)
0 0
@ -21,7 +20,6 @@ probe uav 1 (0) rui (12)
[uav 1] [uav 1]
format r32 sint
size (counter_buffer, 1) size (counter_buffer, 1)
0 0

View File

@ -185,6 +185,7 @@ probe uav 1 (0) rgbai (11, -12, 13, -14)
probe uav 1 (1) rgbai (-15, 16, -17, 18) probe uav 1 (1) rgbai (-15, 16, -17, 18)
[uav 2] [uav 2]
format r32g32b32a32 float
size (buffer, 1) size (buffer, 1)
0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4

View File

@ -32,6 +32,7 @@ size (2d, 2, 2)
0.3 0.4 0.3 0.4
[uav 2] [uav 2]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.5 0.6 0.7 0.8 0.5 0.6 0.7 0.8
@ -68,6 +69,7 @@ format r32g32b32a32 float
size (2d, 640, 480) size (2d, 640, 480)
[uav 2] [uav 2]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4
@ -105,6 +107,7 @@ probe uav 2 (0, 0) rgba (0.9, 0.8, 0.7, 0.6)
[uav 3] [uav 3]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4
@ -139,11 +142,13 @@ probe uav 3 (0, 0) rgba (0.9, 0.8, 0.7, 0.6)
% Test that we can declare and use an array of UAVs. % Test that we can declare and use an array of UAVs.
[uav 2] [uav 2]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4
[uav 3] [uav 3]
format r32g32b32a32 float
size (2d, 1, 1) size (2d, 1, 1)
0.5 0.6 0.7 0.8 0.5 0.6 0.7 0.8

View File

@ -498,6 +498,8 @@ static void parse_resource_directive(struct resource_params *resource, const cha
{ {
resource->desc.format = parse_format(line, &resource->data_type, resource->desc.format = parse_format(line, &resource->data_type,
&resource->desc.texel_size, &resource->is_shadow, &line); &resource->desc.texel_size, &resource->is_shadow, &line);
assert_that(!resource->explicit_format, "Resource format already specified.\n");
resource->explicit_format = true;
} }
else if (match_string(line, "stride", &line)) else if (match_string(line, "stride", &line))
{ {
@ -505,6 +507,8 @@ static void parse_resource_directive(struct resource_params *resource, const cha
fatal_error("Malformed texture stride '%s'.\n", line); fatal_error("Malformed texture stride '%s'.\n", line);
resource->desc.texel_size = resource->stride; resource->desc.texel_size = resource->stride;
resource->desc.format = DXGI_FORMAT_UNKNOWN; resource->desc.format = DXGI_FORMAT_UNKNOWN;
assert_that(!resource->explicit_format, "Resource format already specified.\n");
resource->explicit_format = true;
} }
else if (match_string(line, "size", &line)) else if (match_string(line, "size", &line))
{ {
@ -527,6 +531,8 @@ static void parse_resource_directive(struct resource_params *resource, const cha
resource->stride = sizeof(uint32_t); resource->stride = sizeof(uint32_t);
resource->desc.texel_size = resource->stride; resource->desc.texel_size = resource->stride;
resource->desc.format = DXGI_FORMAT_UNKNOWN; resource->desc.format = DXGI_FORMAT_UNKNOWN;
assert_that(!resource->explicit_format, "Resource format already specified.\n");
resource->explicit_format = true;
} }
else if (sscanf(line, "( 2d , %u , %u ) ", &resource->desc.width, &resource->desc.height) == 2) else if (sscanf(line, "( 2d , %u , %u ) ", &resource->desc.width, &resource->desc.height) == 2)
{ {
@ -1698,6 +1704,9 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_c
if (current_resource.desc.type == RESOURCE_TYPE_VERTEX_BUFFER) if (current_resource.desc.type == RESOURCE_TYPE_VERTEX_BUFFER)
current_resource.desc.width = current_resource.data_size; current_resource.desc.width = current_resource.data_size;
if (current_resource.desc.type == RESOURCE_TYPE_UAV)
assert_that(current_resource.explicit_format, "Format must be specified for UAV resources.\n");
/* Not every backend supports every resource type /* Not every backend supports every resource type
* (specifically, D3D9 doesn't support UAVs and * (specifically, D3D9 doesn't support UAVs and
* textures with data type other than float). */ * textures with data type other than float). */

View File

@ -104,6 +104,7 @@ struct resource_params
bool is_shadow; bool is_shadow;
bool is_raw; bool is_raw;
bool is_uav_counter; bool is_uav_counter;
bool explicit_format;
enum texture_data_type data_type; enum texture_data_type data_type;
unsigned int stride; unsigned int stride;