From cf17882189e77f86042daf78968bb3d54dce2d74 Mon Sep 17 00:00:00 2001 From: Francisco Casas Date: Fri, 18 Nov 2022 11:38:33 -0300 Subject: [PATCH] vkd3d-shader/hlsl: Support offset argument for the texture Load() method. --- libs/vkd3d-shader/hlsl_sm4.c | 16 ++++++++++++++-- tests/texture-load-offset.shader_test | 10 +++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index e06f4b15..06035a63 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -1441,7 +1441,8 @@ static void write_sm4_constant(struct hlsl_ctx *ctx, static void write_sm4_ld(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer, const struct hlsl_type *resource_type, const struct hlsl_ir_node *dst, - const struct hlsl_deref *resource, const struct hlsl_ir_node *coords) + const struct hlsl_deref *resource, const struct hlsl_ir_node *coords, + const struct hlsl_ir_node *texel_offset) { bool uav = (resource_type->base_type == HLSL_TYPE_UAV); struct sm4_instruction instr; @@ -1450,6 +1451,16 @@ static void write_sm4_ld(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buf memset(&instr, 0, sizeof(instr)); instr.opcode = uav ? VKD3D_SM5_OP_LD_UAV_TYPED : VKD3D_SM4_OP_LD; + if (texel_offset) + { + if (!encode_texel_offset_as_aoffimmi(&instr, texel_offset)) + { + hlsl_error(ctx, &texel_offset->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TEXEL_OFFSET, + "Offset must resolve to integer literal in the range -8 to 7."); + return; + } + } + sm4_dst_from_node(&instr.dsts[0], dst); instr.dst_count = 1; @@ -2204,7 +2215,8 @@ static void write_sm4_resource_load(struct hlsl_ctx *ctx, switch (load->load_type) { case HLSL_RESOURCE_LOAD: - write_sm4_ld(ctx, buffer, resource_type, &load->node, &load->resource, coords); + write_sm4_ld(ctx, buffer, resource_type, &load->node, &load->resource, + coords, texel_offset); break; case HLSL_RESOURCE_SAMPLE: diff --git a/tests/texture-load-offset.shader_test b/tests/texture-load-offset.shader_test index ab233c58..6d732190 100644 --- a/tests/texture-load-offset.shader_test +++ b/tests/texture-load-offset.shader_test @@ -8,7 +8,7 @@ size (3, 3) 0 2 0 1 1 2 0 1 2 2 0 1 -[pixel shader] +[pixel shader todo] Texture2D t; float4 main(float4 pos : sv_position) : sv_target @@ -18,14 +18,14 @@ float4 main(float4 pos : sv_position) : sv_target [test] -draw quad +todo draw quad todo probe (0, 0) rgba (0, 1, 0, 1) todo probe (1, 0) rgba (1, 1, 0, 1) todo probe (0, 1) rgba (0, 2, 0, 1) todo probe (1, 1) rgba (1, 2, 0, 1) -[pixel shader] +[pixel shader todo] Texture2D t; float4 main(float4 pos : sv_position) : sv_target @@ -35,14 +35,14 @@ float4 main(float4 pos : sv_position) : sv_target [test] -draw quad +todo draw quad todo probe (3, 0) rgba (1, 0, 0, 1) todo probe (4, 0) rgba (2, 0, 0, 1) todo probe (3, 1) rgba (1, 1, 0, 1) todo probe (4, 1) rgba (2, 1, 0, 1) -[pixel shader fail todo] +[pixel shader fail] Texture2D t; float4 main(float4 pos : sv_position) : sv_target