mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
tests: Add a basic shader test for UAVs.
Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com> Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
2b69ee67bd
commit
08e2a8e9bb
@ -132,6 +132,7 @@ vkd3d_shader_tests = \
|
||||
tests/texture-load.shader_test \
|
||||
tests/texture-load-typed.shader_test \
|
||||
tests/trigonometry.shader_test \
|
||||
tests/uav.shader_test \
|
||||
tests/writemask-assignop-0.shader_test \
|
||||
tests/writemask-assignop-1.shader_test \
|
||||
tests/writemask-assignop-2.shader_test \
|
||||
|
@ -370,6 +370,8 @@ static void set_uniforms(struct shader_runner *runner, size_t offset, size_t cou
|
||||
|
||||
static void parse_test_directive(struct shader_runner *runner, const char *line)
|
||||
{
|
||||
char *rest;
|
||||
|
||||
runner->is_todo = false;
|
||||
|
||||
if (match_string(line, "todo", &line))
|
||||
@ -475,19 +477,33 @@ static void parse_test_directive(struct shader_runner *runner, const char *line)
|
||||
if (runner->last_render_failed)
|
||||
return;
|
||||
|
||||
resource = get_resource(runner, RESOURCE_TYPE_RENDER_TARGET, 0);
|
||||
if (match_string(line, "uav", &line))
|
||||
{
|
||||
unsigned int slot = strtoul(line, &rest, 10);
|
||||
|
||||
if (rest == line)
|
||||
fatal_error("Malformed UAV index '%s'.\n", line);
|
||||
line = rest;
|
||||
|
||||
resource = get_resource(runner, RESOURCE_TYPE_UAV, slot);
|
||||
}
|
||||
else
|
||||
{
|
||||
resource = get_resource(runner, RESOURCE_TYPE_RENDER_TARGET, 0);
|
||||
}
|
||||
|
||||
rb = runner->ops->get_resource_readback(runner, resource);
|
||||
|
||||
if (match_string(line, "all", &line))
|
||||
{
|
||||
set_rect(&rect, 0, 0, resource->width, resource->height);
|
||||
}
|
||||
else if (sscanf(line, "( %d , %d , %d , %d )%n", &left, &top, &right, &bottom, &len) == 4)
|
||||
else if (sscanf(line, " ( %d , %d , %d , %d )%n", &left, &top, &right, &bottom, &len) == 4)
|
||||
{
|
||||
set_rect(&rect, left, top, right, bottom);
|
||||
line += len;
|
||||
}
|
||||
else if (sscanf(line, "( %u , %u )%n", &left, &top, &len) == 2)
|
||||
else if (sscanf(line, " ( %u , %u )%n", &left, &top, &len) == 2)
|
||||
{
|
||||
set_rect(&rect, left, top, left + 1, top + 1);
|
||||
line += len;
|
||||
|
@ -373,16 +373,20 @@ static struct resource_readback *d3d12_runner_get_resource_readback(struct shade
|
||||
struct test_context *test_context = &runner->test_context;
|
||||
struct d3d12_resource_readback *rb = malloc(sizeof(*rb));
|
||||
struct d3d12_resource *resource = d3d12_resource(res);
|
||||
D3D12_RESOURCE_STATES state;
|
||||
|
||||
assert(resource->r.type == RESOURCE_TYPE_RENDER_TARGET);
|
||||
if (resource->r.type == RESOURCE_TYPE_RENDER_TARGET)
|
||||
state = D3D12_RESOURCE_STATE_RENDER_TARGET;
|
||||
else
|
||||
state = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
|
||||
|
||||
transition_resource_state(test_context->list, resource->resource,
|
||||
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
||||
state, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
||||
get_texture_readback_with_command_list(resource->resource, 0, rb,
|
||||
test_context->queue, test_context->list);
|
||||
reset_command_list(test_context->list, test_context->allocator);
|
||||
transition_resource_state(test_context->list, resource->resource,
|
||||
D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
|
||||
D3D12_RESOURCE_STATE_COPY_SOURCE, state);
|
||||
|
||||
return &rb->rb;
|
||||
}
|
||||
|
@ -943,8 +943,12 @@ static struct resource_readback *vulkan_runner_get_resource_readback(struct shad
|
||||
struct vulkan_resource *resource = vulkan_resource(res);
|
||||
VkDevice device = runner->device;
|
||||
VkBufferImageCopy region = {0};
|
||||
VkImageLayout layout;
|
||||
|
||||
assert(resource->r.type == RESOURCE_TYPE_RENDER_TARGET);
|
||||
if (resource->r.type == RESOURCE_TYPE_RENDER_TARGET)
|
||||
layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
else
|
||||
layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
|
||||
rb->rb.width = resource->r.width;
|
||||
rb->rb.height = resource->r.height;
|
||||
@ -957,8 +961,7 @@ static struct resource_readback *vulkan_runner_get_resource_readback(struct shad
|
||||
|
||||
begin_command_buffer(runner);
|
||||
|
||||
transition_image_layout(runner, resource->image,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
||||
transition_image_layout(runner, resource->image, layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
||||
|
||||
region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
region.imageSubresource.layerCount = 1;
|
||||
@ -969,8 +972,7 @@ static struct resource_readback *vulkan_runner_get_resource_readback(struct shad
|
||||
VK_CALL(vkCmdCopyImageToBuffer(runner->cmd_buffer, resource->image,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, rb->buffer, 1, ®ion));
|
||||
|
||||
transition_image_layout(runner, resource->image,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
|
||||
transition_image_layout(runner, resource->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, layout);
|
||||
|
||||
end_command_buffer(runner);
|
||||
|
||||
|
56
tests/uav.shader_test
Normal file
56
tests/uav.shader_test
Normal file
@ -0,0 +1,56 @@
|
||||
[require]
|
||||
shader model >= 5.0
|
||||
|
||||
[pixel shader fail]
|
||||
RWTexture2D<float4> u;
|
||||
|
||||
float4 main() : sv_target
|
||||
{
|
||||
/* All four components must be written in a single statement. */
|
||||
u[uint2(0, 0)].xy = float4(1, 2);
|
||||
u[uint2(0, 0)].zw = float4(3, 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
[pixel shader fail]
|
||||
Texture2D<float4> u;
|
||||
|
||||
float4 main() : sv_target
|
||||
{
|
||||
/* SRVs are not writable. */
|
||||
u[uint2(0, 0)].xyzw = float4(1, 2, 3, 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
[uav 1]
|
||||
format r32 float
|
||||
size (2, 2)
|
||||
|
||||
0.1 0.2
|
||||
0.3 0.4
|
||||
|
||||
[uav 2]
|
||||
size (1, 1)
|
||||
|
||||
0.5 0.6 0.7 0.8
|
||||
|
||||
[pixel shader]
|
||||
RWTexture2D<float> u;
|
||||
RWTexture2D<float4> v;
|
||||
|
||||
float4 main() : sv_target
|
||||
{
|
||||
u[uint2(0, 0)] = 0.5;
|
||||
u[uint2(0, 1)].x = 0.6;
|
||||
u[uint2(1, 1)] = 0.7;
|
||||
v[uint2(0, 0)].yxwz = float4(1, 2, 3, 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
[test]
|
||||
todo draw quad
|
||||
probe uav 1 (0, 0) r (0.5)
|
||||
probe uav 1 (0, 1) r (0.6)
|
||||
probe uav 1 (1, 0) r (0.2)
|
||||
probe uav 1 (1, 1) r (0.7)
|
||||
probe uav 2 (0, 0) rgba (2.0, 1.0, 4.0, 3.0)
|
Loading…
x
Reference in New Issue
Block a user