-- v3: vkd3d-shader/dxil: Implement DX intrinsic RawBufferStore. vkd3d-shader/dxil: Handle raw and structured buffers in sm6_parser_emit_dx_buffer_store(). vkd3d-shader/dxil: Implement DX intrinsic BufferStore. tests/shader-runner: Add a test for a signed int structured buffer UAV. tests/shader-runner: Add a test for a signed int typed buffer UAV. tests/shader-runner: Support structured buffer UAVs.
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));
From: Conor McCarthy cmccarthy@codeweavers.com
Check for backend type mismatches resulting from the absence of signedness in SM 6. --- tests/hlsl/uav-rwbuffer.shader_test | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/tests/hlsl/uav-rwbuffer.shader_test b/tests/hlsl/uav-rwbuffer.shader_test index b476c7854..4a880042a 100644 --- a/tests/hlsl/uav-rwbuffer.shader_test +++ b/tests/hlsl/uav-rwbuffer.shader_test @@ -105,3 +105,16 @@ float4 main() : sv_target1 [test] todo(sm>=6) draw quad probe buffer uav 2 (0, 0) rgba (11.1, 12.2, 13.3, 14.4) + +[pixel shader] +RWBuffer<int4> u : register(u2); + +float4 main() : sv_target1 +{ + u[0] = int4(0x41300000, 0xc1400000, 0x41500000, 0xc1600000); + return 0; +} + +[test] +todo(sm>=6) draw quad +probe buffer uav 2 (0, 0) rgba (11, -12, 13, -14)
From: Conor McCarthy cmccarthy@codeweavers.com
Check for backend type mismatches resulting from the absence of signedness in SM 6. --- tests/hlsl/uav-rwstructuredbuffer.shader_test | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/tests/hlsl/uav-rwstructuredbuffer.shader_test b/tests/hlsl/uav-rwstructuredbuffer.shader_test index 888715fbc..b92d934e6 100644 --- a/tests/hlsl/uav-rwstructuredbuffer.shader_test +++ b/tests/hlsl/uav-rwstructuredbuffer.shader_test @@ -65,3 +65,22 @@ float4 main() : sv_target1 { return 0; } + +[buffer uav 2] +stride 16 +size (1, 1) + +0.1 0.2 0.3 0.4 + +[pixel shader todo] +RWStructuredBuffer<int4> u : register(u2); + +float4 main() : sv_target1 +{ + u[0] = int4(0x41300000, 0xc1400000, 0x41500000, 0xc1600000); + return 0; +} + +[test] +todo draw quad +probe buffer uav 2 (0, 0) rgba (11, -12, 13, -14)
From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/dxil.c | 65 ++++++++++++++++++- tests/hlsl/uav-rwbuffer.shader_test | 4 +- tests/hlsl/uav-rwstructuredbuffer.shader_test | 14 ++-- 3 files changed, 70 insertions(+), 13 deletions(-)
diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index a001f6f06..1a0a3ff58 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -372,6 +372,7 @@ enum dx_intrinsic_opcode DX_TEXTURE_LOAD = 66, DX_TEXTURE_STORE = 67, DX_BUFFER_LOAD = 68, + DX_BUFFER_STORE = 69, DX_DERIV_COARSEX = 83, DX_DERIV_COARSEY = 84, DX_DERIV_FINEX = 85, @@ -2266,7 +2267,7 @@ static void src_param_init_from_value(struct vkd3d_shader_src_param *param, cons static void src_param_init_vector_from_reg(struct vkd3d_shader_src_param *param, const struct vkd3d_shader_register *reg) { - param->swizzle = VKD3D_SHADER_NO_SWIZZLE; + param->swizzle = (reg->dimension == VSIR_DIMENSION_VEC4) ? VKD3D_SHADER_NO_SWIZZLE : VKD3D_SHADER_SWIZZLE(X, X, X, X); param->modifiers = VKD3DSPSM_NONE; param->reg = *reg; } @@ -4027,6 +4028,67 @@ static void sm6_parser_emit_dx_buffer_load(struct sm6_parser *sm6, enum dx_intri instruction_dst_param_init_ssa_vector(ins, VKD3D_VEC4_SIZE, sm6); }
+static void sm6_parser_emit_dx_buffer_store(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, + const struct sm6_value **operands, struct function_emission_state *state) +{ + struct vkd3d_shader_src_param *src_params; + struct vkd3d_shader_dst_param *dst_param; + unsigned int write_mask, component_count; + struct vkd3d_shader_instruction *ins; + struct vkd3d_shader_register texel; + const struct sm6_value *resource; + + resource = operands[0]; + if (!sm6_value_validate_is_handle(resource, sm6)) + return; + + if (resource->u.handle.d->kind != RESOURCE_KIND_TYPEDBUFFER) + { + WARN("Resource is not a typed buffer.\n"); + vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_INVALID_OPERATION, + "Resource for a typed buffer store is not a typed buffer."); + } + + write_mask = sm6_value_get_constant_uint(operands[7]); + if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL) + { + WARN("Invalid write mask %#x.\n", write_mask); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, + "Write mask %#x for a typed buffer store operation is invalid.", write_mask); + return; + } + else if (write_mask & (write_mask + 1)) + { + /* In this case, it is unclear which source operands will be defined unless we encounter it in a shader. */ + FIXME("Unhandled write mask %#x.\n", write_mask); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, + "Write mask %#x for a typed buffer store operation is unhandled.", write_mask); + } + component_count = vsir_write_mask_component_count(write_mask); + + if (!sm6_parser_emit_composite_construct(sm6, &operands[3], component_count, state, &texel)) + return; + + ins = state->ins; + vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_STORE_UAV_TYPED); + + if (!(src_params = instruction_src_params_alloc(ins, 2, sm6))) + return; + src_param_init_from_value(&src_params[0], operands[1]); + if (!sm6_value_is_undef(operands[2])) + { + /* Constant zero would have no effect, but is not worth checking for unless it shows up. */ + WARN("Ignoring structure offset.\n"); + vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS, + "Ignoring structure offset for a typed buffer store."); + } + src_param_init_vector_from_reg(&src_params[1], &texel); + + dst_param = instruction_dst_params_alloc(ins, 1, sm6); + dst_param_init_with_mask(dst_param, write_mask); + dst_param->reg = resource->u.handle.reg; +} + static unsigned int sm6_value_get_texel_offset(const struct sm6_value *value) { return sm6_value_is_undef(value) ? 0 : sm6_value_get_constant_uint(value); @@ -4256,6 +4318,7 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] = [DX_ATAN ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_BFREV ] = {"m", "R", sm6_parser_emit_dx_unary}, [DX_BUFFER_LOAD ] = {"o", "Hii", sm6_parser_emit_dx_buffer_load}, + [DX_BUFFER_STORE ] = {"v", "Hiiooooc", sm6_parser_emit_dx_buffer_store}, [DX_CBUFFER_LOAD_LEGACY ] = {"o", "Hi", sm6_parser_emit_dx_cbuffer_load}, [DX_COS ] = {"g", "R", sm6_parser_emit_dx_sincos}, [DX_COUNT_BITS ] = {"i", "m", sm6_parser_emit_dx_unary}, diff --git a/tests/hlsl/uav-rwbuffer.shader_test b/tests/hlsl/uav-rwbuffer.shader_test index 4a880042a..f30cf44f5 100644 --- a/tests/hlsl/uav-rwbuffer.shader_test +++ b/tests/hlsl/uav-rwbuffer.shader_test @@ -103,7 +103,7 @@ float4 main() : sv_target1 }
[test] -todo(sm>=6) draw quad +draw quad probe buffer uav 2 (0, 0) rgba (11.1, 12.2, 13.3, 14.4)
[pixel shader] @@ -116,5 +116,5 @@ float4 main() : sv_target1 }
[test] -todo(sm>=6) draw quad +draw quad probe buffer uav 2 (0, 0) rgba (11, -12, 13, -14) diff --git a/tests/hlsl/uav-rwstructuredbuffer.shader_test b/tests/hlsl/uav-rwstructuredbuffer.shader_test index b92d934e6..f4ee5d61b 100644 --- a/tests/hlsl/uav-rwstructuredbuffer.shader_test +++ b/tests/hlsl/uav-rwstructuredbuffer.shader_test @@ -32,8 +32,8 @@ float4 main() : sv_target1 }
[test] -todo draw quad -probe buffer uav 2 (0, 0) rgba (11.1, 12.2, 13.3, 14.4) +todo(sm<6) draw quad +todo probe buffer uav 2 (0, 0) rgba (11.1, 12.2, 13.3, 14.4)
% Array type [pixel shader] @@ -66,12 +66,6 @@ float4 main() : sv_target1 return 0; }
-[buffer uav 2] -stride 16 -size (1, 1) - -0.1 0.2 0.3 0.4 - [pixel shader todo] RWStructuredBuffer<int4> u : register(u2);
@@ -82,5 +76,5 @@ float4 main() : sv_target1 }
[test] -todo draw quad -probe buffer uav 2 (0, 0) rgba (11, -12, 13, -14) +todo(sm<6) draw quad +todo probe buffer uav 2 (0, 0) rgba (11, -12, 13, -14)
From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/dxil.c | 57 +++++++++++++++++++ tests/hlsl/uav-rwstructuredbuffer.shader_test | 4 +- 2 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 1a0a3ff58..32c91f4be 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -3987,6 +3987,57 @@ static void sm6_parser_emit_dx_raw_buffer_load(struct sm6_parser *sm6, enum dx_i instruction_dst_param_init_ssa_vector(ins, component_count, sm6); }
+static void sm6_parser_emit_dx_raw_buffer_store(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, + const struct sm6_value **operands, struct function_emission_state *state) +{ + unsigned int write_mask, component_count, operand_count; + struct vkd3d_shader_src_param *src_params; + struct vkd3d_shader_dst_param *dst_param; + struct vkd3d_shader_instruction *ins; + struct vkd3d_shader_register data; + const struct sm6_value *resource; + bool raw; + + resource = operands[0]; + if (!sm6_value_validate_is_handle(resource, sm6)) + return; + raw = resource->u.handle.d->kind == RESOURCE_KIND_RAWBUFFER; + + write_mask = sm6_value_get_constant_uint(operands[7]); + if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL) + { + WARN("Invalid write mask %#x.\n", write_mask); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, + "Write mask %#x for a raw/structured buffer store operation is invalid.", write_mask); + return; + } + else if (write_mask & (write_mask + 1)) + { + /* In this case, it is unclear which source operands will be defined unless we encounter it in a shader. */ + FIXME("Unhandled write mask %#x.\n", write_mask); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, + "Write mask %#x for a raw/structured buffer store operation is unhandled.", write_mask); + } + component_count = vsir_write_mask_component_count(write_mask); + + if (!sm6_parser_emit_composite_construct(sm6, &operands[3], component_count, state, &data)) + return; + + ins = state->ins; + vsir_instruction_init(ins, &sm6->p.location, raw ? VKD3DSIH_STORE_RAW : VKD3DSIH_STORE_STRUCTURED); + operand_count = 2 + !raw; + + if (!(src_params = instruction_src_params_alloc(ins, operand_count, sm6))) + return; + src_params_init_from_operands(src_params, &operands[1], operand_count - 1); + data.data_type = VKD3D_DATA_UINT; + src_param_init_vector_from_reg(&src_params[operand_count - 1], &data); + + dst_param = instruction_dst_params_alloc(ins, 1, sm6); + dst_param_init_with_mask(dst_param, write_mask); + dst_param->reg = resource->u.handle.reg; +} + static void sm6_parser_emit_dx_buffer_load(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, const struct sm6_value **operands, struct function_emission_state *state) { @@ -4042,6 +4093,12 @@ static void sm6_parser_emit_dx_buffer_store(struct sm6_parser *sm6, enum dx_intr if (!sm6_value_validate_is_handle(resource, sm6)) return;
+ if (resource->u.handle.d->kind == RESOURCE_KIND_RAWBUFFER + || resource->u.handle.d->kind == RESOURCE_KIND_STRUCTUREDBUFFER) + { + return sm6_parser_emit_dx_raw_buffer_store(sm6, op, operands, state); + } + if (resource->u.handle.d->kind != RESOURCE_KIND_TYPEDBUFFER) { WARN("Resource is not a typed buffer.\n"); diff --git a/tests/hlsl/uav-rwstructuredbuffer.shader_test b/tests/hlsl/uav-rwstructuredbuffer.shader_test index f4ee5d61b..5933800df 100644 --- a/tests/hlsl/uav-rwstructuredbuffer.shader_test +++ b/tests/hlsl/uav-rwstructuredbuffer.shader_test @@ -33,7 +33,7 @@ float4 main() : sv_target1
[test] todo(sm<6) draw quad -todo probe buffer uav 2 (0, 0) rgba (11.1, 12.2, 13.3, 14.4) +probe buffer uav 2 (0, 0) rgba (11.1, 12.2, 13.3, 14.4)
% Array type [pixel shader] @@ -77,4 +77,4 @@ float4 main() : sv_target1
[test] todo(sm<6) draw quad -todo probe buffer uav 2 (0, 0) rgba (11, -12, 13, -14) +probe buffer uav 2 (0, 0) rgba (11, -12, 13, -14)
From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/dxil.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 32c91f4be..4b86267ca 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -381,6 +381,7 @@ enum dx_intrinsic_opcode DX_LEGACY_F32TOF16 = 130, DX_LEGACY_F16TOF32 = 131, DX_RAW_BUFFER_LOAD = 139, + DX_RAW_BUFFER_STORE = 140, };
enum dxil_cast_code @@ -3990,7 +3991,7 @@ static void sm6_parser_emit_dx_raw_buffer_load(struct sm6_parser *sm6, enum dx_i static void sm6_parser_emit_dx_raw_buffer_store(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, const struct sm6_value **operands, struct function_emission_state *state) { - unsigned int write_mask, component_count, operand_count; + unsigned int write_mask, component_count, alignment = 0, operand_count; struct vkd3d_shader_src_param *src_params; struct vkd3d_shader_dst_param *dst_param; struct vkd3d_shader_instruction *ins; @@ -4020,6 +4021,17 @@ static void sm6_parser_emit_dx_raw_buffer_store(struct sm6_parser *sm6, enum dx_ } component_count = vsir_write_mask_component_count(write_mask);
+ if (op == DX_RAW_BUFFER_STORE) + { + alignment = sm6_value_get_constant_uint(operands[8]); + if (alignment & (alignment - 1)) + { + FIXME("Invalid alignment %#x.\n", alignment); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, + "Alignment %#x for a raw/structured buffer store operation is invalid.", alignment); + } + } + if (!sm6_parser_emit_composite_construct(sm6, &operands[3], component_count, state, &data)) return;
@@ -4036,6 +4048,7 @@ static void sm6_parser_emit_dx_raw_buffer_store(struct sm6_parser *sm6, enum dx_ dst_param = instruction_dst_params_alloc(ins, 1, sm6); dst_param_init_with_mask(dst_param, write_mask); dst_param->reg = resource->u.handle.reg; + dst_param->reg.alignment = alignment; }
static void sm6_parser_emit_dx_buffer_load(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, @@ -4405,6 +4418,7 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] = [DX_LOAD_INPUT ] = {"o", "ii8i", sm6_parser_emit_dx_load_input}, [DX_LOG ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_RAW_BUFFER_LOAD ] = {"o", "Hii8i", sm6_parser_emit_dx_raw_buffer_load}, + [DX_RAW_BUFFER_STORE ] = {"v", "Hiioooocc", sm6_parser_emit_dx_raw_buffer_store}, [DX_ROUND_NE ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_ROUND_NI ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_ROUND_PI ] = {"g", "R", sm6_parser_emit_dx_unary},
Giovanni Mascellani (@giomasce) commented about libs/vkd3d-shader/dxil.c:
} component_count = vsir_write_mask_component_count(write_mask);
- if (op == DX_RAW_BUFFER_STORE)
I guess it is illegal to have a type buffer here, isn't it? If so, maybe that could be validated?
How hard would it be to test raw storing too? (incidentally loading buffers of any type also seems completely untested)
On Mon Feb 19 14:11:56 2024 +0000, Giovanni Mascellani wrote:
How hard would it be to test raw storing too? (incidentally loading buffers of any type also seems completely untested)
`DX_RAW_BUFFER_STORE` is only emitted if SM 6.2 is specified. We'll need a way to test that at some point. It occurs in game shaders which don't use any other 6.2 features, so it's useful to have, but could be delayed too. We already have `DX_RAW_BUFFER_LOAD` though.
UAV loads seem to be broken in SM < 6, or there's an issue with writing the initial data, or both. The Vulkan and vkd3d runners have different failures, so testing loads will have to wait.