Mesa (main): gallium: add pipe_vertex_element::dual_slot to move lowering to CSO creation

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 2 20:35:19 UTC 2021


Module: Mesa
Branch: main
Commit: 7b23b7c88e5de2a542cfaa2d99c40aa1a2547c5c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7b23b7c88e5de2a542cfaa2d99c40aa1a2547c5c

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri May 28 16:11:17 2021 -0400

gallium: add pipe_vertex_element::dual_slot to move lowering to CSO creation

This just adds the new field. It will be used to lower 64-bit attribs
in drivers (via a helper).

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Reviewed-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11370>

---

 src/gallium/auxiliary/vl/vl_compositor.c        |  1 +
 src/gallium/auxiliary/vl/vl_vertex_buffers.c    |  1 +
 src/gallium/frontends/lavapipe/lvp_execute.c    |  1 +
 src/gallium/frontends/nine/nine_state.c         |  2 ++
 src/gallium/frontends/nine/vertexdeclaration9.c |  1 +
 src/gallium/include/pipe/p_state.h              | 11 ++++++++++-
 src/mesa/state_tracker/st_atom_array.c          |  2 ++
 src/mesa/state_tracker/st_cb_drawtex.c          |  1 +
 src/mesa/state_tracker/st_pbo.c                 |  1 +
 9 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c
index a6ace353273..d312768d8a4 100644
--- a/src/gallium/auxiliary/vl/vl_compositor.c
+++ b/src/gallium/auxiliary/vl/vl_compositor.c
@@ -237,6 +237,7 @@ static bool
 init_buffers(struct vl_compositor *c)
 {
    struct pipe_vertex_element vertex_elems[3];
+   memset(vertex_elems, 0, sizeof(vertex_elems));
 
    assert(c);
 
diff --git a/src/gallium/auxiliary/vl/vl_vertex_buffers.c b/src/gallium/auxiliary/vl/vl_vertex_buffers.c
index 00c424f3bb4..be02b82734a 100644
--- a/src/gallium/auxiliary/vl/vl_vertex_buffers.c
+++ b/src/gallium/auxiliary/vl/vl_vertex_buffers.c
@@ -136,6 +136,7 @@ vl_vb_get_quad_vertex_element(void)
    element.src_offset = 0;
    element.instance_divisor = 0;
    element.vertex_buffer_index = 0;
+   element.dual_slot = false;
    element.src_format = PIPE_FORMAT_R32G32_FLOAT;
 
    return element;
diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index e301f9fb224..1c504a7d0e7 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -718,6 +718,7 @@ static void handle_graphics_pipeline(struct lvp_cmd_buffer_entry *cmd,
          state->velem.velems[location].src_offset = vi->pVertexAttributeDescriptions[i].offset;
          state->velem.velems[location].vertex_buffer_index = vi->pVertexAttributeDescriptions[i].binding;
          state->velem.velems[location].src_format = lvp_vk_format_to_pipe_format(vi->pVertexAttributeDescriptions[i].format);
+         state->velem.velems[location].dual_slot = false;
 
          switch (vi->pVertexBindingDescriptions[vi->pVertexAttributeDescriptions[i].binding].inputRate) {
          case VK_VERTEX_INPUT_RATE_VERTEX:
diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c
index 7be4df041af..86ed76602f0 100644
--- a/src/gallium/frontends/nine/nine_state.c
+++ b/src/gallium/frontends/nine/nine_state.c
@@ -902,6 +902,7 @@ update_vertex_elements(struct NineDevice9 *device)
             ve.velems[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
             ve.velems[n].src_offset = 0;
             ve.velems[n].instance_divisor = 0;
+            ve.velems[n].dual_slot = false;
         }
     }
 
@@ -3089,6 +3090,7 @@ update_vertex_elements_sw(struct NineDevice9 *device)
             ve.velems[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
             ve.velems[n].src_offset = 0;
             ve.velems[n].instance_divisor = 0;
+            ve.velems[n].dual_slot = false;
         }
     }
 
diff --git a/src/gallium/frontends/nine/vertexdeclaration9.c b/src/gallium/frontends/nine/vertexdeclaration9.c
index 9beeff290b3..c5001e53dd2 100644
--- a/src/gallium/frontends/nine/vertexdeclaration9.c
+++ b/src/gallium/frontends/nine/vertexdeclaration9.c
@@ -210,6 +210,7 @@ NineVertexDeclaration9_ctor( struct NineVertexDeclaration9 *This,
         This->elems[i].instance_divisor = 0;
         This->elems[i].vertex_buffer_index = This->decls[i].Stream;
         This->elems[i].src_format = decltype_format(This->decls[i].Type);
+        This->elems[i].dual_slot = false;
         /* XXX Remember Method (tesselation), Usage, UsageIndex */
 
         DBG("VERTEXELEMENT[%u]: Stream=%u Offset=%u Type=%s DeclUsage=%s%d\n", i,
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 788a74fe10f..9394f899ef4 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -679,7 +679,16 @@ struct pipe_vertex_element
    /** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does
     * this attribute live in?
     */
-   uint8_t vertex_buffer_index;
+   uint8_t vertex_buffer_index:7;
+
+   /**
+    * Whether this element refers to a dual-slot vertex shader input.
+    * The purpose of this field is to do dual-slot lowering when the CSO is
+    * created instead of during every state change.
+    *
+    * It's lowered by util_lower_uint64_vertex_elements.
+    */
+   bool dual_slot:1;
 
    /**
     * This has only 8 bits because all vertex formats should be <= 255.
diff --git a/src/mesa/state_tracker/st_atom_array.c b/src/mesa/state_tracker/st_atom_array.c
index 7cc74410724..53a45bcd08c 100644
--- a/src/mesa/state_tracker/st_atom_array.c
+++ b/src/mesa/state_tracker/st_atom_array.c
@@ -58,6 +58,7 @@ static void set_velement(struct pipe_vertex_element *velement,
    velement->src_format = format;
    velement->instance_divisor = instance_divisor;
    velement->vertex_buffer_index = vbo_index;
+   velement->dual_slot = false;
    assert(velement->src_format);
 }
 
@@ -114,6 +115,7 @@ init_velement(const struct st_vertex_program *vp,
       velements[idx].src_format = vformat->_PipeFormat;
       velements[idx].instance_divisor = instance_divisor;
       velements[idx].vertex_buffer_index = vbo_index;
+      velements[idx].dual_slot = false;
       assert(velements[idx].src_format);
       return;
    }
diff --git a/src/mesa/state_tracker/st_cb_drawtex.c b/src/mesa/state_tracker/st_cb_drawtex.c
index 013947d4b61..31c429a9b8f 100644
--- a/src/mesa/state_tracker/st_cb_drawtex.c
+++ b/src/mesa/state_tracker/st_cb_drawtex.c
@@ -311,6 +311,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
       velems.velems[i].instance_divisor = 0;
       velems.velems[i].vertex_buffer_index = 0;
       velems.velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
+      velems.velems[i].dual_slot = false;
    }
    velems.count = numAttribs;
 
diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c
index 31d5fd81084..22e0a1e40e1 100644
--- a/src/mesa/state_tracker/st_pbo.c
+++ b/src/mesa/state_tracker/st_pbo.c
@@ -254,6 +254,7 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr,
       velem.velems[0].instance_divisor = 0;
       velem.velems[0].vertex_buffer_index = 0;
       velem.velems[0].src_format = PIPE_FORMAT_R32G32_FLOAT;
+      velem.velems[0].dual_slot = false;
 
       cso_set_vertex_elements(cso, &velem);
 



More information about the mesa-commit mailing list