[Mesa-dev] [PATCH 2/2] tgsi_to_nir: Convert to using VARYING_SLOT_* / FRAG_RESULT_*.

Eric Anholt eric at anholt.net
Wed Aug 5 21:05:58 PDT 2015


Rob Clark <robdclark at gmail.com> writes:

> 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_*...

So we just add semantic_index here -- anything else?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150805/47ed1217/attachment.sig>


More information about the mesa-dev mailing list