vkd3d-shader/spirv: Interpret the write mask as a destination swizzle for double comparison operations.

This fixes a failure on a shader in Wild hearts.
This commit is contained in:
Giovanni Mascellani
2025-01-21 12:01:13 +01:00
committed by Henri Verbeet
parent 4d18fb39b6
commit 343022cdc1
Notes: Henri Verbeet 2025-01-22 15:04:30 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1351
2 changed files with 57 additions and 2 deletions

View File

@@ -8193,6 +8193,7 @@ static void spirv_compiler_emit_comparison_instruction(struct spirv_compiler *co
const struct vkd3d_shader_dst_param *dst = instruction->dst;
const struct vkd3d_shader_src_param *src = instruction->src;
uint32_t src0_id, src1_id, type_id, result_id;
uint32_t write_mask = dst->write_mask;
unsigned int component_count;
SpvOp op;
@@ -8223,8 +8224,21 @@ static void spirv_compiler_emit_comparison_instruction(struct spirv_compiler *co
component_count = vsir_write_mask_component_count(dst->write_mask);
src0_id = spirv_compiler_emit_load_src(compiler, &src[0], dst->write_mask);
src1_id = spirv_compiler_emit_load_src(compiler, &src[1], dst->write_mask);
switch (instruction->opcode)
{
case VKD3DSIH_DEQO:
case VKD3DSIH_DGEO:
case VKD3DSIH_DLT:
case VKD3DSIH_DNE:
write_mask = vkd3d_write_mask_from_component_count(component_count);
break;
default:
break;
}
src0_id = spirv_compiler_emit_load_src(compiler, &src[0], write_mask);
src1_id = spirv_compiler_emit_load_src(compiler, &src[1], write_mask);
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_BOOL, component_count);
result_id = vkd3d_spirv_build_op_tr2(builder, &builder->function_stream,