From 19f373726237ff93bb2e933e1d2ca3201c154772 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Thu, 17 Mar 2022 11:23:22 +0800 Subject: [PATCH] mesa: pass select result buffer offset as attribute/varying MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Will be used by geometry shader to store hit result. Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- 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); }