From: Conor McCarthy cmccarthy@codeweavers.com
--- tests/hlsl/uav-rwstructuredbuffer.shader_test | 10 ++++++++++ tests/shader_runner.c | 7 +++++++ tests/shader_runner.h | 1 + tests/shader_runner_d3d11.c | 17 +++++++++-------- tests/shader_runner_d3d12.c | 4 +++- 5 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/tests/hlsl/uav-rwstructuredbuffer.shader_test b/tests/hlsl/uav-rwstructuredbuffer.shader_test index 904d15514..888715fbc 100644 --- a/tests/hlsl/uav-rwstructuredbuffer.shader_test +++ b/tests/hlsl/uav-rwstructuredbuffer.shader_test @@ -1,6 +1,12 @@ [require] shader model >= 5.0
+[buffer uav 2] +stride 16 +size (1, 1) + +0.1 0.2 0.3 0.4 + [pixel shader todo] struct s { @@ -25,6 +31,10 @@ float4 main() : sv_target1 return 0; }
+[test] +todo draw quad +probe buffer uav 2 (0, 0) rgba (11.1, 12.2, 13.3, 14.4) + % Array type [pixel shader] typedef float arr[2]; diff --git a/tests/shader_runner.c b/tests/shader_runner.c index fe5ee5972..4983cddcb 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -420,6 +420,13 @@ static void parse_resource_directive(struct resource_params *resource, const cha { resource->format = parse_format(line, &resource->data_type, &resource->texel_size, &line); } + else if (match_string(line, "stride", &line)) + { + ret = sscanf(line, "%u", &resource->stride); + if (ret < 1) + fatal_error("Malformed texture stride '%s'.\n", line); + resource->texel_size = resource->stride; + } else if (match_string(line, "size", &line)) { ret = sscanf(line, "( %u , %u )", &resource->width, &resource->height); diff --git a/tests/shader_runner.h b/tests/shader_runner.h index a17fa485b..7e630a9fb 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -81,6 +81,7 @@ struct resource_params DXGI_FORMAT format; enum texture_data_type data_type; unsigned int texel_size; + unsigned int stride; unsigned int width, height; unsigned int level_count; uint8_t *data; diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index 1e22d44ef..a58c83f3d 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -338,7 +338,8 @@ static bool d3d11_runner_check_requirements(struct shader_runner *r) return true; }
-static ID3D11Buffer *create_buffer(ID3D11Device *device, unsigned int bind_flags, unsigned int size, const void *data) +static ID3D11Buffer *create_buffer(ID3D11Device *device, unsigned int bind_flags, unsigned int size, + unsigned int stride, const void *data) { D3D11_SUBRESOURCE_DATA resource_data; D3D11_BUFFER_DESC buffer_desc; @@ -349,8 +350,8 @@ static ID3D11Buffer *create_buffer(ID3D11Device *device, unsigned int bind_flags buffer_desc.Usage = D3D11_USAGE_DEFAULT; buffer_desc.BindFlags = bind_flags; buffer_desc.CPUAccessFlags = 0; - buffer_desc.MiscFlags = 0; - buffer_desc.StructureByteStride = 0; + buffer_desc.MiscFlags = stride ? D3D11_RESOURCE_MISC_BUFFER_STRUCTURED : 0; + buffer_desc.StructureByteStride = stride;
resource_data.pSysMem = data; resource_data.SysMemPitch = 0; @@ -434,10 +435,10 @@ static struct resource *d3d11_runner_create_resource(struct shader_runner *r, co { D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc;
- resource->buffer = create_buffer(device, D3D11_BIND_UNORDERED_ACCESS, params->data_size, params->data); + resource->buffer = create_buffer(device, D3D11_BIND_UNORDERED_ACCESS, params->data_size, params->stride, params->data); resource->resource = (ID3D11Resource *)resource->buffer;
- uav_desc.Format = params->format; + uav_desc.Format = params->stride ? DXGI_FORMAT_UNKNOWN : params->format; uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; uav_desc.Buffer.FirstElement = 0; uav_desc.Buffer.NumElements = params->data_size / params->texel_size; @@ -448,7 +449,7 @@ static struct resource *d3d11_runner_create_resource(struct shader_runner *r, co }
case RESOURCE_TYPE_VERTEX_BUFFER: - resource->buffer = create_buffer(device, D3D11_BIND_VERTEX_BUFFER, params->data_size, params->data); + resource->buffer = create_buffer(device, D3D11_BIND_VERTEX_BUFFER, params->data_size, params->stride, params->data); resource->resource = (ID3D11Resource *)resource->buffer; break; } @@ -512,7 +513,7 @@ static bool d3d11_runner_dispatch(struct shader_runner *r, unsigned int x, unsig ID3D11Buffer *cb;
cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, - runner->r.uniform_count * sizeof(*runner->r.uniforms), runner->r.uniforms); + runner->r.uniform_count * sizeof(*runner->r.uniforms), 0, runner->r.uniforms); ID3D11DeviceContext_CSSetConstantBuffers(context, 0, 1, &cb); ID3D11Buffer_Release(cb); } @@ -593,7 +594,7 @@ static bool d3d11_runner_draw(struct shader_runner *r, if (runner->r.uniform_count) { cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, - runner->r.uniform_count * sizeof(*runner->r.uniforms), runner->r.uniforms); + runner->r.uniform_count * sizeof(*runner->r.uniforms), 0, runner->r.uniforms); ID3D11DeviceContext_PSSetConstantBuffers(context, 0, 1, &cb); }
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 16cfec1ba..e52d5bcba 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -210,9 +210,11 @@ static struct resource *d3d12_runner_create_resource(struct shader_runner *r, co RESOURCE_STATE_DO_NOT_CHANGE, D3D12_RESOURCE_STATE_UNORDERED_ACCESS); reset_command_list(test_context->list, test_context->allocator);
- uav_desc.Format = params->format; + uav_desc.Format = params->stride ? DXGI_FORMAT_UNKNOWN : params->format; uav_desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; uav_desc.Buffer.NumElements = params->width * params->height; + if (params->stride) + uav_desc.Buffer.StructureByteStride = params->stride;
ID3D12Device_CreateUnorderedAccessView(device, resource->resource, NULL, &uav_desc, get_cpu_descriptor_handle(test_context, runner->heap, resource->r.slot + MAX_RESOURCES));