[PATCH vkd3d 4/9] vkd3d-shader: Only sample with the required number of components.

Conor McCarthy cmccarthy at codeweavers.com
Tue Sep 28 00:38:13 CDT 2021


Works around a driver bug on NV which affected RE2 in particular, but
probably other titles as well.

Based on a vkd3d-proton patch by Hans-Kristian Arntzen.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d-shader/spirv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index ac544acb..19e9cfc6 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -8177,7 +8177,10 @@ static void vkd3d_dxbc_compiler_emit_sample(struct vkd3d_dxbc_compiler *compiler
     }
 
     sampled_type_id = vkd3d_spirv_get_type_id(builder, image.sampled_type, VKD3D_VEC4_SIZE);
-    coordinate_id = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[0], VKD3DSP_WRITEMASK_ALL);
+    /* Technically, we can always pass vec4 down to sample operations, but NV drivers currently
+     * have a bug here when using texture arrays. */
+    coordinate_id = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[0],
+            vkd3d_write_mask_from_component_count(image.resource_type_info->coordinate_component_count));
     assert(image_operand_count <= ARRAY_SIZE(image_operands));
     val_id = vkd3d_spirv_build_op_image_sample(builder, op, sampled_type_id,
             image.sampled_image_id, coordinate_id, operands_mask, image_operands, image_operand_count);
-- 
2.32.0




More information about the wine-devel mailing list