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 <schellenber...@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 <airl...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev