diff --git a/src/vrend_shader.c b/src/vrend_shader.c index 94a0bd8..e36bd7f 100644 --- a/src/vrend_shader.c +++ b/src/vrend_shader.c @@ -3732,6 +3732,59 @@ void rewrite_io_ranged(struct dump_ctx *ctx) } +static void rename_variables(unsigned nio, struct vrend_shader_io *io, + const char *name_prefix, unsigned coord_replace) +{ + /* Rename the generic and patch variables after applying all identifications */ + for (unsigned i = 0; i < nio; ++i) { + if ((io[i].name != TGSI_SEMANTIC_GENERIC && + io[i].name != TGSI_SEMANTIC_PATCH) || + (coord_replace & (1 << io[i].sid))) + continue; + char io_type = io[i].name == TGSI_SEMANTIC_GENERIC ? 'g' : 'p'; + snprintf(io[i].glsl_name, 64, "%s_%c%dA%d_%x", name_prefix, io_type, io[i].sid, io[i].array_id, io[i].usage_mask); + } +} + +static +void rewrite_components(unsigned nio, struct vrend_shader_io *io, + const char *name_prefix, unsigned coord_replace, + bool no_input_arrays) +{ + if (!nio) + return; + + for (unsigned i = 0; i < nio - 1; ++i) { + if ((io[i].name != TGSI_SEMANTIC_GENERIC && + io[i].name != TGSI_SEMANTIC_PATCH) || + io[i].glsl_predefined_no_emit) + continue; + + for (unsigned j = i + 1; j < nio; ++j) { + if ((io[j].name != TGSI_SEMANTIC_GENERIC && + io[j].name != TGSI_SEMANTIC_PATCH) || + io[j].glsl_predefined_no_emit) + continue; + if (io[i].first == io[j].first) + io[j].glsl_predefined_no_emit = true; + } + } + + for (unsigned i = 0; i < nio; ++i) { + if ((io[i].name != TGSI_SEMANTIC_GENERIC && + io[i].name != TGSI_SEMANTIC_PATCH) || + !no_input_arrays) + continue; + + io[i].usage_mask = 0xf; + io[i].num_components = 4; + io[i].swizzle_offset = 0; + io[i].override_no_wm = false; + } + + rename_variables(nio, io, name_prefix, coord_replace); +} + static void emit_fs_clipdistance_load(struct dump_ctx *ctx) { @@ -3820,8 +3873,13 @@ iter_instruction(struct tgsi_iterate_context *iter, /* The guest didn't send real arrays, do we might have to add a big array * for all generic and another ofr patch inputs */ rewrite_io_ranged(ctx); - } + rewrite_components(ctx->num_inputs, ctx->inputs, + get_stage_input_name_prefix(ctx, ctx->prog_type), + ctx->key->coord_replace, true); + rewrite_components(ctx->num_outputs, ctx->outputs, + get_stage_output_name_prefix(ctx->prog_type), 0, true); + } emit_buf(ctx, "void main(void)\n{\n"); if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) {