From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- libs/vkd3d-shader/hlsl.h | 1 + libs/vkd3d-shader/hlsl.l | 1 + libs/vkd3d-shader/hlsl.y | 5 +++++ libs/vkd3d-shader/tpf.c | 31 ++++++++++++++++++++++++++++--- 4 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index a287dcb7..b97dbb89 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -121,6 +121,7 @@ enum hlsl_sampler_dim enum hlsl_uav_type { HLSL_UAV_RWBUFFER, + HLSL_UAV_RWSTRUCTUREDBUFFER, HLSL_UAV_RWTEXTURE1D, HLSL_UAV_RWTEXTURE2D, HLSL_UAV_RWTEXTURE3D, diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index 9c76cc4e..19e0f2fa 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -104,6 +104,7 @@ RenderTargetView {return KW_RENDERTARGETVIEW; } return {return KW_RETURN; } register {return KW_REGISTER; } RWBuffer {return KW_RWBUFFER; } +RWStructuredBuffer {return KW_RWSTRUCTUREDBUFFER; } RWTexture1D {return KW_RWTEXTURE1D; } RWTexture2D {return KW_RWTEXTURE2D; } RWTexture3D {return KW_RWTEXTURE3D; } diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 286aa3f9..05af739b 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -4156,6 +4156,7 @@ static void validate_texture_format_type(struct hlsl_ctx *ctx, struct hlsl_type %token KW_REGISTER %token KW_ROW_MAJOR %token KW_RWBUFFER +%token KW_RWSTRUCTUREDBUFFER %token KW_RWTEXTURE1D %token KW_RWTEXTURE2D %token KW_RWTEXTURE3D @@ -4970,6 +4971,10 @@ uav_type: { $$ = HLSL_UAV_RWBUFFER; } + | KW_RWSTRUCTUREDBUFFER + { + $$ = HLSL_UAV_RWSTRUCTUREDBUFFER; + } | KW_RWTEXTURE1D { $$ = HLSL_UAV_RWTEXTURE1D; diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index dd1b69f5..4d57ccd9 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -2936,6 +2936,7 @@ static enum vkd3d_sm4_resource_type sm4_resource_dimension(const struct hlsl_typ switch (type->e.uav.uav_type) { case HLSL_UAV_RWBUFFER: + case HLSL_UAV_RWSTRUCTUREDBUFFER: return VKD3D_SM4_RESOURCE_BUFFER; case HLSL_UAV_RWTEXTURE1D: return VKD3D_SM4_RESOURCE_TEXTURE_1D; @@ -3044,6 +3045,8 @@ struct sm4_instruction
uint32_t idx[3]; unsigned int idx_count; + + unsigned int byte_stride; };
static void sm4_register_from_deref(struct hlsl_ctx *ctx, struct sm4_register *reg, @@ -3268,6 +3271,8 @@ static void write_sm4_instruction(struct vkd3d_bytecode_buffer *buffer, const st for (i = 0; i < instr->src_count; ++i) size += sm4_register_order(&instr->srcs[i].reg); size += instr->idx_count; + if (instr->byte_stride) + ++size;
token |= (size << VKD3D_SM4_INSTRUCTION_LENGTH_SHIFT);
@@ -3322,6 +3327,9 @@ static void write_sm4_instruction(struct vkd3d_bytecode_buffer *buffer, const st } }
+ if (instr->byte_stride) + put_u32(buffer, instr->byte_stride); + for (j = 0; j < instr->idx_count; ++j) put_u32(buffer, instr->idx[j]); } @@ -3385,9 +3393,6 @@ static void write_sm4_dcl_texture(struct vkd3d_bytecode_buffer *buffer, const st bool uav = (var->data_type->base_type == HLSL_TYPE_UAV); struct sm4_instruction instr = { - .opcode = (uav ? VKD3D_SM5_OP_DCL_UAV_TYPED : VKD3D_SM4_OP_DCL_RESOURCE) - | (sm4_resource_dimension(var->data_type) << VKD3D_SM4_RESOURCE_TYPE_SHIFT), - .dsts[0].reg.type = uav ? VKD3D_SM5_RT_UAV : VKD3D_SM4_RT_RESOURCE, .dsts[0].reg.idx = {uav ? var->regs[HLSL_REGSET_UAVS].id : var->regs[HLSL_REGSET_TEXTURES].id}, .dsts[0].reg.idx_count = 1, @@ -3397,6 +3402,26 @@ static void write_sm4_dcl_texture(struct vkd3d_bytecode_buffer *buffer, const st .idx_count = 1, };
+ if (uav) + { + switch (var->data_type->e.uav.uav_type) + { + case HLSL_UAV_RWBUFFER: + case HLSL_UAV_RWTEXTURE1D: + case HLSL_UAV_RWTEXTURE2D: + case HLSL_UAV_RWTEXTURE3D: + instr.opcode = VKD3D_SM5_OP_DCL_UAV_TYPED; + break; + case HLSL_UAV_RWSTRUCTUREDBUFFER: + instr.opcode = VKD3D_SM5_OP_DCL_UAV_STRUCTURED; + instr.byte_stride = var->data_type->e.uav.format->reg_size[HLSL_REGSET_NUMERIC] * 4; + break; + } + } + else + instr.opcode = VKD3D_SM4_OP_DCL_RESOURCE; + instr.opcode |= (sm4_resource_dimension(var->data_type) << VKD3D_SM4_RESOURCE_TYPE_SHIFT); + if (var->data_type->sampler_dim == HLSL_SAMPLER_DIM_2DMS || var->data_type->sampler_dim == HLSL_SAMPLER_DIM_2DMSARRAY) {