From c99c7295132ef0ddd08e66726ada75ea917c368f Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Thu, 16 Oct 2025 12:31:37 +0200 Subject: [PATCH] vkd3d-shader/ir: Error out on unsupported destination modifiers. --- libs/vkd3d-shader/glsl.c | 4 ---- libs/vkd3d-shader/ir.c | 11 ++++++++++- libs/vkd3d-shader/msl.c | 4 ---- libs/vkd3d-shader/spirv.c | 10 ---------- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index a2c1532f1..305509e5b 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -489,15 +489,11 @@ static void VKD3D_PRINTF_FUNC(4, 0) shader_glsl_vprint_assignment(struct vkd3d_g struct glsl_dst *dst, enum vsir_data_type data_type, const char *format, va_list args) { struct vkd3d_string_buffer *buffer = gen->buffer; - uint32_t modifiers = dst->vsir->modifiers; bool close = true; if (dst->vsir->shift) vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, "Internal compiler error: Unhandled destination shift %#x.", dst->vsir->shift); - if (modifiers) - vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, - "Internal compiler error: Unhandled destination modifier(s) %#x.", modifiers); shader_glsl_print_indent(buffer, gen->indent); vkd3d_string_buffer_printf(buffer, "%s%s = ", dst->register_name->buffer, dst->mask->buffer); diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 4161e18dc..e1f10cc4e 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -2173,6 +2173,7 @@ static enum vkd3d_result vsir_program_lower_modifiers(struct vsir_program *progr { struct vsir_program_iterator it = vsir_program_iterator(&program->instructions), new_it; struct vkd3d_shader_instruction *ins, *new_ins; + enum vkd3d_result ret = VKD3D_OK; unsigned int i, j; for (ins = vsir_program_iterator_head(&it); ins; ins = vsir_program_iterator_next(&it)) @@ -2237,6 +2238,14 @@ static enum vkd3d_result vsir_program_lower_modifiers(struct vsir_program *progr /* It is always legitimate to ignore _pp. */ dst->modifiers &= ~VKD3DSPDM_PARTIALPRECISION; + if (dst->modifiers & ~VKD3DSPDM_SATURATE) + { + vkd3d_shader_error(ctx->message_context, &ins->location, VKD3D_SHADER_ERROR_VSIR_NOT_IMPLEMENTED, + "Aborting due to unimplemented feature: Destination modifier %#x.", dst->modifiers); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; + continue; + } + if (dst->modifiers & VKD3DSPDM_SATURATE) { if (!vsir_program_iterator_insert_after(&it, 1)) @@ -2267,7 +2276,7 @@ static enum vkd3d_result vsir_program_lower_modifiers(struct vsir_program *progr } } - return VKD3D_OK; + return ret; } static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *program, diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 5c08c89e2..043fbb3b7 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -674,15 +674,11 @@ static void msl_print_subscript(struct vkd3d_string_buffer *buffer, struct msl_g static void VKD3D_PRINTF_FUNC(3, 4) msl_print_assignment( struct msl_generator *gen, struct msl_dst *dst, const char *format, ...) { - uint32_t modifiers = dst->vsir->modifiers; va_list args; if (dst->vsir->shift) msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, "Internal compiler error: Unhandled destination shift %#x.", dst->vsir->shift); - if (modifiers) - msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, - "Internal compiler error: Unhandled destination modifier(s) %#x.", modifiers); msl_print_indent(gen->buffer, gen->indent); vkd3d_string_buffer_printf(gen->buffer, "%s%s = ", dst->register_name->buffer, dst->mask->buffer); diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 0794860f3..e5b871f29 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -4981,16 +4981,6 @@ static uint32_t spirv_compiler_emit_sat(struct spirv_compiler *compiler, static void spirv_compiler_emit_store_dst(struct spirv_compiler *compiler, const struct vkd3d_shader_dst_param *dst, uint32_t val_id) { - uint32_t modifiers = dst->modifiers; - - if (modifiers & VKD3DSPDM_MSAMPCENTROID) - { - FIXME("Ignoring _centroid modifier.\n"); - modifiers &= ~VKD3DSPDM_MSAMPCENTROID; - } - - VKD3D_ASSERT(!modifiers); - spirv_compiler_emit_store_reg(compiler, &dst->reg, dst->write_mask, val_id); }