/* run interpreter */
tgsi_exec_machine_run(machine, 0);
- for (i = 0; i < 4; i++) {
- int prim_i;
- int prim_c;
- switch (i) {
- case 0:
- prim_i = TGSI_EXEC_TEMP_PRIMITIVE_I;
- prim_c = TGSI_EXEC_TEMP_PRIMITIVE_C;
- break;
- case 1:
- prim_i = TGSI_EXEC_TEMP_PRIMITIVE_S1_I;
- prim_c = TGSI_EXEC_TEMP_PRIMITIVE_S1_C;
- break;
- case 2:
- prim_i = TGSI_EXEC_TEMP_PRIMITIVE_S2_I;
- prim_c = TGSI_EXEC_TEMP_PRIMITIVE_S2_C;
- break;
- case 3:
- prim_i = TGSI_EXEC_TEMP_PRIMITIVE_S3_I;
- prim_c = TGSI_EXEC_TEMP_PRIMITIVE_S3_C;
- break;
- };
-
- out_prims[i] = machine->Temps[prim_i].xyzw[prim_c].u[0];
- }
+ for (i = 0; i < 4; i++)
+ out_prims[i] = machine->OutputPrimCount[i];
}
#ifdef LLVM_AVAILABLE
*/
#define TEMP_KILMASK_I TGSI_EXEC_TEMP_KILMASK_I
#define TEMP_KILMASK_C TGSI_EXEC_TEMP_KILMASK_C
-#define TEMP_OUTPUT_I TGSI_EXEC_TEMP_OUTPUT_I
-#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 },
-};
/** The execution mask depends on the conditional mask and the loop mask */
#define UPDATE_EXEC_MASK(MACH) \
break;
case TGSI_FILE_OUTPUT:
- index = mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0]
- + reg->Register.Index;
+ index = mach->OutputVertexOffset + reg->Register.Index;
dst = &mach->Outputs[offset + index].xyzw[chan_index];
#if 0
debug_printf("NumOutputs = %d, TEMP_O_C/I = %d, redindex = %d\n",
{
union tgsi_exec_channel r[1];
unsigned stream_id;
- unsigned *prim_count;
+ unsigned prim_count;
/* FIXME: check for exec mask correctly
unsigned i;
for (i = 0; i < TGSI_QUAD_SIZE; ++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];
+ prim_count = mach->OutputPrimCount[stream_id];
if (mach->ExecMask) {
- if (mach->Primitives[stream_id][*prim_count] >= mach->MaxOutputVertices)
+ if (mach->Primitives[stream_id][prim_count] >= mach->MaxOutputVertices)
return;
- if (mach->Primitives[stream_id][*prim_count] == 0)
- 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[stream_id][*prim_count]++;
+ if (mach->Primitives[stream_id][prim_count] == 0)
+ mach->PrimitiveOffsets[stream_id][prim_count] = mach->OutputVertexOffset;
+ mach->OutputVertexOffset += mach->NumOutputs;
+ mach->Primitives[stream_id][prim_count]++;
}
}
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];
+ prim_count = &mach->OutputPrimCount[stream_id];
if (mach->ExecMask) {
++(*prim_count);
debug_assert((*prim_count * mach->NumOutputs) < mach->MaxGeometryShaderOutputs);
conditional_emit_primitive(struct tgsi_exec_machine *mach)
{
if (PIPE_SHADER_GEOMETRY == mach->ShaderType) {
- int emitted_verts =
- mach->Primitives[0][mach->Temps[temp_prim_idxs[0].idx].xyzw[temp_prim_idxs[0].chan].u[0]];
+ int emitted_verts = mach->Primitives[0][mach->OutputPrimCount[0]];
if (emitted_verts) {
emit_primitive(mach, NULL);
}
uint default_mask = 0xf;
mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] = 0;
- mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] = 0;
+ mach->OutputVertexOffset = 0;
if (mach->ShaderType == PIPE_SHADER_GEOMETRY) {
for (unsigned 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->OutputPrimCount[i] = 0;
mach->Primitives[i][0] = 0;
}
/* GS runs on a single primitive for now */
#define TGSI_EXEC_TEMP_KILMASK_I (TGSI_EXEC_NUM_TEMPS + 0)
#define TGSI_EXEC_TEMP_KILMASK_C 0
-#define TGSI_EXEC_TEMP_OUTPUT_I (TGSI_EXEC_NUM_TEMPS + 0)
-#define TGSI_EXEC_TEMP_OUTPUT_C 1
-
-#define TGSI_EXEC_TEMP_PRIMITIVE_I (TGSI_EXEC_NUM_TEMPS + 0)
-#define TGSI_EXEC_TEMP_PRIMITIVE_C 2
-
/* 4 register buffer for various purposes */
#define TGSI_EXEC_TEMP_R0 (TGSI_EXEC_NUM_TEMPS + 1)
#define TGSI_EXEC_NUM_TEMP_R 4
#define TGSI_EXEC_TEMP_ADDR (TGSI_EXEC_NUM_TEMPS + 5)
#define TGSI_EXEC_NUM_ADDRS 3
-#define TGSI_EXEC_TEMP_PRIMITIVE_S1_I (TGSI_EXEC_NUM_TEMPS + 8)
-#define TGSI_EXEC_TEMP_PRIMITIVE_S1_C 0
-#define TGSI_EXEC_TEMP_PRIMITIVE_S2_I (TGSI_EXEC_NUM_TEMPS + 9)
-#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
+#define TGSI_EXEC_NUM_TEMP_EXTRAS 8
enum pipe_shader_type ShaderType; /**< PIPE_SHADER_x */
/* GEOMETRY processor only. */
+ /* Number of vertices emitted per emitted primitive. */
unsigned *Primitives[TGSI_MAX_VERTEX_STREAMS];
+ /* Offsets in ->Outputs of the primitives' vertex output data */
unsigned *PrimitiveOffsets[TGSI_MAX_VERTEX_STREAMS];
unsigned NumOutputs;
unsigned MaxGeometryShaderOutputs;
unsigned MaxOutputVertices;
+ /* Offset in ->Outputs for the current vertex to be emitted. */
+ unsigned OutputVertexOffset;
+ /* Number of primitives emitted. */
+ unsigned OutputPrimCount[TGSI_MAX_VERTEX_STREAMS];
/* FRAGMENT processor only. */
const struct tgsi_interp_coef *InterpCoefs;