softpipe/draw: fix vertex id in soft paths.
authorDave Airlie <airlied@redhat.com>
Wed, 27 Mar 2019 04:06:50 +0000 (14:06 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 28 Mar 2019 04:13:08 +0000 (14:13 +1000)
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>
src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
src/gallium/auxiliary/draw/draw_vs.h
src/gallium/auxiliary/draw/draw_vs_exec.c
src/gallium/auxiliary/draw/draw_vs_llvm.c
src/gallium/auxiliary/draw/draw_vs_variant.c

index f76e022994a2d8a1db309cd17afcbda9f058b034..3207932c6019c9d069f5fc21d998e7340c815fce 100644 (file)
@@ -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,
index 6a900224c110d006ba927b780cdf1df0fe318f5d..65520ea6e7adb143019e896eed24ac23858e7a77 100644 (file)
@@ -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 * );
index dbd7aa551ebc2d07647d693e1277e3b6d67e5530..20aada25fa088a11af4e9d43a5a4ff535ddf3e77 100644 (file)
@@ -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++) {
index c92e4317216c50ebedf5638e7aa7c2514d3988e1..15486f8ffa8a778f34f336bb01ceeb401afc867c 100644 (file)
@@ -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 */
index af36a86674d0df4328f263b552602c26385cda4a..44cf29b8e476b0a067fbe472cce461c703daa05f 100644 (file)
@@ -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