From 9f9d9c948dc665875672b5c2ee034aca18ccaf71 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 27 Mar 2019 14:06:50 +1000 Subject: [PATCH] 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 --- .../auxiliary/draw/draw_pt_fetch_shade_pipeline.c | 13 +++++++++---- src/gallium/auxiliary/draw/draw_vs.h | 3 ++- src/gallium/auxiliary/draw/draw_vs_exec.c | 7 ++++--- src/gallium/auxiliary/draw/draw_vs_llvm.c | 3 ++- src/gallium/auxiliary/draw/draw_vs_variant.c | 4 ++-- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c index f76e022994a..3207932c601 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c @@ -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, diff --git a/src/gallium/auxiliary/draw/draw_vs.h b/src/gallium/auxiliary/draw/draw_vs.h index 6a900224c11..65520ea6e7a 100644 --- a/src/gallium/auxiliary/draw/draw_vs.h +++ b/src/gallium/auxiliary/draw/draw_vs.h @@ -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 * ); diff --git a/src/gallium/auxiliary/draw/draw_vs_exec.c b/src/gallium/auxiliary/draw/draw_vs_exec.c index dbd7aa551eb..20aada25fa0 100644 --- a/src/gallium/auxiliary/draw/draw_vs_exec.c +++ b/src/gallium/auxiliary/draw/draw_vs_exec.c @@ -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++) { diff --git a/src/gallium/auxiliary/draw/draw_vs_llvm.c b/src/gallium/auxiliary/draw/draw_vs_llvm.c index c92e4317216..15486f8ffa8 100644 --- a/src/gallium/auxiliary/draw/draw_vs_llvm.c +++ b/src/gallium/auxiliary/draw/draw_vs_llvm.c @@ -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 */ diff --git a/src/gallium/auxiliary/draw/draw_vs_variant.c b/src/gallium/auxiliary/draw/draw_vs_variant.c index af36a86674d..44cf29b8e47 100644 --- a/src/gallium/auxiliary/draw/draw_vs_variant.c +++ b/src/gallium/auxiliary/draw/draw_vs_variant.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 -- 2.30.2