From 86b8f2de3546603c67e1f2828a68b1cd0aa049df Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Thu, 16 Oct 2025 12:33:45 +0200 Subject: [PATCH] vkd3d-shader/ir: Error out on unsupported source modifiers. --- libs/vkd3d-shader/glsl.c | 20 +++----------------- libs/vkd3d-shader/ir.c | 7 ++++++- libs/vkd3d-shader/msl.c | 21 +++------------------ libs/vkd3d-shader/spirv.c | 4 ---- 4 files changed, 12 insertions(+), 40 deletions(-) diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index 305509e5b..073282db1 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -392,7 +392,7 @@ static void shader_glsl_print_src(struct vkd3d_string_buffer *buffer, struct vkd const struct vkd3d_shader_src_param *vsir_src, uint32_t mask, enum vsir_data_type data_type) { const struct vkd3d_shader_register *reg = &vsir_src->reg; - struct vkd3d_string_buffer *register_name, *str; + struct vkd3d_string_buffer *register_name; enum vsir_data_type src_data_type; unsigned int size; @@ -409,25 +409,11 @@ static void shader_glsl_print_src(struct vkd3d_string_buffer *buffer, struct vkd shader_glsl_print_register_name(register_name, gen, reg); - if (!vsir_src->modifiers) - str = buffer; - else - str = vkd3d_string_buffer_get(&gen->string_buffers); - size = reg->dimension == VSIR_DIMENSION_VEC4 ? 4 : 1; - shader_glsl_print_bitcast(str, gen, register_name->buffer, data_type, src_data_type, size); + shader_glsl_print_bitcast(buffer, gen, register_name->buffer, data_type, src_data_type, size); if (reg->dimension == VSIR_DIMENSION_VEC4) - shader_glsl_print_swizzle(str, vsir_src->swizzle, mask); + shader_glsl_print_swizzle(buffer, vsir_src->swizzle, mask); - if (vsir_src->modifiers) - { - vkd3d_string_buffer_printf(buffer, "(%s)", vsir_src->modifiers, str->buffer); - vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL, - "Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers); - } - - if (str != buffer) - vkd3d_string_buffer_release(&gen->string_buffers, str); vkd3d_string_buffer_release(&gen->string_buffers, register_name); } diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index e1f10cc4e..000c78aee 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -2183,9 +2183,11 @@ static enum vkd3d_result vsir_program_lower_modifiers(struct vsir_program *progr enum vkd3d_shader_opcode new_opcodes[2] = {VSIR_OP_NOP, VSIR_OP_NOP}; struct vkd3d_shader_src_param *src = &ins->src[i]; - /* TODO: support other modifiers, including destination modifiers. */ switch (src->modifiers) { + case VKD3DSPSM_NONE: + continue; + case VKD3DSPSM_ABS: new_opcodes[0] = VSIR_OP_ABS; break; @@ -2200,6 +2202,9 @@ static enum vkd3d_result vsir_program_lower_modifiers(struct vsir_program *progr break; default: + vkd3d_shader_error(ctx->message_context, &ins->location, VKD3D_SHADER_ERROR_VSIR_NOT_IMPLEMENTED, + "Aborting due to unimplemented feature: Source modifier %#x.", src->modifiers); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; continue; } diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 043fbb3b7..3e7bf831e 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -583,7 +583,7 @@ static void msl_print_src_with_type(struct vkd3d_string_buffer *buffer, struct m const struct vkd3d_shader_src_param *vsir_src, uint32_t mask, enum vsir_data_type data_type) { const struct vkd3d_shader_register *reg = &vsir_src->reg; - struct vkd3d_string_buffer *register_name, *str; + struct vkd3d_string_buffer *register_name; enum msl_data_type src_data_type; register_name = vkd3d_string_buffer_get(&gen->string_buffers); @@ -592,25 +592,10 @@ static void msl_print_src_with_type(struct vkd3d_string_buffer *buffer, struct m msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, "Internal compiler error: Unhandled 'non-uniform' modifier."); - if (!vsir_src->modifiers) - str = buffer; - else - str = vkd3d_string_buffer_get(&gen->string_buffers); - src_data_type = msl_print_register_name(register_name, gen, reg); - msl_print_bitcast(str, gen, register_name->buffer, data_type, src_data_type, reg->dimension); + msl_print_bitcast(buffer, gen, register_name->buffer, data_type, src_data_type, reg->dimension); if (reg->dimension == VSIR_DIMENSION_VEC4) - msl_print_swizzle(str, vsir_src->swizzle, mask); - - if (vsir_src->modifiers) - { - vkd3d_string_buffer_printf(buffer, "(%s)", vsir_src->modifiers, str->buffer); - msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, - "Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers); - } - - if (str != buffer) - vkd3d_string_buffer_release(&gen->string_buffers, str); + msl_print_swizzle(buffer, vsir_src->swizzle, mask); } static void msl_src_init(struct msl_src *msl_src, struct msl_generator *gen, diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index e5b871f29..d720e10ef 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -4823,10 +4823,6 @@ static void spirv_compiler_emit_execution_mode1(struct spirv_compiler *compiler, static uint32_t spirv_compiler_emit_load_src(struct spirv_compiler *compiler, const struct vkd3d_shader_src_param *src, uint32_t write_mask) { - if (src->modifiers) - spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED, - "Unhandled source modifier(s) %#x.", src->modifiers); - return spirv_compiler_emit_load_reg(compiler, &src->reg, src->swizzle, write_mask); }