[Mesa-dev] [PATCH 2/2] tgsi_to_nir: Convert to using VARYING_SLOT_* / FRAG_RESULT_*.
Rob Clark
robdclark at gmail.com
Tue Aug 4 15:11:50 PDT 2015
On Tue, Aug 4, 2015 at 5:28 PM, Eric Anholt <eric at anholt.net> wrote:
> This avoids exceeding the size of the .index bitfield since it got
> truncated, and should make our NIR look more like the NIR that the rest of
> the NIR developers are working on.
> ---
> The freedreno changes here are untested.
>
> src/gallium/auxiliary/nir/tgsi_to_nir.c | 144 +++++++++++++++--
> src/gallium/auxiliary/nir/tgsi_to_nir.h | 3 +
> .../drivers/freedreno/ir3/ir3_compiler_nir.c | 14 +-
> src/gallium/drivers/vc4/vc4_context.h | 9 +-
> src/gallium/drivers/vc4/vc4_nir_lower_io.c | 18 +--
> src/gallium/drivers/vc4/vc4_opt_dead_code.c | 2 +-
> src/gallium/drivers/vc4/vc4_program.c | 174 +++++++++------------
> src/gallium/drivers/vc4/vc4_qir.c | 2 +-
> src/gallium/drivers/vc4/vc4_qir.h | 21 ++-
> 9 files changed, 241 insertions(+), 146 deletions(-)
>
> diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c
> index 4130697..983d19d 100644
> --- a/src/gallium/auxiliary/nir/tgsi_to_nir.c
> +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c
> @@ -93,6 +93,99 @@ struct ttn_compile {
> #define ttn_channel(b, src, swiz) \
> nir_swizzle(b, src, SWIZ(swiz, swiz, swiz, swiz), 1, false)
>
> +static gl_varying_slot
> +tgsi_varying_semantic_to_slot(unsigned semantic, unsigned index)
> +{
> + switch (semantic) {
> + case TGSI_SEMANTIC_POSITION:
> + return VARYING_SLOT_POS;
> + case TGSI_SEMANTIC_COLOR:
> + if (index == 0)
> + return VARYING_SLOT_COL0;
> + else
> + return VARYING_SLOT_COL1;
> + case TGSI_SEMANTIC_BCOLOR:
> + if (index == 0)
> + return VARYING_SLOT_BFC0;
> + else
> + return VARYING_SLOT_BFC1;
> + case TGSI_SEMANTIC_FOG:
> + return VARYING_SLOT_FOGC;
> + case TGSI_SEMANTIC_PSIZE:
> + return VARYING_SLOT_PSIZ;
> + case TGSI_SEMANTIC_GENERIC:
> + return VARYING_SLOT_VAR0 + index;
> + case TGSI_SEMANTIC_FACE:
> + return VARYING_SLOT_FACE;
> + case TGSI_SEMANTIC_EDGEFLAG:
> + return VARYING_SLOT_EDGE;
> + case TGSI_SEMANTIC_PRIMID:
> + return VARYING_SLOT_PRIMITIVE_ID;
> + case TGSI_SEMANTIC_CLIPDIST:
> + if (index == 0)
> + return VARYING_SLOT_CLIP_DIST0;
> + else
> + return VARYING_SLOT_CLIP_DIST1;
> + case TGSI_SEMANTIC_CLIPVERTEX:
> + return VARYING_SLOT_CLIP_VERTEX;
> + case TGSI_SEMANTIC_TEXCOORD:
> + return VARYING_SLOT_TEX0 + index;
> + case TGSI_SEMANTIC_PCOORD:
> + return VARYING_SLOT_PNTC;
> + case TGSI_SEMANTIC_VIEWPORT_INDEX:
> + return VARYING_SLOT_VIEWPORT;
> + case TGSI_SEMANTIC_LAYER:
> + return VARYING_SLOT_LAYER;
> + default:
> + fprintf(stderr, "Bad TGSI semantic: %d/%d\n", semantic, index);
> + abort();
> + }
> +}
> +
> +void
> +varying_slot_to_tgsi_semantic(gl_varying_slot slot,
> + unsigned *semantic_name, unsigned *semantic_index)
> +{
> + static const unsigned map[][2] = {
> + [VARYING_SLOT_POS] = { TGSI_SEMANTIC_POSITION, 0 },
> + [VARYING_SLOT_COL0] = { TGSI_SEMANTIC_COLOR, 0 },
> + [VARYING_SLOT_COL1] = { TGSI_SEMANTIC_COLOR, 1 },
> + [VARYING_SLOT_BFC0] = { TGSI_SEMANTIC_BCOLOR, 0 },
> + [VARYING_SLOT_BFC1] = { TGSI_SEMANTIC_BCOLOR, 1 },
> + [VARYING_SLOT_FOGC] = { TGSI_SEMANTIC_FOG, 0 },
> + [VARYING_SLOT_PSIZ] = { TGSI_SEMANTIC_PSIZE, 0 },
> + [VARYING_SLOT_FACE] = { TGSI_SEMANTIC_FACE, 0 },
> + [VARYING_SLOT_EDGE] = { TGSI_SEMANTIC_EDGEFLAG, 0 },
> + [VARYING_SLOT_PRIMITIVE_ID] = { TGSI_SEMANTIC_PRIMID, 0 },
> + [VARYING_SLOT_CLIP_DIST0] = { TGSI_SEMANTIC_CLIPDIST, 0 },
> + [VARYING_SLOT_CLIP_DIST1] = { TGSI_SEMANTIC_CLIPDIST, 1 },
> + [VARYING_SLOT_CLIP_VERTEX] = { TGSI_SEMANTIC_CLIPVERTEX, 0 },
> + [VARYING_SLOT_PNTC] = { TGSI_SEMANTIC_PCOORD, 0 },
> + [VARYING_SLOT_VIEWPORT] = { TGSI_SEMANTIC_VIEWPORT_INDEX, 0 },
> + [VARYING_SLOT_LAYER] = { TGSI_SEMANTIC_LAYER, 0 },
> + };
> +
> + if (slot >= VARYING_SLOT_VAR0) {
> + *semantic_name = TGSI_SEMANTIC_GENERIC;
> + *semantic_index = slot - VARYING_SLOT_VAR0;
> + return;
> + }
> +
> + if (slot >= VARYING_SLOT_TEX0 && slot <= VARYING_SLOT_TEX7) {
> + *semantic_name = TGSI_SEMANTIC_TEXCOORD;
> + *semantic_index = slot - VARYING_SLOT_TEX0;
> + return;
> + }
> +
> + if (slot >= ARRAY_SIZE(map)) {
> + fprintf(stderr, "Unknown varying slot %d\n", slot);
> + abort();
> + }
> +
> + *semantic_name = map[slot][0];
> + *semantic_index = map[slot][1];
> +}
> +
> static nir_ssa_def *
> ttn_src_for_dest(nir_builder *b, nir_alu_dest *dest)
> {
> @@ -215,12 +308,14 @@ ttn_emit_declaration(struct ttn_compile *c)
> var->data.mode = nir_var_shader_in;
> var->name = ralloc_asprintf(var, "in_%d", idx);
>
> - /* We should probably translate to a VERT_ATTRIB_* or VARYING_SLOT_*
> - * instead, but nothing in NIR core is looking at the value
> - * currently, and this is less change to drivers.
> - */
> - var->data.location = decl->Semantic.Name;
> - var->data.index = decl->Semantic.Index;
> + if (c->scan->processor == TGSI_PROCESSOR_FRAGMENT) {
> + var->data.location =
> + tgsi_varying_semantic_to_slot(decl->Semantic.Name,
> + decl->Semantic.Index);
> + } else {
> + var->data.location = idx;
> + }
> + var->data.index = 0;
>
> /* We definitely need to translate the interpolation field, because
> * nir_print will decode it.
> @@ -240,6 +335,8 @@ ttn_emit_declaration(struct ttn_compile *c)
> exec_list_push_tail(&b->shader->inputs, &var->node);
> break;
> case TGSI_FILE_OUTPUT: {
> + int semantic_name = decl->Semantic.Name;
> + int semantic_index = decl->Semantic.Index;
> /* Since we can't load from outputs in the IR, we make temporaries
> * for the outputs and emit stores to the real outputs at the end of
> * the shader.
> @@ -251,14 +348,33 @@ ttn_emit_declaration(struct ttn_compile *c)
>
> var->data.mode = nir_var_shader_out;
> var->name = ralloc_asprintf(var, "out_%d", idx);
> -
> - var->data.location = decl->Semantic.Name;
> - if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR &&
> - decl->Semantic.Index == 0 &&
> - c->scan->properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS])
> - var->data.index = -1;
> - else
> - var->data.index = decl->Semantic.Index;
> + var->data.index = 0;
> +
> + if (c->scan->processor == TGSI_PROCESSOR_FRAGMENT) {
> + switch (semantic_name) {
> + case TGSI_SEMANTIC_COLOR:
> + if (semantic_index == 1) {
> + var->data.location = FRAG_RESULT_DATA0;
> + var->data.index = 1;
> + } else {
> + if (c->scan->properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS])
> + var->data.location = FRAG_RESULT_COLOR;
> + else
> + var->data.location = FRAG_RESULT_DATA0;
> + }
hmm, this doesn't quite look right for MRT..
At any rate, I'm kinda thinking it is a better idea to revert the
patch that changed index to one bit, and then re-apply it again
*after* we've managed to work the kinks out of
VARYING_SLOT_*/FRAG_RESULT_*...
BR,
-R
> + break;
> + case TGSI_SEMANTIC_POSITION:
> + var->data.location = FRAG_RESULT_DEPTH;
> + break;
> + default:
> + fprintf(stderr, "Bad TGSI semantic: %d/%d\n",
> + decl->Semantic.Name, decl->Semantic.Index);
> + abort();
> + }
> + } else {
> + var->data.location =
> + tgsi_varying_semantic_to_slot(semantic_name, semantic_index);
> + }
>
> if (is_array) {
> unsigned j;
> diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.h b/src/gallium/auxiliary/nir/tgsi_to_nir.h
> index 687348a..4609ac2 100644
> --- a/src/gallium/auxiliary/nir/tgsi_to_nir.h
> +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.h
> @@ -28,3 +28,6 @@ struct nir_shader_compiler_options *options;
> struct nir_shader *
> tgsi_to_nir(const void *tgsi_tokens,
> const struct nir_shader_compiler_options *options);
> +void
> +varying_slot_to_tgsi_semantic(gl_varying_slot slot,
> + unsigned *semantic_name, unsigned *semantic_index);
> diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
> index 53faf16..788add4 100644
> --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
> +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
> @@ -2120,11 +2120,12 @@ setup_input(struct ir3_compile *ctx, nir_variable *in)
> struct ir3_shader_variant *so = ctx->so;
> unsigned array_len = MAX2(glsl_get_length(in->type), 1);
> unsigned ncomp = glsl_get_components(in->type);
> - /* XXX: map loc slots to semantics */
> - unsigned semantic_name = in->data.location;
> - unsigned semantic_index = in->data.index;
> + unsigned semantic_name, semantic_index;
> unsigned n = in->data.driver_location;
>
> + varying_slot_to_tgsi_semantic(in->data.location,
> + &semantic_name, &semantic_index);
> +
> DBG("; in: %u:%u, len=%ux%u, loc=%u",
> semantic_name, semantic_index, array_len,
> ncomp, n);
> @@ -2214,12 +2215,13 @@ setup_output(struct ir3_compile *ctx, nir_variable *out)
> struct ir3_shader_variant *so = ctx->so;
> unsigned array_len = MAX2(glsl_get_length(out->type), 1);
> unsigned ncomp = glsl_get_components(out->type);
> - /* XXX: map loc slots to semantics */
> - unsigned semantic_name = out->data.location;
> - unsigned semantic_index = out->data.index;
> + unsigned semantic_name, semantic_index;
> unsigned n = out->data.driver_location;
> unsigned comp = 0;
>
> + varying_slot_to_tgsi_semantic(in->data.location,
> + &semantic_name, &semantic_index);
> +
> DBG("; out: %u:%u, len=%ux%u, loc=%u",
> semantic_name, semantic_index, array_len,
> ncomp, n);
> diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h
> index 30fb285..14b9eb1 100644
> --- a/src/gallium/drivers/vc4/vc4_context.h
> +++ b/src/gallium/drivers/vc4/vc4_context.h
> @@ -158,18 +158,17 @@ struct vc4_compiled_shader {
> * It doesn't include those that aren't part of the VPM, like
> * point/line coordinates.
> */
> - struct vc4_varying_semantic *input_semantics;
> + struct vc4_varying_slot *input_slots;
> };
>
> struct vc4_program_stateobj {
> struct vc4_uncompiled_shader *bind_vs, *bind_fs;
> struct vc4_compiled_shader *cs, *vs, *fs;
> uint8_t num_exports;
> - /* Indexed by semantic name or TGSI_SEMANTIC_COUNT + semantic index
> - * for TGSI_SEMANTIC_GENERIC. Special vs exports (position and point-
> - * size) are not included in this
> + /* Indexed by slot. Special vs exports (position and pointsize) are
> + * not included in this
> */
> - uint8_t export_linkage[63];
> + uint8_t export_linkage[VARYING_SLOT_VAR0 + 8];
> };
>
> struct vc4_constbuf_stateobj {
> diff --git a/src/gallium/drivers/vc4/vc4_nir_lower_io.c b/src/gallium/drivers/vc4/vc4_nir_lower_io.c
> index ffc120e..9dd46ac 100644
> --- a/src/gallium/drivers/vc4/vc4_nir_lower_io.c
> +++ b/src/gallium/drivers/vc4/vc4_nir_lower_io.c
> @@ -22,7 +22,6 @@
> */
>
> #include "vc4_qir.h"
> -#include "tgsi/tgsi_info.h"
> #include "glsl/nir/nir_builder.h"
>
> /**
> @@ -69,8 +68,6 @@ vc4_nir_lower_input(struct vc4_compile *c, nir_builder *b,
> }
> }
> assert(input_var);
> - int semantic_name = input_var->data.location;
> - int semantic_index = input_var->data.index;
>
> /* Generate scalar loads equivalent to the original VEC4. */
> nir_ssa_def *dests[4];
> @@ -87,8 +84,7 @@ vc4_nir_lower_input(struct vc4_compile *c, nir_builder *b,
>
> switch (c->stage) {
> case QSTAGE_FRAG:
> - switch (semantic_name) {
> - case TGSI_SEMANTIC_FACE:
> + if (input_var->data.location == VARYING_SLOT_FACE) {
> dests[0] = nir_fsub(b,
> nir_imm_float(b, 1.0),
> nir_fmul(b,
> @@ -97,10 +93,10 @@ vc4_nir_lower_input(struct vc4_compile *c, nir_builder *b,
> dests[1] = nir_imm_float(b, 0.0);
> dests[2] = nir_imm_float(b, 0.0);
> dests[3] = nir_imm_float(b, 1.0);
> - break;
> - case TGSI_SEMANTIC_GENERIC:
> + } else if (input_var->data.location >= VARYING_SLOT_VAR0) {
> if (c->fs_key->point_sprite_mask &
> - (1 << semantic_index)) {
> + (1 << (input_var->data.location -
> + VARYING_SLOT_VAR0))) {
> if (!c->fs_key->is_points) {
> dests[0] = nir_imm_float(b, 0.0);
> dests[1] = nir_imm_float(b, 0.0);
> @@ -113,7 +109,6 @@ vc4_nir_lower_input(struct vc4_compile *c, nir_builder *b,
> dests[2] = nir_imm_float(b, 0.0);
> dests[3] = nir_imm_float(b, 1.0);
> }
> - break;
> }
> break;
> case QSTAGE_COORD:
> @@ -136,11 +131,10 @@ vc4_nir_lower_output(struct vc4_compile *c, nir_builder *b,
> }
> }
> assert(output_var);
> - unsigned semantic_name = output_var->data.location;
>
> if (c->stage == QSTAGE_COORD &&
> - (semantic_name != TGSI_SEMANTIC_POSITION &&
> - semantic_name != TGSI_SEMANTIC_PSIZE)) {
> + output_var->data.location != VARYING_SLOT_POS &&
> + output_var->data.location != VARYING_SLOT_PSIZ) {
> nir_instr_remove(&intr->instr);
> return;
> }
> diff --git a/src/gallium/drivers/vc4/vc4_opt_dead_code.c b/src/gallium/drivers/vc4/vc4_opt_dead_code.c
> index ffd4242..9e79a2d 100644
> --- a/src/gallium/drivers/vc4/vc4_opt_dead_code.c
> +++ b/src/gallium/drivers/vc4/vc4_opt_dead_code.c
> @@ -69,7 +69,7 @@ has_nonremovable_reads(struct vc4_compile *c, struct qinst *inst)
> }
>
> if (inst->src[i].file == QFILE_VARY &&
> - c->input_semantics[inst->src[i].index].semantic == 0xff) {
> + c->input_slots[inst->src[i].index].slot == 0xff) {
> return true;
> }
> }
> diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
> index f274298..23bf64b 100644
> --- a/src/gallium/drivers/vc4/vc4_program.c
> +++ b/src/gallium/drivers/vc4/vc4_program.c
> @@ -30,7 +30,6 @@
> #include "util/ralloc.h"
> #include "util/hash_table.h"
> #include "tgsi/tgsi_dump.h"
> -#include "tgsi/tgsi_info.h"
> #include "tgsi/tgsi_lowering.h"
> #include "tgsi/tgsi_parse.h"
> #include "nir/tgsi_to_nir.h"
> @@ -707,41 +706,36 @@ emit_fragcoord_input(struct vc4_compile *c, int attr)
> }
>
> static struct qreg
> -emit_fragment_varying(struct vc4_compile *c, uint8_t semantic,
> - uint8_t index, uint8_t swizzle)
> +emit_fragment_varying(struct vc4_compile *c, gl_varying_slot slot,
> + uint8_t swizzle)
> {
> - uint32_t i = c->num_input_semantics++;
> + uint32_t i = c->num_input_slots++;
> struct qreg vary = {
> QFILE_VARY,
> i
> };
>
> - if (c->num_input_semantics >= c->input_semantics_array_size) {
> - c->input_semantics_array_size =
> - MAX2(4, c->input_semantics_array_size * 2);
> + if (c->num_input_slots >= c->input_slots_array_size) {
> + c->input_slots_array_size =
> + MAX2(4, c->input_slots_array_size * 2);
>
> - c->input_semantics = reralloc(c, c->input_semantics,
> - struct vc4_varying_semantic,
> - c->input_semantics_array_size);
> + c->input_slots = reralloc(c, c->input_slots,
> + struct vc4_varying_slot,
> + c->input_slots_array_size);
> }
>
> - c->input_semantics[i].semantic = semantic;
> - c->input_semantics[i].index = index;
> - c->input_semantics[i].swizzle = swizzle;
> + c->input_slots[i].slot = slot;
> + c->input_slots[i].swizzle = swizzle;
>
> return qir_VARY_ADD_C(c, qir_FMUL(c, vary, qir_FRAG_W(c)));
> }
>
> static void
> -emit_fragment_input(struct vc4_compile *c, int attr,
> - unsigned semantic_name, unsigned semantic_index)
> +emit_fragment_input(struct vc4_compile *c, int attr, gl_varying_slot slot)
> {
> for (int i = 0; i < 4; i++) {
> c->inputs[attr * 4 + i] =
> - emit_fragment_varying(c,
> - semantic_name,
> - semantic_index,
> - i);
> + emit_fragment_varying(c, slot, i);
> c->num_inputs++;
> }
> }
> @@ -749,24 +743,22 @@ emit_fragment_input(struct vc4_compile *c, int attr,
> static void
> add_output(struct vc4_compile *c,
> uint32_t decl_offset,
> - uint8_t semantic_name,
> - uint8_t semantic_index,
> - uint8_t semantic_swizzle)
> + uint8_t slot,
> + uint8_t swizzle)
> {
> uint32_t old_array_size = c->outputs_array_size;
> resize_qreg_array(c, &c->outputs, &c->outputs_array_size,
> decl_offset + 1);
>
> if (old_array_size != c->outputs_array_size) {
> - c->output_semantics = reralloc(c,
> - c->output_semantics,
> - struct vc4_varying_semantic,
> - c->outputs_array_size);
> + c->output_slots = reralloc(c,
> + c->output_slots,
> + struct vc4_varying_slot,
> + c->outputs_array_size);
> }
>
> - c->output_semantics[decl_offset].semantic = semantic_name;
> - c->output_semantics[decl_offset].index = semantic_index;
> - c->output_semantics[decl_offset].swizzle = semantic_swizzle;
> + c->output_slots[decl_offset].slot = slot;
> + c->output_slots[decl_offset].swizzle = swizzle;
> }
>
> static void
> @@ -1177,10 +1169,10 @@ clip_distance_discard(struct vc4_compile *c)
> if (!(c->key->ucp_enables & (1 << i)))
> continue;
>
> - struct qreg dist = emit_fragment_varying(c,
> - TGSI_SEMANTIC_CLIPDIST,
> - i,
> - TGSI_SWIZZLE_X);
> + struct qreg dist =
> + emit_fragment_varying(c,
> + VARYING_SLOT_CLIP_DIST0 + (i / 4),
> + i % 4);
>
> qir_SF(c, dist);
>
> @@ -1533,9 +1525,8 @@ emit_ucp_clipdistance(struct vc4_compile *c)
> */
> uint32_t output_index = c->num_outputs++;
> add_output(c, output_index,
> - TGSI_SEMANTIC_CLIPDIST,
> - plane,
> - TGSI_SWIZZLE_X);
> + VARYING_SLOT_CLIP_DIST0 + plane / 4,
> + plane % 4);
>
>
> struct qreg dist = qir_uniform_f(c, 0.0);
> @@ -1553,7 +1544,7 @@ emit_ucp_clipdistance(struct vc4_compile *c)
>
> static void
> emit_vert_end(struct vc4_compile *c,
> - struct vc4_varying_semantic *fs_inputs,
> + struct vc4_varying_slot *fs_inputs,
> uint32_t num_fs_inputs)
> {
> struct qreg rcp_w = qir_RCP(c, c->outputs[c->output_position_index + 3]);
> @@ -1568,15 +1559,14 @@ emit_vert_end(struct vc4_compile *c,
> emit_point_size_write(c);
>
> for (int i = 0; i < num_fs_inputs; i++) {
> - struct vc4_varying_semantic *input = &fs_inputs[i];
> + struct vc4_varying_slot *input = &fs_inputs[i];
> int j;
>
> for (j = 0; j < c->num_outputs; j++) {
> - struct vc4_varying_semantic *output =
> - &c->output_semantics[j];
> + struct vc4_varying_slot *output =
> + &c->output_slots[j];
>
> - if (input->semantic == output->semantic &&
> - input->index == output->index &&
> + if (input->slot == output->slot &&
> input->swizzle == output->swizzle) {
> qir_VPM_WRITE(c, c->outputs[j]);
> break;
> @@ -1659,9 +1649,6 @@ ntq_setup_inputs(struct vc4_compile *c)
> for (unsigned i = 0; i < num_entries; i++) {
> nir_variable *var = vars[i];
> unsigned array_len = MAX2(glsl_get_length(var->type), 1);
> - /* XXX: map loc slots to semantics */
> - unsigned semantic_name = var->data.location;
> - unsigned semantic_index = var->data.index;
> unsigned loc = var->data.driver_location;
>
> assert(array_len == 1);
> @@ -1670,19 +1657,18 @@ ntq_setup_inputs(struct vc4_compile *c)
> (loc + 1) * 4);
>
> if (c->stage == QSTAGE_FRAG) {
> - if (semantic_name == TGSI_SEMANTIC_POSITION) {
> + if (var->data.location == VARYING_SLOT_POS) {
> emit_fragcoord_input(c, loc);
> - } else if (semantic_name == TGSI_SEMANTIC_FACE) {
> + } else if (var->data.location == VARYING_SLOT_FACE) {
> c->inputs[loc * 4 + 0] = qir_FRAG_REV_FLAG(c);
> - } else if (semantic_name == TGSI_SEMANTIC_GENERIC &&
> + } else if (var->data.location == VARYING_SLOT_VAR0 &&
> (c->fs_key->point_sprite_mask &
> - (1 << semantic_index))) {
> + (1 << (var->data.location -
> + VARYING_SLOT_VAR0)))) {
> c->inputs[loc * 4 + 0] = c->point_x;
> c->inputs[loc * 4 + 1] = c->point_y;
> } else {
> - emit_fragment_input(c, loc,
> - semantic_name,
> - semantic_index);
> + emit_fragment_input(c, loc, var->data.location);
> }
> } else {
> emit_vertex_input(c, loc);
> @@ -1695,43 +1681,37 @@ ntq_setup_outputs(struct vc4_compile *c)
> {
> foreach_list_typed(nir_variable, var, node, &c->s->outputs) {
> unsigned array_len = MAX2(glsl_get_length(var->type), 1);
> - /* XXX: map loc slots to semantics */
> - unsigned semantic_name = var->data.location;
> - unsigned semantic_index = var->data.index;
> unsigned loc = var->data.driver_location * 4;
>
> assert(array_len == 1);
> (void)array_len;
>
> - /* NIR hack to pass through
> - * TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS */
> - if (semantic_name == TGSI_SEMANTIC_COLOR &&
> - semantic_index == -1)
> - semantic_index = 0;
> -
> - for (int i = 0; i < 4; i++) {
> - add_output(c,
> - loc + i,
> - semantic_name,
> - semantic_index,
> - i);
> - }
> + for (int i = 0; i < 4; i++)
> + add_output(c, loc + i, var->data.location, i);
>
> - switch (semantic_name) {
> - case TGSI_SEMANTIC_POSITION:
> - c->output_position_index = loc;
> - break;
> - case TGSI_SEMANTIC_CLIPVERTEX:
> - c->output_clipvertex_index = loc;
> - break;
> - case TGSI_SEMANTIC_COLOR:
> - c->output_color_index = loc;
> - break;
> - case TGSI_SEMANTIC_PSIZE:
> - c->output_point_size_index = loc;
> - break;
> + if (c->stage == QSTAGE_FRAG) {
> + switch (var->data.location) {
> + case FRAG_RESULT_COLOR:
> + case FRAG_RESULT_DATA0:
> + c->output_color_index = loc;
> + break;
> + case FRAG_RESULT_DEPTH:
> + c->output_position_index = loc;
> + break;
> + }
> + } else {
> + switch (var->data.location) {
> + case VARYING_SLOT_POS:
> + c->output_position_index = loc;
> + break;
> + case VARYING_SLOT_CLIP_VERTEX:
> + c->output_clipvertex_index = loc;
> + break;
> + case VARYING_SLOT_PSIZ:
> + c->output_point_size_index = loc;
> + break;
> + }
> }
> -
> }
> }
>
> @@ -1965,10 +1945,10 @@ vc4_shader_ntq(struct vc4_context *vc4, enum qstage stage,
> case QSTAGE_FRAG:
> c->fs_key = (struct vc4_fs_key *)key;
> if (c->fs_key->is_points) {
> - c->point_x = emit_fragment_varying(c, ~0, ~0, 0);
> - c->point_y = emit_fragment_varying(c, ~0, ~0, 0);
> + c->point_x = emit_fragment_varying(c, ~0, 0);
> + c->point_y = emit_fragment_varying(c, ~0, 0);
> } else if (c->fs_key->is_lines) {
> - c->line_x = emit_fragment_varying(c, ~0, ~0, 0);
> + c->line_x = emit_fragment_varying(c, ~0, 0);
> }
> break;
> case QSTAGE_VERT:
> @@ -2043,7 +2023,7 @@ vc4_shader_ntq(struct vc4_context *vc4, enum qstage stage,
> break;
> case QSTAGE_VERT:
> emit_vert_end(c,
> - vc4->prog.fs->input_semantics,
> + vc4->prog.fs->input_slots,
> vc4->prog.fs->num_inputs);
> break;
> case QSTAGE_COORD:
> @@ -2144,7 +2124,7 @@ vc4_get_compiled_shader(struct vc4_context *vc4, enum qstage stage,
>
> shader->program_id = vc4->next_compiled_program_id++;
> if (stage == QSTAGE_FRAG) {
> - bool input_live[c->num_input_semantics];
> + bool input_live[c->num_input_slots];
>
> memset(input_live, 0, sizeof(input_live));
> list_for_each_entry(struct qinst, inst, &c->instructions, link) {
> @@ -2154,26 +2134,28 @@ vc4_get_compiled_shader(struct vc4_context *vc4, enum qstage stage,
> }
> }
>
> - shader->input_semantics = ralloc_array(shader,
> - struct vc4_varying_semantic,
> - c->num_input_semantics);
> + shader->input_slots = ralloc_array(shader,
> + struct vc4_varying_slot,
> + c->num_input_slots);
>
> - for (int i = 0; i < c->num_input_semantics; i++) {
> - struct vc4_varying_semantic *sem = &c->input_semantics[i];
> + for (int i = 0; i < c->num_input_slots; i++) {
> + struct vc4_varying_slot *slot = &c->input_slots[i];
>
> if (!input_live[i])
> continue;
>
> /* Skip non-VS-output inputs. */
> - if (sem->semantic == (uint8_t)~0)
> + if (slot->slot == (uint8_t)~0)
> continue;
>
> - if (sem->semantic == TGSI_SEMANTIC_COLOR ||
> - sem->semantic == TGSI_SEMANTIC_BCOLOR) {
> + if (slot->slot == VARYING_SLOT_COL0 ||
> + slot->slot == VARYING_SLOT_COL1 ||
> + slot->slot == VARYING_SLOT_BFC0 ||
> + slot->slot == VARYING_SLOT_BFC1) {
> shader->color_inputs |= (1 << shader->num_inputs);
> }
>
> - shader->input_semantics[shader->num_inputs] = *sem;
> + shader->input_slots[shader->num_inputs] = *slot;
> shader->num_inputs++;
> }
> } else {
> diff --git a/src/gallium/drivers/vc4/vc4_qir.c b/src/gallium/drivers/vc4/vc4_qir.c
> index 1c96ef4..b365b43 100644
> --- a/src/gallium/drivers/vc4/vc4_qir.c
> +++ b/src/gallium/drivers/vc4/vc4_qir.c
> @@ -152,7 +152,7 @@ qir_has_side_effect_reads(struct vc4_compile *c, struct qinst *inst)
> */
> for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) {
> if (inst->src[i].file == QFILE_VARY &&
> - c->input_semantics[inst->src[i].index].semantic == 0xff) {
> + c->input_slots[inst->src[i].index].slot == 0xff) {
> return true;
> }
>
> diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h
> index 80a1971..99f7781 100644
> --- a/src/gallium/drivers/vc4/vc4_qir.h
> +++ b/src/gallium/drivers/vc4/vc4_qir.h
> @@ -252,9 +252,8 @@ enum quniform_contents {
> QUNIFORM_ALPHA_REF,
> };
>
> -struct vc4_varying_semantic {
> - uint8_t semantic;
> - uint8_t index;
> +struct vc4_varying_slot {
> + uint8_t slot;
> uint8_t swizzle;
> };
>
> @@ -370,21 +369,21 @@ struct vc4_compile {
> uint8_t vattr_sizes[8];
>
> /**
> - * Array of the TGSI semantics of all FS QFILE_VARY reads.
> + * Array of the VARYING_SLOT_* of all FS QFILE_VARY reads.
> *
> * This includes those that aren't part of the VPM varyings, like
> * point/line coordinates.
> */
> - struct vc4_varying_semantic *input_semantics;
> - uint32_t num_input_semantics;
> - uint32_t input_semantics_array_size;
> + struct vc4_varying_slot *input_slots;
> + uint32_t num_input_slots;
> + uint32_t input_slots_array_size;
>
> /**
> - * An entry per outputs[] in the VS indicating what the semantic of
> - * the output is. Used to emit from the VS in the order that the FS
> - * needs.
> + * An entry per outputs[] in the VS indicating what the VARYING_SLOT_*
> + * of the output is. Used to emit from the VS in the order that the
> + * FS needs.
> */
> - struct vc4_varying_semantic *output_semantics;
> + struct vc4_varying_slot *output_slots;
>
> struct pipe_shader_state *shader_state;
> struct vc4_key *key;
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list