diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index d5e2e0f6b..88c87ae33 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -419,19 +419,11 @@ static void shader_glsl_print_src(struct vkd3d_string_buffer *buffer, struct vkd if (reg->dimension == VSIR_DIMENSION_VEC4) shader_glsl_print_swizzle(str, vsir_src->swizzle, mask); - switch (vsir_src->modifiers) + if (vsir_src->modifiers) { - case VKD3DSPSM_NONE: - break; - case VKD3DSPSM_ABSNEG: - vkd3d_string_buffer_printf(buffer, "-abs(%s)", str->buffer); - break; - default: - 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); - break; + 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) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 80717c7ff..13ea8a433 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -2179,37 +2179,42 @@ 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; - unsigned int i; + unsigned int i, j; for (ins = vsir_program_iterator_head(&it); ins; ins = vsir_program_iterator_next(&it)) { for (i = 0; i < ins->src_count; ++i) { + enum vkd3d_shader_opcode new_opcodes[2] = {VSIR_OP_NOP, VSIR_OP_NOP}; struct vkd3d_shader_src_param *src = &ins->src[i]; - enum vkd3d_shader_opcode new_opcode = VSIR_OP_NOP; /* TODO: support other modifiers, including destination modifiers. */ switch (src->modifiers) { case VKD3DSPSM_ABS: - new_opcode = VSIR_OP_ABS; + new_opcodes[0] = VSIR_OP_ABS; break; case VKD3DSPSM_NEG: - new_opcode = data_type_is_integer(src->reg.data_type) ? VSIR_OP_INEG : VSIR_OP_NEG; + new_opcodes[0] = data_type_is_integer(src->reg.data_type) ? VSIR_OP_INEG : VSIR_OP_NEG; + break; + + case VKD3DSPSM_ABSNEG: + new_opcodes[0] = VSIR_OP_ABS; + new_opcodes[1] = VSIR_OP_NEG; break; default: continue; } - if (new_opcode != VSIR_OP_NOP) + for (j = 0; j < 2 && new_opcodes[j] != VSIR_OP_NOP; ++j) { if (!(new_ins = vsir_program_iterator_insert_before(&it, &new_it, 1))) return VKD3D_ERROR_OUT_OF_MEMORY; ins = vsir_program_iterator_current(&it); - if (!vsir_instruction_init_with_params(program, new_ins, &ins->location, new_opcode, 1, 1)) + if (!vsir_instruction_init_with_params(program, new_ins, &ins->location, new_opcodes[j], 1, 1)) { vkd3d_shader_instruction_make_nop(new_ins); return VKD3D_ERROR_OUT_OF_MEMORY; diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index ef00a784a..fc136e3ac 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -602,19 +602,11 @@ static void msl_print_src_with_type(struct vkd3d_string_buffer *buffer, struct m if (reg->dimension == VSIR_DIMENSION_VEC4) msl_print_swizzle(str, vsir_src->swizzle, mask); - switch (vsir_src->modifiers) + if (vsir_src->modifiers) { - case VKD3DSPSM_NONE: - break; - case VKD3DSPSM_ABSNEG: - vkd3d_string_buffer_printf(buffer, "-abs(%s)", str->buffer); - break; - default: - 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); - break; + 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) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 0130c7eca..bcbd9baa4 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -2116,20 +2116,6 @@ static uint32_t vkd3d_spirv_build_op_fdiv(struct vkd3d_spirv_builder *builder, SpvOpFDiv, result_type, operand0, operand1); } -static uint32_t vkd3d_spirv_build_op_fnegate(struct vkd3d_spirv_builder *builder, - uint32_t result_type, uint32_t operand) -{ - return vkd3d_spirv_build_op_tr1(builder, &builder->function_stream, - SpvOpFNegate, result_type, operand); -} - -static uint32_t vkd3d_spirv_build_op_snegate(struct vkd3d_spirv_builder *builder, - uint32_t result_type, uint32_t operand) -{ - return vkd3d_spirv_build_op_tr1(builder, &builder->function_stream, - SpvOpSNegate, result_type, operand); -} - static uint32_t vkd3d_spirv_build_op_and(struct vkd3d_spirv_builder *builder, uint32_t result_type, uint32_t operand0, uint32_t operand1) { @@ -2478,19 +2464,6 @@ static uint32_t vkd3d_spirv_build_op_group_nonuniform_broadcast_first(struct vkd result_type, vkd3d_spirv_get_op_scope_subgroup(builder), val_id); } -static uint32_t vkd3d_spirv_build_op_glsl_std450_tr1(struct vkd3d_spirv_builder *builder, - enum GLSLstd450 op, uint32_t result_type, uint32_t operand) -{ - uint32_t id = vkd3d_spirv_get_glsl_std450_instr_set(builder); - return vkd3d_spirv_build_op_ext_inst(builder, result_type, id, op, &operand, 1); -} - -static uint32_t vkd3d_spirv_build_op_glsl_std450_fabs(struct vkd3d_spirv_builder *builder, - uint32_t result_type, uint32_t operand) -{ - return vkd3d_spirv_build_op_glsl_std450_tr1(builder, GLSLstd450FAbs, result_type, operand); -} - static uint32_t vkd3d_spirv_build_op_glsl_std450_max(struct vkd3d_spirv_builder *builder, uint32_t result_type, uint32_t x, uint32_t y) { @@ -4844,62 +4817,14 @@ static void spirv_compiler_emit_execution_mode1(struct spirv_compiler *compiler, spirv_compiler_emit_execution_mode(compiler, mode, &literal, 1); } -static uint32_t spirv_compiler_emit_abs(struct spirv_compiler *compiler, - const struct vkd3d_shader_register *reg, uint32_t write_mask, uint32_t val_id) -{ - struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; - uint32_t type_id; - - type_id = spirv_compiler_get_type_id_for_reg(compiler, reg, write_mask); - if (data_type_is_floating_point(reg->data_type)) - return vkd3d_spirv_build_op_glsl_std450_fabs(builder, type_id, val_id); - - FIXME("Unhandled data type %#x.\n", reg->data_type); - return val_id; -} - -static uint32_t spirv_compiler_emit_neg(struct spirv_compiler *compiler, - const struct vkd3d_shader_register *reg, uint32_t write_mask, uint32_t val_id) -{ - struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; - uint32_t type_id; - - type_id = spirv_compiler_get_type_id_for_reg(compiler, reg, write_mask); - if (data_type_is_floating_point(reg->data_type)) - return vkd3d_spirv_build_op_fnegate(builder, type_id, val_id); - else if (data_type_is_integer(reg->data_type)) - return vkd3d_spirv_build_op_snegate(builder, type_id, val_id); - - FIXME("Unhandled data type %#x.\n", reg->data_type); - return val_id; -} - -static uint32_t spirv_compiler_emit_src_modifier(struct spirv_compiler *compiler, - const struct vkd3d_shader_register *reg, uint32_t write_mask, - enum vkd3d_shader_src_modifier modifier, uint32_t val_id) -{ - switch (modifier) - { - case VKD3DSPSM_NONE: - break; - case VKD3DSPSM_ABSNEG: - val_id = spirv_compiler_emit_abs(compiler, reg, write_mask, val_id); - return spirv_compiler_emit_neg(compiler, reg, write_mask, val_id); - default: - FIXME("Unhandled src modifier %#x.\n", modifier); - break; - } - - return val_id; -} - static uint32_t spirv_compiler_emit_load_src(struct spirv_compiler *compiler, const struct vkd3d_shader_src_param *src, uint32_t write_mask) { - uint32_t val_id; + if (src->modifiers) + spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED, + "Unhandled source modifier(s) %#x.", src->modifiers); - val_id = spirv_compiler_emit_load_reg(compiler, &src->reg, src->swizzle, write_mask); - return spirv_compiler_emit_src_modifier(compiler, &src->reg, write_mask, src->modifiers, val_id); + return spirv_compiler_emit_load_reg(compiler, &src->reg, src->swizzle, write_mask); } static uint32_t spirv_compiler_emit_load_src_with_type(struct spirv_compiler *compiler,