Mesa (master): softpipe/draw: fix vertex id in soft paths.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Mar 28 04:15:56 UTC 2019


Module: Mesa
Branch: master
Commit: 9f9d9c948dc665875672b5c2ee034aca18ccaf71
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9f9d9c948dc665875672b5c2ee034aca18ccaf71

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Mar 27 14:06:50 2019 +1000

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 at vmware.com>

---

 src/gallium/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




More information about the mesa-commit mailing list