From: Nikolay Sivov nsivov@codeweavers.com
--- libs/vkd3d-shader/hlsl.h | 1 + libs/vkd3d-shader/hlsl.l | 1 + libs/vkd3d-shader/hlsl.y | 7 ++++++- libs/vkd3d-shader/tpf.c | 17 +++++++++++++++++ tests/uav.shader_test | 5 +++++ 5 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index 7186ddd3..a287dcb7 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -120,6 +120,7 @@ enum hlsl_sampler_dim
enum hlsl_uav_type { + HLSL_UAV_RWBUFFER, HLSL_UAV_RWTEXTURE1D, HLSL_UAV_RWTEXTURE2D, HLSL_UAV_RWTEXTURE3D, diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l index 10751bbe..9c76cc4e 100644 --- a/libs/vkd3d-shader/hlsl.l +++ b/libs/vkd3d-shader/hlsl.l @@ -103,6 +103,7 @@ RasterizerState {return KW_RASTERIZERSTATE; } RenderTargetView {return KW_RENDERTARGETVIEW; } return {return KW_RETURN; } register {return KW_REGISTER; } +RWBuffer {return KW_RWBUFFER; } 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 3741761d..286aa3f9 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -4155,6 +4155,7 @@ static void validate_texture_format_type(struct hlsl_ctx *ctx, struct hlsl_type %token KW_RETURN %token KW_REGISTER %token KW_ROW_MAJOR +%token KW_RWBUFFER %token KW_RWTEXTURE1D %token KW_RWTEXTURE2D %token KW_RWTEXTURE3D @@ -4965,7 +4966,11 @@ texture_ms_type: }
uav_type: - KW_RWTEXTURE1D + KW_RWBUFFER + { + $$ = HLSL_UAV_RWBUFFER; + } + | KW_RWTEXTURE1D { $$ = HLSL_UAV_RWTEXTURE1D; } diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 38d5c180..dd1b69f5 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -2931,6 +2931,23 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
static enum vkd3d_sm4_resource_type sm4_resource_dimension(const struct hlsl_type *type) { + if (type->base_type == HLSL_TYPE_UAV) + { + switch (type->e.uav.uav_type) + { + case HLSL_UAV_RWBUFFER: + return VKD3D_SM4_RESOURCE_BUFFER; + case HLSL_UAV_RWTEXTURE1D: + return VKD3D_SM4_RESOURCE_TEXTURE_1D; + case HLSL_UAV_RWTEXTURE2D: + return VKD3D_SM4_RESOURCE_TEXTURE_2D; + case HLSL_UAV_RWTEXTURE3D: + return VKD3D_SM4_RESOURCE_TEXTURE_3D; + default: + vkd3d_unreachable(); + } + } + switch (type->sampler_dim) { case HLSL_SAMPLER_DIM_1D: diff --git a/tests/uav.shader_test b/tests/uav.shader_test index f0eade4d..4afdf9df 100644 --- a/tests/uav.shader_test +++ b/tests/uav.shader_test @@ -161,3 +161,8 @@ float4 main() : sv_target1 todo draw quad probe uav 2 (0, 0) rgba (1.1, 1.2, 1.3, 1.4) probe uav 3 (0, 0) rgba (2.1, 2.2, 2.3, 2.4) + +[uav 1] +size (1, 1) + +0.1 0.2 0.3 0.4