tgsi/softpipe: add VertexID support.
This required changing the system value semantics, so we stored a system value per vertex, instance id is the only other system value we currently support, so I span it across the channels. This passes the 3 vertexid-* piglit tests + lots of instanceid tests. Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
02932f37fa
commit
34a78b7ef6
|
@ -103,7 +103,8 @@ vs_exec_run_linear( struct draw_vertex_shader *shader,
|
|||
if (shader->info.uses_instanceid) {
|
||||
unsigned i = machine->SysSemanticToIndex[TGSI_SEMANTIC_INSTANCEID];
|
||||
assert(i < Elements(machine->SystemValue));
|
||||
machine->SystemValue[i][0] = shader->draw->instance_id;
|
||||
for (j = 0; j < QUAD_SIZE; j++)
|
||||
machine->SystemValue[i].i[j] = shader->draw->instance_id;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i += MAX_TGSI_VERTICES) {
|
||||
|
@ -123,6 +124,12 @@ vs_exec_run_linear( struct draw_vertex_shader *shader,
|
|||
}
|
||||
#endif
|
||||
|
||||
if (shader->info.uses_vertexid) {
|
||||
unsigned vid = machine->SysSemanticToIndex[TGSI_SEMANTIC_VERTEXID];
|
||||
assert(vid < Elements(machine->SystemValue));
|
||||
machine->SystemValue[vid].i[j] = i + j;
|
||||
}
|
||||
|
||||
for (slot = 0; slot < shader->info.num_inputs; slot++) {
|
||||
#if 0
|
||||
assert(!util_is_inf_or_nan(input[slot][0]));
|
||||
|
|
|
@ -1037,6 +1037,7 @@ micro_sub(union tgsi_exec_channel *dst,
|
|||
|
||||
static void
|
||||
fetch_src_file_channel(const struct tgsi_exec_machine *mach,
|
||||
const uint chan_index,
|
||||
const uint file,
|
||||
const uint swizzle,
|
||||
const union tgsi_exec_channel *index,
|
||||
|
@ -1097,7 +1098,7 @@ fetch_src_file_channel(const struct tgsi_exec_machine *mach,
|
|||
* gl_FragCoord, for example, in a sys value register.
|
||||
*/
|
||||
for (i = 0; i < QUAD_SIZE; i++) {
|
||||
chan->f[i] = mach->SystemValue[index->i[i]][0];
|
||||
chan->u[i] = mach->SystemValue[index->i[i]].u[i];
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1221,6 +1222,7 @@ fetch_source(const struct tgsi_exec_machine *mach,
|
|||
/* get current value of address register[swizzle] */
|
||||
swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, CHAN_X );
|
||||
fetch_src_file_channel(mach,
|
||||
chan_index,
|
||||
reg->Indirect.File,
|
||||
swizzle,
|
||||
&index2,
|
||||
|
@ -1280,6 +1282,7 @@ fetch_source(const struct tgsi_exec_machine *mach,
|
|||
|
||||
swizzle = tgsi_util_get_src_register_swizzle( ®->DimIndirect, CHAN_X );
|
||||
fetch_src_file_channel(mach,
|
||||
chan_index,
|
||||
reg->DimIndirect.File,
|
||||
swizzle,
|
||||
&index2,
|
||||
|
@ -1314,6 +1317,7 @@ fetch_source(const struct tgsi_exec_machine *mach,
|
|||
|
||||
swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
|
||||
fetch_src_file_channel(mach,
|
||||
chan_index,
|
||||
reg->Register.File,
|
||||
swizzle,
|
||||
&index,
|
||||
|
@ -1384,6 +1388,7 @@ store_dest(struct tgsi_exec_machine *mach,
|
|||
|
||||
/* fetch values from the address/indirection register */
|
||||
fetch_src_file_channel(mach,
|
||||
chan_index,
|
||||
reg->Indirect.File,
|
||||
swizzle,
|
||||
&index,
|
||||
|
@ -1433,6 +1438,7 @@ store_dest(struct tgsi_exec_machine *mach,
|
|||
|
||||
swizzle = tgsi_util_get_src_register_swizzle( ®->DimIndirect, CHAN_X );
|
||||
fetch_src_file_channel(mach,
|
||||
chan_index,
|
||||
reg->DimIndirect.File,
|
||||
swizzle,
|
||||
&index2,
|
||||
|
@ -1995,11 +2001,11 @@ exec_txf(struct tgsi_exec_machine *mach,
|
|||
if (inst->Texture.NumOffsets == 1) {
|
||||
union tgsi_exec_channel index;
|
||||
index.i[0] = index.i[1] = index.i[2] = index.i[3] = inst->TexOffsets[0].Index;
|
||||
fetch_src_file_channel(mach, inst->TexOffsets[0].File,
|
||||
fetch_src_file_channel(mach, 0, inst->TexOffsets[0].File,
|
||||
inst->TexOffsets[0].SwizzleX, &index, &ZeroVec, &offset[0]);
|
||||
fetch_src_file_channel(mach, inst->TexOffsets[0].File,
|
||||
fetch_src_file_channel(mach, 0, inst->TexOffsets[0].File,
|
||||
inst->TexOffsets[0].SwizzleY, &index, &ZeroVec, &offset[1]);
|
||||
fetch_src_file_channel(mach, inst->TexOffsets[0].File,
|
||||
fetch_src_file_channel(mach, 0, inst->TexOffsets[0].File,
|
||||
inst->TexOffsets[0].SwizzleZ, &index, &ZeroVec, &offset[2]);
|
||||
offsets[0] = offset[0].i[0];
|
||||
offsets[1] = offset[1].i[0];
|
||||
|
|
|
@ -239,7 +239,7 @@ struct tgsi_exec_machine
|
|||
|
||||
/* System values */
|
||||
unsigned SysSemanticToIndex[TGSI_SEMANTIC_COUNT];
|
||||
float SystemValue[TGSI_MAX_MISC_INPUTS][4];
|
||||
union tgsi_exec_channel SystemValue[TGSI_MAX_MISC_INPUTS];
|
||||
|
||||
struct tgsi_exec_vector *Addrs;
|
||||
struct tgsi_exec_vector *Predicates;
|
||||
|
|
Loading…
Reference in New Issue