Module: vkd3d
Branch: master
Commit: 18adf0d726a3134e6c30bea1518fe96ea0285374
URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/18adf0d726a3134e6c30bea1518fe…
Author: Francisco Casas <fcasas(a)codeweavers.com>
Date: Thu Nov 17 18:02:39 2022 -0300
vkd3d-shader/hlsl: Use aoffimmis when writing gather resource loads.
If the offset of a gather resource load can be represented as an
aoffimmi (vectori of ints from -8 to 7), use one.
This is of particular importance for 4.0 profiles, where this is the only
valid way of representing offsets for this operation.
---
libs/vkd3d-shader/hlsl_sm4.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index 06035a63..62266780 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -2154,11 +2154,19 @@ static void write_sm4_gather(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer
sm4_src_from_node(&instr.srcs[instr.src_count++], coords, VKD3DSP_WRITEMASK_ALL);
- /* FIXME: Use an aoffimmi modifier if possible. */
if (texel_offset)
{
- instr.opcode = VKD3D_SM5_OP_GATHER4_PO;
- sm4_src_from_node(&instr.srcs[instr.src_count++], texel_offset, VKD3DSP_WRITEMASK_ALL);
+ if (!encode_texel_offset_as_aoffimmi(&instr, texel_offset))
+ {
+ if (ctx->profile->major_version < 5)
+ {
+ 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 for profiles < 5.");
+ return;
+ }
+ instr.opcode = VKD3D_SM5_OP_GATHER4_PO;
+ sm4_src_from_node(&instr.srcs[instr.src_count++], texel_offset, VKD3DSP_WRITEMASK_ALL);
+ }
}
sm4_src_from_deref(ctx, &instr.srcs[instr.src_count++], resource, resource_type, instr.dsts[0].writemask);