Mesa (main): mesa: pass select result buffer offset as attribute/varying
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jun 6 19:05:07 UTC 2022
Module: Mesa
Branch: main
Commit: 19f373726237ff93bb2e933e1d2ca3201c154772
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=19f373726237ff93bb2e933e1d2ca3201c154772
Author: Qiang Yu <yuq825 at gmail.com>
Date: Thu Mar 17 11:23:22 2022 +0800
mesa: pass select result buffer offset as attribute/varying
Will be used by geometry shader to store hit result.
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15765>
---
src/compiler/shader_enums.h | 3 +++
src/mesa/main/ffvertex_prog.c | 14 ++++++++++++++
src/mesa/vbo/vbo_attrib.h | 3 +++
src/mesa/vbo/vbo_exec.c | 2 +-
src/mesa/vbo/vbo_exec_api.c | 8 ++++++--
src/mesa/vbo/vbo_exec_draw.c | 12 +++++++++---
6 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h
index 2846999caf0..6301b4b02ba 100644
--- a/src/compiler/shader_enums.h
+++ b/src/compiler/shader_enums.h
@@ -272,6 +272,9 @@ const char *gl_vert_attrib_name(gl_vert_attrib attrib);
#define VERT_BIT_MAT(i) VERT_BIT(VERT_ATTRIB_MAT(i))
#define VERT_BIT_MAT_ALL \
BITFIELD_RANGE(VERT_ATTRIB_MAT(0), VERT_ATTRIB_MAT_MAX)
+
+#define VERT_ATTRIB_SELECT_RESULT_OFFSET VERT_ATTRIB_GENERIC(3)
+#define VERT_BIT_SELECT_RESULT_OFFSET VERT_BIT_GENERIC(3)
/*@}*/
#define MAX_VARYING 32 /**< number of float[4] vectors */
diff --git a/src/mesa/main/ffvertex_prog.c b/src/mesa/main/ffvertex_prog.c
index c6f6234625e..c28bd732f97 100644
--- a/src/mesa/main/ffvertex_prog.c
+++ b/src/mesa/main/ffvertex_prog.c
@@ -38,6 +38,7 @@
#include "main/mtypes.h"
#include "main/macros.h"
#include "main/enums.h"
+#include "main/context.h"
#include "main/ffvertex_prog.h"
#include "program/program.h"
#include "program/prog_cache.h"
@@ -157,6 +158,16 @@ static void make_state_key( struct gl_context *ctx, struct state_key *key )
memset(key, 0, sizeof(struct state_key));
+ if (_mesa_hw_select_enabled(ctx)) {
+ /* GL_SELECT mode only need position calculation.
+ * glBegin/End use VERT_BIT_SELECT_RESULT_OFFSET for multi name stack in one draw.
+ * glDrawArrays may also be called without user shader, fallback to FF one.
+ */
+ key->varying_vp_inputs = ctx->VertexProgram._VaryingInputs &
+ (VERT_BIT_POS | VERT_BIT_SELECT_RESULT_OFFSET);
+ return;
+ }
+
/* This now relies on texenvprogram.c being active:
*/
assert(fp);
@@ -1668,6 +1679,9 @@ static void build_tnl_program( struct tnl_program *p )
else if (p->state->varying_vp_inputs & VERT_BIT_POINT_SIZE)
build_array_pointsize(p);
+ if (p->state->varying_vp_inputs & VERT_BIT_SELECT_RESULT_OFFSET)
+ emit_passthrough(p, VERT_ATTRIB_SELECT_RESULT_OFFSET, VARYING_SLOT_VAR0);
+
/* Finish up:
*/
emit_op1(p, OPCODE_END, undef, 0, undef);
diff --git a/src/mesa/vbo/vbo_attrib.h b/src/mesa/vbo/vbo_attrib.h
index 57346cb182a..b3dc2976434 100644
--- a/src/mesa/vbo/vbo_attrib.h
+++ b/src/mesa/vbo/vbo_attrib.h
@@ -96,6 +96,9 @@ enum vbo_attrib {
VBO_ATTRIB_MAT_FRONT_INDEXES,
VBO_ATTRIB_MAT_BACK_INDEXES,
+ /* Offset into HW GL_SELECT result buffer. */
+ VBO_ATTRIB_SELECT_RESULT_OFFSET,
+
VBO_ATTRIB_MAX
};
diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c
index 58b315022f5..22b9464d487 100644
--- a/src/mesa/vbo/vbo_exec.c
+++ b/src/mesa/vbo/vbo_exec.c
@@ -53,7 +53,7 @@ _vbo_attribute_alias_map[VP_MODE_MAX][VERT_ATTRIB_MAX] = {
VBO_ATTRIB_GENERIC0, /* VERT_ATTRIB_GENERIC0 */
VBO_ATTRIB_GENERIC1, /* VERT_ATTRIB_GENERIC1 */
VBO_ATTRIB_GENERIC2, /* VERT_ATTRIB_GENERIC2 */
- VBO_ATTRIB_GENERIC3, /* VERT_ATTRIB_GENERIC3 */
+ VBO_ATTRIB_SELECT_RESULT_OFFSET,/* VERT_ATTRIB_GENERIC3 */
VBO_ATTRIB_MAT_FRONT_AMBIENT, /* VERT_ATTRIB_GENERIC4 */
VBO_ATTRIB_MAT_BACK_AMBIENT, /* VERT_ATTRIB_GENERIC5 */
VBO_ATTRIB_MAT_FRONT_DIFFUSE, /* VERT_ATTRIB_GENERIC6 */
diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
index f7ee3baa49b..57008119850 100644
--- a/src/mesa/vbo/vbo_exec_api.c
+++ b/src/mesa/vbo/vbo_exec_api.c
@@ -180,6 +180,10 @@ vbo_exec_copy_to_current(struct vbo_exec_context *exec)
assert(exec->vtx.attr[i].size);
+ /* VBO_ATTRIB_SELECT_RESULT_INDEX has no current */
+ if (!current)
+ continue;
+
if (exec->vtx.attr[i].type == GL_DOUBLE ||
exec->vtx.attr[i].type == GL_UNSIGNED_INT64_ARB) {
memset(tmp, 0, sizeof(tmp));
@@ -557,7 +561,6 @@ do { \
} \
} while (0)
-
#undef ERROR
#define ERROR(err) _mesa_error(ctx, err, __func__)
#define TAG(x) _mesa_##x
@@ -1231,7 +1234,8 @@ _es_Materialf(GLenum face, GLenum pname, GLfloat param)
#define ATTR_UNION(A, N, T, C, V0, V1, V2, V3) \
do { \
if ((A) == 0) { \
- /* TODO: insert name stack attr. */ \
+ ATTR_UNION_BASE(VBO_ATTRIB_SELECT_RESULT_OFFSET, 1, GL_UNSIGNED_INT, uint32_t, \
+ ctx->Select.ResultOffset, 0, 0, 0); \
} \
ATTR_UNION_BASE(A, N, T, C, V0, V1, V2, V3); \
} while (0)
diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
index e68b9f635d8..d149985fe70 100644
--- a/src/mesa/vbo/vbo_exec_draw.c
+++ b/src/mesa/vbo/vbo_exec_draw.c
@@ -101,8 +101,14 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
const gl_vertex_processing_mode mode = ctx->VertexProgram._VPMode;
- /* Compute the bitmasks of vao_enabled arrays */
- GLbitfield vao_enabled = _vbo_get_vao_enabled_from_vbo(mode, exec->vtx.enabled);
+ GLbitfield vao_enabled, vao_filter;
+ if (_mesa_hw_select_enabled(ctx)) {
+ /* HW GL_SELECT has fixed input */
+ vao_enabled = vao_filter = VERT_BIT_POS | VERT_BIT_SELECT_RESULT_OFFSET;
+ } else {
+ vao_enabled = _vbo_get_vao_enabled_from_vbo(mode, exec->vtx.enabled);
+ vao_filter = _vbo_get_vao_filter(mode);
+ }
/* At first disable arrays no longer needed */
_mesa_disable_vertex_array_attribs(ctx, vao, VERT_BIT_ALL & ~vao_enabled);
@@ -141,7 +147,7 @@ vbo_exec_bind_arrays(struct gl_context *ctx)
assert(!exec->vtx.bufferobj ||
(vao_enabled & ~vao->VertexAttribBufferMask) == 0);
- _mesa_set_draw_vao(ctx, vao, _vbo_get_vao_filter(mode));
+ _mesa_set_draw_vao(ctx, vao, vao_filter);
}
More information about the mesa-commit
mailing list