[Mesa-dev] [PATCH 3/7] tgsi: add support for geometry shader streams.

Marek Olšák maraeo at gmail.com
Thu May 28 03:26:02 PDT 2015


Hi,

The trailing comma is allowed in array and structure initializers and
is ignored according to the standard.

Marek

On Wed, May 27, 2015 at 8:19 PM, Michael Schellenberger Costa
<schellenberger at inb.uni-luebeck.de> wrote:
> Hi,
>
> Am 27/05/2015 um 09:45 schrieb Dave Airlie:
>> This adds support to retrieve the primitive counts
>> for each stream, along with the offset for each
>> primitive into the output array.
>>
>> It also adds support for parsing the stream argument
>> to the emit and end instructions.
>>
>> Signed-off-by: Dave Airlie <airlied at redhat.com>
>> ---
>>  src/gallium/auxiliary/tgsi/tgsi_exec.c | 59 ++++++++++++++++++++++++++--------
>>  src/gallium/auxiliary/tgsi/tgsi_exec.h | 14 ++++++--
>>  2 files changed, 58 insertions(+), 15 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
>> index a098a82..f080385 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
>> @@ -706,7 +706,22 @@ enum tgsi_exec_datatype {
>>  #define TEMP_OUTPUT_C      TGSI_EXEC_TEMP_OUTPUT_C
>>  #define TEMP_PRIMITIVE_I   TGSI_EXEC_TEMP_PRIMITIVE_I
>>  #define TEMP_PRIMITIVE_C   TGSI_EXEC_TEMP_PRIMITIVE_C
>> -
>> +#define TEMP_PRIMITIVE_S1_I   TGSI_EXEC_TEMP_PRIMITIVE_S1_I
>> +#define TEMP_PRIMITIVE_S1_C   TGSI_EXEC_TEMP_PRIMITIVE_S1_C
>> +#define TEMP_PRIMITIVE_S2_I   TGSI_EXEC_TEMP_PRIMITIVE_S2_I
>> +#define TEMP_PRIMITIVE_S2_C   TGSI_EXEC_TEMP_PRIMITIVE_S2_C
>> +#define TEMP_PRIMITIVE_S3_I   TGSI_EXEC_TEMP_PRIMITIVE_S3_I
>> +#define TEMP_PRIMITIVE_S3_C   TGSI_EXEC_TEMP_PRIMITIVE_S3_C
>> +
>> +static const struct {
>> +   int idx;
>> +   int chan;
>> +} temp_prim_idxs[] = {
>> +   { TEMP_PRIMITIVE_I, TEMP_PRIMITIVE_C },
>> +   { TEMP_PRIMITIVE_S1_I, TEMP_PRIMITIVE_S1_C },
>> +   { TEMP_PRIMITIVE_S2_I, TEMP_PRIMITIVE_S2_C },
>> +   { TEMP_PRIMITIVE_S3_I, TEMP_PRIMITIVE_S3_C },
>> +};
>
> Is that last comma intentional?
>
> Regards
> Michael
>
>>
>>  /** The execution mask depends on the conditional mask and the loop mask */
>>  #define UPDATE_EXEC_MASK(MACH) \
>> @@ -1848,35 +1863,51 @@ exec_kill(struct tgsi_exec_machine *mach,
>>  }
>>
>>  static void
>> -emit_vertex(struct tgsi_exec_machine *mach)
>> +emit_vertex(struct tgsi_exec_machine *mach,
>> +            const struct tgsi_full_instruction *inst)
>>  {
>> +   union tgsi_exec_channel r[1];
>> +   unsigned stream_id;
>> +   unsigned *prim_count;
>>     /* FIXME: check for exec mask correctly
>>     unsigned i;
>>     for (i = 0; i < TGSI_QUAD_SIZE; ++i) {
>>           if ((mach->ExecMask & (1 << i)))
>>     */
>> +   IFETCH(&r[0], 0, TGSI_CHAN_X);
>> +   stream_id = r[0].u[0];
>> +   prim_count = &mach->Temps[temp_prim_idxs[stream_id].idx].xyzw[temp_prim_idxs[stream_id].chan].u[0];
>>     if (mach->ExecMask) {
>> -      if (mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]] >= mach->MaxOutputVertices)
>> +      if (mach->Primitives[stream_id][*prim_count] >= mach->MaxOutputVertices)
>>           return;
>>
>> +      mach->PrimitiveOffsets[stream_id][*prim_count] = mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0];
>>        mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] += mach->NumOutputs;
>> -      mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]]++;
>> +      mach->Primitives[stream_id][*prim_count]++;
>>     }
>>  }
>>
>>  static void
>> -emit_primitive(struct tgsi_exec_machine *mach)
>> +emit_primitive(struct tgsi_exec_machine *mach,
>> +               const struct tgsi_full_instruction *inst)
>>  {
>> -   unsigned *prim_count = &mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0];
>> +   unsigned *prim_count;
>> +   union tgsi_exec_channel r[1];
>> +   unsigned stream_id = 0;
>>     /* FIXME: check for exec mask correctly
>>     unsigned i;
>>     for (i = 0; i < TGSI_QUAD_SIZE; ++i) {
>>           if ((mach->ExecMask & (1 << i)))
>>     */
>> +   if (inst) {
>> +      IFETCH(&r[0], 0, TGSI_CHAN_X);
>> +      stream_id = r[0].u[0];
>> +   }
>> +   prim_count = &mach->Temps[temp_prim_idxs[stream_id].idx].xyzw[temp_prim_idxs[stream_id].chan].u[0];
>>     if (mach->ExecMask) {
>>        ++(*prim_count);
>>        debug_assert((*prim_count * mach->NumOutputs) < mach->MaxGeometryShaderOutputs);
>> -      mach->Primitives[*prim_count] = 0;
>> +      mach->Primitives[stream_id][*prim_count] = 0;
>>     }
>>  }
>>
>> @@ -1885,9 +1916,9 @@ conditional_emit_primitive(struct tgsi_exec_machine *mach)
>>  {
>>     if (TGSI_PROCESSOR_GEOMETRY == mach->Processor) {
>>        int emitted_verts =
>> -         mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]];
>> +         mach->Primitives[0][mach->Temps[temp_prim_idxs[0].idx].xyzw[temp_prim_idxs[0].chan].u[0]];
>>        if (emitted_verts) {
>> -         emit_primitive(mach);
>> +         emit_primitive(mach, NULL);
>>        }
>>     }
>>  }
>> @@ -4596,11 +4627,11 @@ exec_instruction(
>>        break;
>>
>>     case TGSI_OPCODE_EMIT:
>> -      emit_vertex(mach);
>> +      emit_vertex(mach, inst);
>>        break;
>>
>>     case TGSI_OPCODE_ENDPRIM:
>> -      emit_primitive(mach);
>> +      emit_primitive(mach, inst);
>>        break;
>>
>>     case TGSI_OPCODE_BGNLOOP:
>> @@ -5061,8 +5092,10 @@ tgsi_exec_machine_run( struct tgsi_exec_machine *mach )
>>     mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] = 0;
>>
>>     if( mach->Processor == TGSI_PROCESSOR_GEOMETRY ) {
>> -      mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0] = 0;
>> -      mach->Primitives[0] = 0;
>> +      for (i = 0; i < TGSI_MAX_VERTEX_STREAMS; i++) {
>> +         mach->Temps[temp_prim_idxs[i].idx].xyzw[temp_prim_idxs[i].chan].u[0] = 0;
>> +         mach->Primitives[i][0] = 0;
>> +      }
>>        /* GS runs on a single primitive for now */
>>        default_mask = 0x1;
>>     }
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
>> index 0f4c966..dd6cd23 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
>> @@ -199,7 +199,14 @@ struct tgsi_sampler
>>  #define TGSI_EXEC_TEMP_P0           (TGSI_EXEC_NUM_TEMPS + 9)
>>  #define TGSI_EXEC_NUM_PREDS         1
>>
>> -#define TGSI_EXEC_NUM_TEMP_EXTRAS   10
>> +#define TGSI_EXEC_TEMP_PRIMITIVE_S1_I  (TGSI_EXEC_NUM_TEMPS + 10)
>> +#define TGSI_EXEC_TEMP_PRIMITIVE_S1_C  0
>> +#define TGSI_EXEC_TEMP_PRIMITIVE_S2_I  (TGSI_EXEC_NUM_TEMPS + 10)
>> +#define TGSI_EXEC_TEMP_PRIMITIVE_S2_C  1
>> +#define TGSI_EXEC_TEMP_PRIMITIVE_S3_I  (TGSI_EXEC_NUM_TEMPS + 10)
>> +#define TGSI_EXEC_TEMP_PRIMITIVE_S3_C  2
>> +
>> +#define TGSI_EXEC_NUM_TEMP_EXTRAS   11
>>
>>
>>
>> @@ -230,6 +237,8 @@ struct tgsi_sampler
>>
>>  #define TGSI_MAX_MISC_INPUTS 8
>>
>> +#define TGSI_MAX_VERTEX_STREAMS 4
>> +
>>  /** function call/activation record */
>>  struct tgsi_call_record
>>  {
>> @@ -294,7 +303,8 @@ struct tgsi_exec_machine
>>     unsigned                      Processor; /**< TGSI_PROCESSOR_x */
>>
>>     /* GEOMETRY processor only. */
>> -   unsigned                      *Primitives;
>> +   unsigned                      *Primitives[TGSI_MAX_VERTEX_STREAMS];
>> +   unsigned                      *PrimitiveOffsets[TGSI_MAX_VERTEX_STREAMS];
>>     unsigned                       NumOutputs;
>>     unsigned                       MaxGeometryShaderOutputs;
>>     unsigned                       MaxOutputVertices;
>>
>
>
> _______________________________________________
> 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