shader: bundle vrend_generic_ios

Refactor vrend_shader.c by packing variables related to generic inputs/outputs into
struct vrend_generic_ios.

Signed-off-by: Ryan Neph <ryanneph@google.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
macos/master
Ryan Neph 4 years ago
parent a1d262bc95
commit d73a6bc373
  1. 186
      src/vrend_shader.c

@ -157,6 +157,15 @@ struct vrend_glsl_strbufs {
struct vrend_strbuf glsl_ver_ext; struct vrend_strbuf glsl_ver_ext;
}; };
struct vrend_generic_ios {
struct vrend_io_range input_range;
struct vrend_io_range output_range;
uint32_t outputs_expected_mask;
uint32_t inputs_emitted_mask;
uint32_t outputs_emitted_mask;
};
struct dump_ctx { struct dump_ctx {
struct tgsi_iterate_context iter; struct tgsi_iterate_context iter;
const struct vrend_shader_cfg *cfg; const struct vrend_shader_cfg *cfg;
@ -179,14 +188,9 @@ struct dump_ctx {
struct vrend_shader_io system_values[32]; struct vrend_shader_io system_values[32];
bool guest_sent_io_arrays; bool guest_sent_io_arrays;
struct vrend_io_range generic_input_range;
struct vrend_io_range patch_input_range; struct vrend_io_range patch_input_range;
struct vrend_io_range generic_output_range;
struct vrend_io_range patch_output_range; struct vrend_io_range patch_output_range;
struct vrend_generic_ios generic_ios;
uint32_t generic_outputs_expected_mask;
uint32_t generic_inputs_emitted_mask;
uint32_t generic_outputs_emitted_mask;
uint32_t num_temp_ranges; uint32_t num_temp_ranges;
struct vrend_temp_range *temp_ranges; struct vrend_temp_range *temp_ranges;
@ -3614,7 +3618,7 @@ get_destination_info(struct dump_ctx *ctx,
ctx->outputs[j].glsl_name, ctx->outputs[j].glsl_name,
ctx->outputs[j].override_no_wm ? "" : writemask); ctx->outputs[j].override_no_wm ? "" : writemask);
} else if (ctx->outputs[j].name == TGSI_SEMANTIC_GENERIC) { } else if (ctx->outputs[j].name == TGSI_SEMANTIC_GENERIC) {
struct vrend_shader_io *io = ctx->generic_output_range.used ? &ctx->generic_output_range.io : &ctx->outputs[j]; struct vrend_shader_io *io = ctx->generic_ios.output_range.used ? &ctx->generic_ios.output_range.io : &ctx->outputs[j];
get_destination_info_generic(ctx, dst_reg, io, writemask, dsts[i]); get_destination_info_generic(ctx, dst_reg, io, writemask, dsts[i]);
dinfo->dst_override_no_wm[i] = ctx->outputs[j].override_no_wm; dinfo->dst_override_no_wm[i] = ctx->outputs[j].override_no_wm;
} else if (ctx->outputs[j].name == TGSI_SEMANTIC_PATCH) { } else if (ctx->outputs[j].name == TGSI_SEMANTIC_PATCH) {
@ -3969,7 +3973,7 @@ get_source_info(struct dump_ctx *ctx,
if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) { if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) {
strbuf_fmt(src_buf, "floatBitsToInt(%s%s%s%s)", prefix, ctx->inputs[j].glsl_name, arrayname, swizzle); strbuf_fmt(src_buf, "floatBitsToInt(%s%s%s%s)", prefix, ctx->inputs[j].glsl_name, arrayname, swizzle);
} else if (ctx->inputs[j].name == TGSI_SEMANTIC_GENERIC) { } else if (ctx->inputs[j].name == TGSI_SEMANTIC_GENERIC) {
struct vrend_shader_io *io = ctx->generic_input_range.used ? &ctx->generic_input_range.io : &ctx->inputs[j]; struct vrend_shader_io *io = ctx->generic_ios.input_range.used ? &ctx->generic_ios.input_range.io : &ctx->inputs[j];
get_source_info_generic(ctx, io_in, srcstypeprefix, prefix, src, io, arrayname, swizzle, src_buf); get_source_info_generic(ctx, io_in, srcstypeprefix, prefix, src, io, arrayname, swizzle, src_buf);
} else if (ctx->inputs[j].name == TGSI_SEMANTIC_PATCH) { } else if (ctx->inputs[j].name == TGSI_SEMANTIC_PATCH) {
struct vrend_shader_io *io = ctx->patch_input_range.used ? &ctx->patch_input_range.io : &ctx->inputs[j]; struct vrend_shader_io *io = ctx->patch_input_range.used ? &ctx->patch_input_range.io : &ctx->inputs[j];
@ -4013,7 +4017,7 @@ get_source_info(struct dump_ctx *ctx,
strbuf_fmt(src_buf, "clip_dist_temp[%d%s]", ctx->outputs[j].sid, clip_indirect); strbuf_fmt(src_buf, "clip_dist_temp[%d%s]", ctx->outputs[j].sid, clip_indirect);
} }
} else if (ctx->outputs[j].name == TGSI_SEMANTIC_GENERIC) { } else if (ctx->outputs[j].name == TGSI_SEMANTIC_GENERIC) {
struct vrend_shader_io *io = ctx->generic_output_range.used ? &ctx->generic_output_range.io : &ctx->outputs[j]; struct vrend_shader_io *io = ctx->generic_ios.output_range.used ? &ctx->generic_ios.output_range.io : &ctx->outputs[j];
get_source_info_generic(ctx, io_out, srcstypeprefix, prefix, src, io, arrayname, swizzle, src_buf); get_source_info_generic(ctx, io_out, srcstypeprefix, prefix, src, io, arrayname, swizzle, src_buf);
} else if (ctx->outputs[j].name == TGSI_SEMANTIC_PATCH) { } else if (ctx->outputs[j].name == TGSI_SEMANTIC_PATCH) {
struct vrend_shader_io *io = ctx->patch_output_range.used ? &ctx->patch_output_range.io : &ctx->outputs[j]; struct vrend_shader_io *io = ctx->patch_output_range.used ? &ctx->patch_output_range.io : &ctx->outputs[j];
@ -4368,32 +4372,32 @@ void rewrite_io_ranged(struct dump_ctx *ctx)
if (ctx->inputs[i].name == TGSI_SEMANTIC_GENERIC) { if (ctx->inputs[i].name == TGSI_SEMANTIC_GENERIC) {
ctx->inputs[i].glsl_predefined_no_emit = true; ctx->inputs[i].glsl_predefined_no_emit = true;
if (ctx->inputs[i].sid < ctx->generic_input_range.io.sid || ctx->generic_input_range.used == false) { if (ctx->inputs[i].sid < ctx->generic_ios.input_range.io.sid || ctx->generic_ios.input_range.used == false) {
ctx->generic_input_range.io.sid = ctx->inputs[i].sid; ctx->generic_ios.input_range.io.sid = ctx->inputs[i].sid;
ctx->generic_input_range.io.first = i; ctx->generic_ios.input_range.io.first = i;
ctx->generic_input_range.io.name = TGSI_SEMANTIC_GENERIC; ctx->generic_ios.input_range.io.name = TGSI_SEMANTIC_GENERIC;
ctx->generic_input_range.io.num_components = 4; ctx->generic_ios.input_range.io.num_components = 4;
ctx->generic_input_range.used = true; ctx->generic_ios.input_range.used = true;
if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles) if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles)
ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS;
} }
if (ctx->inputs[i].sid > ctx->generic_input_range.io.last) if (ctx->inputs[i].sid > ctx->generic_ios.input_range.io.last)
ctx->generic_input_range.io.last = ctx->inputs[i].sid; ctx->generic_ios.input_range.io.last = ctx->inputs[i].sid;
} }
if (ctx->key->num_indirect_generic_inputs > 0) if (ctx->key->num_indirect_generic_inputs > 0)
ctx->generic_input_range.io.last = ctx->generic_input_range.io.sid + ctx->key->num_indirect_generic_inputs - 1; ctx->generic_ios.input_range.io.last = ctx->generic_ios.input_range.io.sid + ctx->key->num_indirect_generic_inputs - 1;
if (ctx->key->num_indirect_patch_inputs > 0) if (ctx->key->num_indirect_patch_inputs > 0)
ctx->patch_input_range.io.last = ctx->patch_input_range.io.sid + ctx->key->num_indirect_patch_inputs - 1; ctx->patch_input_range.io.last = ctx->patch_input_range.io.sid + ctx->key->num_indirect_patch_inputs - 1;
} }
snprintf(ctx->patch_input_range.io.glsl_name, 64, "%s_p%d", snprintf(ctx->patch_input_range.io.glsl_name, 64, "%s_p%d",
get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->patch_input_range.io.sid); get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->patch_input_range.io.sid);
snprintf(ctx->generic_input_range.io.glsl_name, 64, "%s_g%d", snprintf(ctx->generic_ios.input_range.io.glsl_name, 64, "%s_g%d",
get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->generic_input_range.io.sid); get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->generic_ios.input_range.io.sid);
ctx->generic_input_range.io.num_components = 4; ctx->generic_ios.input_range.io.num_components = 4;
ctx->generic_input_range.io.usage_mask = 0xf; ctx->generic_ios.input_range.io.usage_mask = 0xf;
ctx->generic_input_range.io.swizzle_offset = 0; ctx->generic_ios.input_range.io.swizzle_offset = 0;
ctx->patch_input_range.io.num_components = 4; ctx->patch_input_range.io.num_components = 4;
ctx->patch_input_range.io.usage_mask = 0xf; ctx->patch_input_range.io.usage_mask = 0xf;
@ -4425,29 +4429,29 @@ void rewrite_io_ranged(struct dump_ctx *ctx)
if (ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC) { if (ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC) {
ctx->outputs[i].glsl_predefined_no_emit = true; ctx->outputs[i].glsl_predefined_no_emit = true;
if (ctx->outputs[i].sid < ctx->generic_output_range.io.sid || ctx->generic_output_range.used == false) { if (ctx->outputs[i].sid < ctx->generic_ios.output_range.io.sid || ctx->generic_ios.output_range.used == false) {
ctx->generic_output_range.io.sid = ctx->outputs[i].sid; ctx->generic_ios.output_range.io.sid = ctx->outputs[i].sid;
ctx->generic_output_range.io.first = i; ctx->generic_ios.output_range.io.first = i;
ctx->generic_output_range.io.name = TGSI_SEMANTIC_GENERIC; ctx->generic_ios.output_range.io.name = TGSI_SEMANTIC_GENERIC;
ctx->generic_output_range.used = true; ctx->generic_ios.output_range.used = true;
ctx->generic_output_range.io.usage_mask = 0xf; ctx->generic_ios.output_range.io.usage_mask = 0xf;
ctx->generic_output_range.io.num_components = 4; ctx->generic_ios.output_range.io.num_components = 4;
if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles) if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles)
ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS;
} }
if (ctx->outputs[i].sid > ctx->generic_output_range.io.last) { if (ctx->outputs[i].sid > ctx->generic_ios.output_range.io.last) {
ctx->generic_output_range.io.last = ctx->outputs[i].sid; ctx->generic_ios.output_range.io.last = ctx->outputs[i].sid;
} }
} }
} }
snprintf(ctx->patch_output_range.io.glsl_name, 64, "%s_p%d", snprintf(ctx->patch_output_range.io.glsl_name, 64, "%s_p%d",
get_stage_output_name_prefix(ctx->prog_type), ctx->patch_output_range.io.sid); get_stage_output_name_prefix(ctx->prog_type), ctx->patch_output_range.io.sid);
snprintf(ctx->generic_output_range.io.glsl_name, 64, "%s_g%d", snprintf(ctx->generic_ios.output_range.io.glsl_name, 64, "%s_g%d",
get_stage_output_name_prefix(ctx->prog_type), ctx->generic_output_range.io.sid); get_stage_output_name_prefix(ctx->prog_type), ctx->generic_ios.output_range.io.sid);
ctx->generic_output_range.io.num_components = 4; ctx->generic_ios.output_range.io.num_components = 4;
ctx->generic_output_range.io.usage_mask = 0xf; ctx->generic_ios.output_range.io.usage_mask = 0xf;
ctx->generic_output_range.io.swizzle_offset = 0; ctx->generic_ios.output_range.io.swizzle_offset = 0;
ctx->patch_output_range.io.num_components = 4; ctx->patch_output_range.io.num_components = 4;
ctx->patch_output_range.io.usage_mask = 0xf; ctx->patch_output_range.io.usage_mask = 0xf;
@ -5957,21 +5961,21 @@ static void emit_ios_indirect_generics_output(const struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs, struct vrend_glsl_strbufs *glsl_strbufs,
const char *postfix) const char *postfix)
{ {
if (ctx->generic_output_range.used) { if (ctx->generic_ios.output_range.used) {
int size = ctx->generic_output_range.io.last - ctx->generic_output_range.io.sid + 1; int size = ctx->generic_ios.output_range.io.last - ctx->generic_ios.output_range.io.sid + 1;
if (prefer_generic_io_block(ctx, io_out)) { if (prefer_generic_io_block(ctx, io_out)) {
char blockname[64]; char blockname[64];
const char *stage_prefix = get_stage_output_name_prefix(ctx->prog_type); const char *stage_prefix = get_stage_output_name_prefix(ctx->prog_type);
get_blockname(blockname, stage_prefix, &ctx->generic_output_range.io); get_blockname(blockname, stage_prefix, &ctx->generic_ios.output_range.io);
char blockvarame[64]; char blockvarame[64];
get_blockvarname(blockvarame, stage_prefix, &ctx->generic_output_range.io, postfix); get_blockvarname(blockvarame, stage_prefix, &ctx->generic_ios.output_range.io, postfix);
emit_hdrf(glsl_strbufs, "out %s {\n vec4 %s[%d]; \n} %s;\n", blockname, emit_hdrf(glsl_strbufs, "out %s {\n vec4 %s[%d]; \n} %s;\n", blockname,
ctx->generic_output_range.io.glsl_name, size, blockvarame); ctx->generic_ios.output_range.io.glsl_name, size, blockvarame);
} else } else
emit_hdrf(glsl_strbufs, "out vec4 %s%s[%d];\n", emit_hdrf(glsl_strbufs, "out vec4 %s%s[%d];\n",
ctx->generic_output_range.io.glsl_name, ctx->generic_ios.output_range.io.glsl_name,
postfix, postfix,
size); size);
} }
@ -5981,8 +5985,8 @@ static void emit_ios_indirect_generics_input(const struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs, struct vrend_glsl_strbufs *glsl_strbufs,
const char *postfix) const char *postfix)
{ {
if (ctx->generic_input_range.used) { if (ctx->generic_ios.input_range.used) {
int size = ctx->generic_input_range.io.last - ctx->generic_input_range.io.sid + 1; int size = ctx->generic_ios.input_range.io.last - ctx->generic_ios.input_range.io.sid + 1;
assert(size < 256 && size >= 0); assert(size < 256 && size >= 0);
if (size < ctx->key->num_indirect_generic_inputs) { if (size < ctx->key->num_indirect_generic_inputs) {
VREND_DEBUG(dbg_shader, NULL, "WARNING: shader key indicates less indirect inputs" VREND_DEBUG(dbg_shader, NULL, "WARNING: shader key indicates less indirect inputs"
@ -5996,24 +6000,25 @@ static void emit_ios_indirect_generics_input(const struct dump_ctx *ctx,
char blockvarame[64]; char blockvarame[64];
const char *stage_prefix = get_stage_input_name_prefix(ctx, ctx->prog_type); const char *stage_prefix = get_stage_input_name_prefix(ctx, ctx->prog_type);
get_blockname(blockname, stage_prefix, &ctx->generic_input_range.io); get_blockname(blockname, stage_prefix, &ctx->generic_ios.input_range.io);
get_blockvarname(blockvarame, stage_prefix, &ctx->generic_input_range.io, get_blockvarname(blockvarame, stage_prefix, &ctx->generic_ios.input_range.io,
postfix); postfix);
emit_hdrf(glsl_strbufs, "in %s {\n vec4 %s[%d]; \n} %s;\n", emit_hdrf(glsl_strbufs, "in %s {\n vec4 %s[%d]; \n} %s;\n",
blockname, ctx->generic_input_range.io.glsl_name, blockname, ctx->generic_ios.input_range.io.glsl_name,
size, blockvarame); size, blockvarame);
} else } else
emit_hdrf(glsl_strbufs, "in vec4 %s%s[%d];\n", emit_hdrf(glsl_strbufs, "in vec4 %s%s[%d];\n",
ctx->generic_input_range.io.glsl_name, ctx->generic_ios.input_range.io.glsl_name,
postfix, postfix,
size); size);
} }
} }
static void static void
emit_ios_generic(struct dump_ctx *ctx, emit_ios_generic(const struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs, struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios,
enum io_type iot, const char *prefix, enum io_type iot, const char *prefix,
const struct vrend_shader_io *io, const char *inout, const struct vrend_shader_io *io, const char *inout,
const char *postfix) const char *postfix)
@ -6054,9 +6059,9 @@ emit_ios_generic(struct dump_ctx *ctx,
if (io->name == TGSI_SEMANTIC_GENERIC) { if (io->name == TGSI_SEMANTIC_GENERIC) {
if (iot == io_in) if (iot == io_in)
ctx->generic_inputs_emitted_mask |= 1 << io->sid; generic_ios->inputs_emitted_mask |= 1 << io->sid;
else else
ctx->generic_outputs_emitted_mask |= 1 << io->sid; generic_ios->outputs_emitted_mask |= 1 << io->sid;
} }
} else { } else {
@ -6101,6 +6106,7 @@ typedef bool (*can_emit_generic_callback)(const struct vrend_shader_io *io);
static void static void
emit_ios_generic_outputs(struct dump_ctx *ctx, emit_ios_generic_outputs(struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs, struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios,
const can_emit_generic_callback can_emit_generic) const can_emit_generic_callback can_emit_generic)
{ {
uint32_t i; uint32_t i;
@ -6133,7 +6139,8 @@ emit_ios_generic_outputs(struct dump_ctx *ctx,
bc_emitted |= 1ull << ctx->outputs[i].sid; bc_emitted |= 1ull << ctx->outputs[i].sid;
} }
emit_ios_generic(ctx, glsl_strbufs, io_out, prefix, &ctx->outputs[i], emit_ios_generic(ctx, glsl_strbufs, generic_ios,
io_out, prefix, &ctx->outputs[i],
ctx->outputs[i].fbfetch_used ? "inout" : "out", ""); ctx->outputs[i].fbfetch_used ? "inout" : "out", "");
} else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) { } else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) {
emit_hdrf(glsl_strbufs, "%s%s;\n", emit_hdrf(glsl_strbufs, "%s%s;\n",
@ -6184,7 +6191,8 @@ can_emit_generic_default(UNUSED const struct vrend_shader_io *io)
} }
static void emit_ios_vs(struct dump_ctx *ctx, static void emit_ios_vs(struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs) struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios)
{ {
uint32_t i; uint32_t i;
@ -6204,7 +6212,7 @@ static void emit_ios_vs(struct dump_ctx *ctx,
emit_ios_indirect_generics_output(ctx, glsl_strbufs, ""); emit_ios_indirect_generics_output(ctx, glsl_strbufs, "");
emit_ios_generic_outputs(ctx, glsl_strbufs, can_emit_generic_default); emit_ios_generic_outputs(ctx, glsl_strbufs, generic_ios, can_emit_generic_default);
if (ctx->key->color_two_side || ctx->force_color_two_side) { if (ctx->key->color_two_side || ctx->force_color_two_side) {
bool fcolor_emitted, bcolor_emitted; bool fcolor_emitted, bcolor_emitted;
@ -6276,7 +6284,8 @@ static const char *get_depth_layout(int depth_layout)
} }
static void emit_ios_fs(struct dump_ctx *ctx, static void emit_ios_fs(struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs) struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios)
{ {
uint32_t i; uint32_t i;
@ -6313,7 +6322,7 @@ static void emit_ios_fs(struct dump_ctx *ctx,
char prefixes[64]; char prefixes[64];
snprintf(prefixes, sizeof(prefixes), "%s %s", prefix, auxprefix); snprintf(prefixes, sizeof(prefixes), "%s %s", prefix, auxprefix);
emit_ios_generic(ctx, glsl_strbufs, io_in, prefixes, &ctx->inputs[i], "in", ""); emit_ios_generic(ctx, glsl_strbufs, generic_ios, io_in, prefixes, &ctx->inputs[i], "in", "");
} }
if (ctx->cfg->use_gles && !ctx->winsys_adjust_y_emitted && if (ctx->cfg->use_gles && !ctx->winsys_adjust_y_emitted &&
@ -6372,7 +6381,7 @@ static void emit_ios_fs(struct dump_ctx *ctx,
!ctx->cfg->has_dual_src_blend) !ctx->cfg->has_dual_src_blend)
sprintf(prefix, "layout(location = %d)", ctx->outputs[i].sid); sprintf(prefix, "layout(location = %d)", ctx->outputs[i].sid);
emit_ios_generic(ctx, glsl_strbufs, io_out, prefix, &ctx->outputs[i], emit_ios_generic(ctx, glsl_strbufs, generic_ios, io_out, prefix, &ctx->outputs[i],
ctx->outputs[i].fbfetch_used ? "inout" : "out", ""); ctx->outputs[i].fbfetch_used ? "inout" : "out", "");
} else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) { } else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) {
@ -6412,7 +6421,8 @@ can_emit_generic_geom(const struct vrend_shader_io *io)
} }
static void emit_ios_geom(struct dump_ctx *ctx, static void emit_ios_geom(struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs) struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios)
{ {
uint32_t i; uint32_t i;
char invocbuf[25]; char invocbuf[25];
@ -6429,7 +6439,8 @@ static void emit_ios_geom(struct dump_ctx *ctx,
if (!ctx->inputs[i].glsl_predefined_no_emit) { if (!ctx->inputs[i].glsl_predefined_no_emit) {
char postfix[64]; char postfix[64];
snprintf(postfix, sizeof(postfix), "[%d]", gs_input_prim_to_size(ctx->gs_in_prim)); snprintf(postfix, sizeof(postfix), "[%d]", gs_input_prim_to_size(ctx->gs_in_prim));
emit_ios_generic(ctx, glsl_strbufs, io_in, "", &ctx->inputs[i], "in", postfix); emit_ios_generic(ctx, glsl_strbufs, generic_ios,
io_in, "", &ctx->inputs[i], "in", postfix);
} }
} }
@ -6454,7 +6465,7 @@ static void emit_ios_geom(struct dump_ctx *ctx,
} }
} }
emit_ios_generic_outputs(ctx, glsl_strbufs, can_emit_generic_geom); emit_ios_generic_outputs(ctx, glsl_strbufs, generic_ios, can_emit_generic_geom);
emit_winsys_correction(glsl_strbufs); emit_winsys_correction(glsl_strbufs);
@ -6496,7 +6507,8 @@ static void emit_ios_geom(struct dump_ctx *ctx,
static void emit_ios_tcs(struct dump_ctx *ctx, static void emit_ios_tcs(struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs) struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios)
{ {
uint32_t i; uint32_t i;
@ -6507,7 +6519,7 @@ static void emit_ios_tcs(struct dump_ctx *ctx,
if (ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) if (ctx->inputs[i].name == TGSI_SEMANTIC_PATCH)
emit_ios_patch(glsl_strbufs, "", &ctx->inputs[i], "in", ctx->inputs[i].last - ctx->inputs[i].first + 1); emit_ios_patch(glsl_strbufs, "", &ctx->inputs[i], "in", ctx->inputs[i].last - ctx->inputs[i].first + 1);
else else
emit_ios_generic(ctx, glsl_strbufs, io_in, "", &ctx->inputs[i], "in", "[]"); emit_ios_generic(ctx, glsl_strbufs, generic_ios, io_in, "", &ctx->inputs[i], "in", "[]");
} }
} }
@ -6525,7 +6537,7 @@ static void emit_ios_tcs(struct dump_ctx *ctx,
emit_ios_patch(glsl_strbufs, "patch", &ctx->outputs[i], "out", emit_ios_patch(glsl_strbufs, "patch", &ctx->outputs[i], "out",
ctx->outputs[i].last - ctx->outputs[i].first + 1); ctx->outputs[i].last - ctx->outputs[i].first + 1);
} else } else
emit_ios_generic(ctx, glsl_strbufs, io_out, "", &ctx->outputs[i], "out", "[]"); emit_ios_generic(ctx, glsl_strbufs, generic_ios, io_out, "", &ctx->outputs[i], "out", "[]");
} else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) { } else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) {
emit_hdrf(glsl_strbufs, "%s%s;\n", emit_hdrf(glsl_strbufs, "%s%s;\n",
ctx->outputs[i].precise ? "precise " : ctx->outputs[i].precise ? "precise " :
@ -6556,7 +6568,8 @@ static void emit_ios_tcs(struct dump_ctx *ctx,
} }
static void emit_ios_tes(struct dump_ctx *ctx, static void emit_ios_tes(struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs) struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios)
{ {
uint32_t i; uint32_t i;
@ -6564,7 +6577,7 @@ static void emit_ios_tes(struct dump_ctx *ctx,
emit_ios_patch(glsl_strbufs, "patch", &ctx->patch_input_range.io, "in", emit_ios_patch(glsl_strbufs, "patch", &ctx->patch_input_range.io, "in",
ctx->patch_input_range.io.last - ctx->patch_input_range.io.sid + 1); ctx->patch_input_range.io.last - ctx->patch_input_range.io.sid + 1);
if (ctx->generic_input_range.used) if (generic_ios->input_range.used)
emit_ios_indirect_generics_input(ctx, glsl_strbufs, "[]"); emit_ios_indirect_generics_input(ctx, glsl_strbufs, "[]");
for (i = 0; i < ctx->num_inputs; i++) { for (i = 0; i < ctx->num_inputs; i++) {
@ -6573,7 +6586,7 @@ static void emit_ios_tes(struct dump_ctx *ctx,
emit_ios_patch(glsl_strbufs, "patch", &ctx->inputs[i], "in", emit_ios_patch(glsl_strbufs, "patch", &ctx->inputs[i], "in",
ctx->inputs[i].last - ctx->inputs[i].first + 1); ctx->inputs[i].last - ctx->inputs[i].first + 1);
else else
emit_ios_generic(ctx, glsl_strbufs, io_in, "", &ctx->inputs[i], "in", "[]"); emit_ios_generic(ctx, glsl_strbufs, generic_ios, io_in, "", &ctx->inputs[i], "in", "[]");
} }
} }
@ -6583,7 +6596,7 @@ static void emit_ios_tes(struct dump_ctx *ctx,
ctx->tes_vertex_order ? "cw" : "ccw", ctx->tes_vertex_order ? "cw" : "ccw",
ctx->tes_point_mode ? ", point_mode" : ""); ctx->tes_point_mode ? ", point_mode" : "");
emit_ios_generic_outputs(ctx, glsl_strbufs, can_emit_generic_default); emit_ios_generic_outputs(ctx, glsl_strbufs, generic_ios, can_emit_generic_default);
emit_winsys_correction(glsl_strbufs); emit_winsys_correction(glsl_strbufs);
@ -6622,7 +6635,8 @@ static void emit_ios_cs(const struct dump_ctx *ctx,
} }
static void emit_ios(struct dump_ctx *ctx, static void emit_ios(struct dump_ctx *ctx,
struct vrend_glsl_strbufs *glsl_strbufs) struct vrend_glsl_strbufs *glsl_strbufs,
struct vrend_generic_ios *generic_ios)
{ {
ctx->num_interps = 0; ctx->num_interps = 0;
@ -6634,19 +6648,19 @@ static void emit_ios(struct dump_ctx *ctx,
switch (ctx->prog_type) { switch (ctx->prog_type) {
case TGSI_PROCESSOR_VERTEX: case TGSI_PROCESSOR_VERTEX:
emit_ios_vs(ctx, glsl_strbufs); emit_ios_vs(ctx, glsl_strbufs, generic_ios);
break; break;
case TGSI_PROCESSOR_FRAGMENT: case TGSI_PROCESSOR_FRAGMENT:
emit_ios_fs(ctx, glsl_strbufs); emit_ios_fs(ctx, glsl_strbufs, generic_ios);
break; break;
case TGSI_PROCESSOR_GEOMETRY: case TGSI_PROCESSOR_GEOMETRY:
emit_ios_geom(ctx, glsl_strbufs); emit_ios_geom(ctx, glsl_strbufs, generic_ios);
break; break;
case TGSI_PROCESSOR_TESS_CTRL: case TGSI_PROCESSOR_TESS_CTRL:
emit_ios_tcs(ctx, glsl_strbufs); emit_ios_tcs(ctx, glsl_strbufs, generic_ios);
break; break;
case TGSI_PROCESSOR_TESS_EVAL: case TGSI_PROCESSOR_TESS_EVAL:
emit_ios_tes(ctx, glsl_strbufs); emit_ios_tes(ctx, glsl_strbufs, generic_ios);
break; break;
case TGSI_PROCESSOR_COMPUTE: case TGSI_PROCESSOR_COMPUTE:
emit_ios_cs(ctx, glsl_strbufs); emit_ios_cs(ctx, glsl_strbufs);
@ -6657,12 +6671,12 @@ static void emit_ios(struct dump_ctx *ctx,
return; return;
} }
if (ctx->generic_outputs_expected_mask && if (generic_ios->outputs_expected_mask &&
(ctx->generic_outputs_expected_mask != ctx->generic_outputs_emitted_mask)) { (generic_ios->outputs_expected_mask != generic_ios->outputs_emitted_mask)) {
for (int i = 0; i < 31; ++i) { for (int i = 0; i < 31; ++i) {
uint32_t mask = 1 << i; uint32_t mask = 1 << i;
bool expecting = ctx->generic_outputs_expected_mask & mask; bool expecting = generic_ios->outputs_expected_mask & mask;
if (expecting & !(ctx->generic_outputs_emitted_mask & mask)) if (expecting & !(generic_ios->outputs_emitted_mask & mask))
emit_hdrf(glsl_strbufs, " out vec4 %s_g%dA0_f%s;\n", emit_hdrf(glsl_strbufs, " out vec4 %s_g%dA0_f%s;\n",
get_stage_output_name_prefix(ctx->prog_type), i, get_stage_output_name_prefix(ctx->prog_type), i,
ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL ? "[]" : ""); ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL ? "[]" : "");
@ -6776,15 +6790,15 @@ static void fill_sinfo(struct dump_ctx *ctx, struct vrend_shader_info *sinfo)
sinfo->ubo_indirect = ctx->info.dimension_indirect_files & (1 << TGSI_FILE_CONSTANT); sinfo->ubo_indirect = ctx->info.dimension_indirect_files & (1 << TGSI_FILE_CONSTANT);
if (ctx->generic_input_range.used)
sinfo->num_indirect_generic_inputs = ctx->generic_input_range.io.last - ctx->generic_input_range.io.sid + 1;
if (ctx->patch_input_range.used) if (ctx->patch_input_range.used)
sinfo->num_indirect_patch_inputs = ctx->patch_input_range.io.last - ctx->patch_input_range.io.sid + 1; sinfo->num_indirect_patch_inputs = ctx->patch_input_range.io.last - ctx->patch_input_range.io.sid + 1;
if (ctx->generic_ios.input_range.used)
sinfo->num_indirect_generic_inputs = ctx->generic_ios.input_range.io.last - ctx->generic_ios.input_range.io.sid + 1;
if (ctx->generic_output_range.used)
sinfo->num_indirect_generic_outputs = ctx->generic_output_range.io.last - ctx->generic_output_range.io.sid + 1;
if (ctx->patch_output_range.used) if (ctx->patch_output_range.used)
sinfo->num_indirect_patch_outputs = ctx->patch_output_range.io.last - ctx->patch_output_range.io.sid + 1; sinfo->num_indirect_patch_outputs = ctx->patch_output_range.io.last - ctx->patch_output_range.io.sid + 1;
if (ctx->generic_ios.output_range.used)
sinfo->num_indirect_generic_outputs = ctx->generic_ios.output_range.io.last - ctx->generic_ios.output_range.io.sid + 1;
sinfo->num_inputs = ctx->num_inputs; sinfo->num_inputs = ctx->num_inputs;
sinfo->num_interps = ctx->num_interps; sinfo->num_interps = ctx->num_interps;
@ -6831,7 +6845,7 @@ static void fill_sinfo(struct dump_ctx *ctx, struct vrend_shader_info *sinfo)
free(sinfo->image_arrays); free(sinfo->image_arrays);
sinfo->image_arrays = ctx->image_arrays; sinfo->image_arrays = ctx->image_arrays;
sinfo->num_image_arrays = ctx->num_image_arrays; sinfo->num_image_arrays = ctx->num_image_arrays;
sinfo->generic_inputs_emitted_mask = ctx->generic_inputs_emitted_mask; sinfo->generic_inputs_emitted_mask = ctx->generic_ios.inputs_emitted_mask;
for (unsigned i = 0; i < ctx->num_outputs; ++i) { for (unsigned i = 0; i < ctx->num_outputs; ++i) {
if (ctx->outputs[i].invariant) if (ctx->outputs[i].invariant)
@ -6916,7 +6930,7 @@ bool vrend_convert_shader(const struct vrend_context *rctx,
ctx.has_sample_input = false; ctx.has_sample_input = false;
ctx.req_local_mem = req_local_mem; ctx.req_local_mem = req_local_mem;
ctx.guest_sent_io_arrays = key->guest_sent_io_arrays; ctx.guest_sent_io_arrays = key->guest_sent_io_arrays;
ctx.generic_outputs_expected_mask = key->generic_outputs_expected_mask; ctx.generic_ios.outputs_expected_mask = key->generic_outputs_expected_mask;
tgsi_scan_shader(tokens, &ctx.info); tgsi_scan_shader(tokens, &ctx.info);
/* if we are in core profile mode we should use GLSL 1.40 */ /* if we are in core profile mode we should use GLSL 1.40 */
@ -6953,7 +6967,7 @@ bool vrend_convert_shader(const struct vrend_context *rctx,
strbuf_free(ctx.src_bufs + i); strbuf_free(ctx.src_bufs + i);
emit_header(&ctx, &ctx.glsl_strbufs); emit_header(&ctx, &ctx.glsl_strbufs);
emit_ios(&ctx, &ctx.glsl_strbufs); emit_ios(&ctx, &ctx.glsl_strbufs, &ctx.generic_ios);
if (strbuf_get_error(&ctx.glsl_strbufs.glsl_hdr)) if (strbuf_get_error(&ctx.glsl_strbufs.glsl_hdr))
goto fail; goto fail;
@ -7262,7 +7276,7 @@ bool vrend_shader_create_passthrough_tcs(const struct vrend_context *rctx,
handle_io_arrays(&ctx); handle_io_arrays(&ctx);
emit_header(&ctx, &ctx.glsl_strbufs); emit_header(&ctx, &ctx.glsl_strbufs);
emit_ios(&ctx, &ctx.glsl_strbufs); emit_ios(&ctx, &ctx.glsl_strbufs, &ctx.generic_ios);
emit_buf(&ctx.glsl_strbufs, "void main() {\n"); emit_buf(&ctx.glsl_strbufs, "void main() {\n");

Loading…
Cancel
Save