From: Ethan Lee <flibitijibibo(a)gmail.com> Per Francisco Casas <fcasas(a)codeweavers.com>: I just realized one more thing. I think we are not properly following the specification for both sample_l and sample_b. In the Restrictions section of the documentation for sample_b it is mentioned that the last src register must use a single component selector if it is not a scalar immediate. This "select_component" is also ilustrated in the sample_l format: sample_l[_aoffimmi(u,v,w)] dest[.mask], srcAddress[.swizzle], srcResource[.swizzle], srcSampler, srcLOD.select_component Currently, we are not respecting that since sm4_src_from_node() sets src->swizzle_type = VKD3D_SM4_SWIZZLE_VEC4; by default. It should be VKD3D_SM4_SWIZZLE_SCALAR in this case... The disassembly should show a single component in the swizzle of the last src register. Signed-off-by: Ethan Lee <flibitijibibo(a)gmail.com> --- libs/vkd3d-shader/tpf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 8a6a4cee..717e6f81 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -3788,6 +3788,7 @@ static void write_sm4_sample(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer || load->load_type == HLSL_RESOURCE_SAMPLE_LOD_BIAS) { sm4_src_from_node(&instr.srcs[3], load->lod.node, VKD3DSP_WRITEMASK_ALL); + instr.srcs[3].swizzle_type = VKD3D_SM4_SWIZZLE_SCALAR; ++instr.src_count; } else if (load->load_type == HLSL_RESOURCE_SAMPLE_GRAD) -- GitLab https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/188