softpipe/draw: fix vertex id in soft paths.
This fixes the vertex id fetch in the non-llvm drawing paths. This vertex id in elt mode comes from the elts not just a linear value. Note we don't bad basevertex in the elts case as it's already included in the elts by the looks of it (at least tests fail if I add it) Fixes piglit end-primitive tests and some others. Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
parent
893425a607
commit
9f9d9c948d
|
@ -205,6 +205,7 @@ static void
|
|||
draw_vertex_shader_run(struct draw_vertex_shader *vshader,
|
||||
const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
|
||||
unsigned const_size[PIPE_MAX_CONSTANT_BUFFERS],
|
||||
const struct draw_fetch_info *fetch_info,
|
||||
const struct draw_vertex_info *input_verts,
|
||||
struct draw_vertex_info *output_verts)
|
||||
{
|
||||
|
@ -222,7 +223,8 @@ draw_vertex_shader_run(struct draw_vertex_shader *vshader,
|
|||
const_size,
|
||||
input_verts->count,
|
||||
input_verts->vertex_size,
|
||||
input_verts->vertex_size);
|
||||
input_verts->vertex_size,
|
||||
fetch_info->elts);
|
||||
}
|
||||
|
||||
|
||||
|
@ -267,18 +269,17 @@ fetch_pipeline_generic(struct draw_pt_middle_end *middle,
|
|||
*/
|
||||
fetch( fpme->fetch, fetch_info, (char *)fetched_vert_info.verts );
|
||||
|
||||
/* Finished with fetch:
|
||||
*/
|
||||
fetch_info = NULL;
|
||||
vert_info = &fetched_vert_info;
|
||||
|
||||
/* Run the shader, note that this overwrites the data[] parts of
|
||||
* the pipeline verts.
|
||||
* Need fetch info to get vertex id correct.
|
||||
*/
|
||||
if (fpme->opt & PT_SHADE) {
|
||||
draw_vertex_shader_run(vshader,
|
||||
draw->pt.user.vs_constants,
|
||||
draw->pt.user.vs_constants_size,
|
||||
fetch_info,
|
||||
vert_info,
|
||||
&vs_vert_info);
|
||||
|
||||
|
@ -286,6 +287,10 @@ fetch_pipeline_generic(struct draw_pt_middle_end *middle,
|
|||
vert_info = &vs_vert_info;
|
||||
}
|
||||
|
||||
/* Finished with fetch:
|
||||
*/
|
||||
fetch_info = NULL;
|
||||
|
||||
if ((fpme->opt & PT_SHADE) && gshader) {
|
||||
draw_geometry_shader_run(gshader,
|
||||
draw->pt.user.gs_constants,
|
||||
|
|
|
@ -140,7 +140,8 @@ struct draw_vertex_shader {
|
|||
const unsigned const_size[PIPE_MAX_CONSTANT_BUFFERS],
|
||||
unsigned count,
|
||||
unsigned input_stride,
|
||||
unsigned output_stride );
|
||||
unsigned output_stride,
|
||||
const unsigned *fetch_elts);
|
||||
|
||||
|
||||
void (*delete)( struct draw_vertex_shader * );
|
||||
|
|
|
@ -93,7 +93,8 @@ vs_exec_run_linear(struct draw_vertex_shader *shader,
|
|||
const unsigned const_size[PIPE_MAX_CONSTANT_BUFFERS],
|
||||
unsigned count,
|
||||
unsigned input_stride,
|
||||
unsigned output_stride)
|
||||
unsigned output_stride,
|
||||
const unsigned *fetch_elts)
|
||||
{
|
||||
struct exec_vertex_shader *evs = exec_vertex_shader(shader);
|
||||
struct tgsi_exec_machine *machine = evs->machine;
|
||||
|
@ -133,7 +134,7 @@ vs_exec_run_linear(struct draw_vertex_shader *shader,
|
|||
if (shader->info.uses_vertexid) {
|
||||
unsigned vid = machine->SysSemanticToIndex[TGSI_SEMANTIC_VERTEXID];
|
||||
assert(vid < ARRAY_SIZE(machine->SystemValue));
|
||||
machine->SystemValue[vid].xyzw[0].i[j] = i + j + basevertex;
|
||||
machine->SystemValue[vid].xyzw[0].i[j] = fetch_elts ? fetch_elts[i + j] : (i + j + basevertex);
|
||||
}
|
||||
if (shader->info.uses_basevertex) {
|
||||
unsigned vid = machine->SysSemanticToIndex[TGSI_SEMANTIC_BASEVERTEX];
|
||||
|
@ -143,7 +144,7 @@ vs_exec_run_linear(struct draw_vertex_shader *shader,
|
|||
if (shader->info.uses_vertexid_nobase) {
|
||||
unsigned vid = machine->SysSemanticToIndex[TGSI_SEMANTIC_VERTEXID_NOBASE];
|
||||
assert(vid < ARRAY_SIZE(machine->SystemValue));
|
||||
machine->SystemValue[vid].xyzw[0].i[j] = i + j;
|
||||
machine->SystemValue[vid].xyzw[0].i[j] = fetch_elts ? (fetch_elts[i + j] - basevertex) : (i + j);
|
||||
}
|
||||
|
||||
for (slot = 0; slot < shader->info.num_inputs; slot++) {
|
||||
|
|
|
@ -53,7 +53,8 @@ vs_llvm_run_linear( struct draw_vertex_shader *shader,
|
|||
const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS],
|
||||
unsigned count,
|
||||
unsigned input_stride,
|
||||
unsigned output_stride )
|
||||
unsigned output_stride,
|
||||
const unsigned *elts)
|
||||
{
|
||||
/* we should never get here since the entire pipeline is
|
||||
* generated in draw_pt_fetch_shade_pipeline_llvm.c */
|
||||
|
|
|
@ -179,7 +179,7 @@ static void PIPE_CDECL vsvg_run_elts( struct draw_vs_variant *variant,
|
|||
vsvg->base.vs->draw->pt.user.vs_constants_size,
|
||||
count,
|
||||
temp_vertex_stride,
|
||||
temp_vertex_stride);
|
||||
temp_vertex_stride, NULL);
|
||||
|
||||
/* FIXME: geometry shading? */
|
||||
|
||||
|
@ -247,7 +247,7 @@ static void PIPE_CDECL vsvg_run_linear( struct draw_vs_variant *variant,
|
|||
vsvg->base.vs->draw->pt.user.vs_constants_size,
|
||||
count,
|
||||
temp_vertex_stride,
|
||||
temp_vertex_stride);
|
||||
temp_vertex_stride, NULL);
|
||||
|
||||
if (vsvg->base.key.clip) {
|
||||
/* not really handling clipping, just do the rhw so we can
|
||||
|
|
Loading…
Reference in New Issue