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