Mesa (main): mesa: add HWSelectModeBeginEnd dispatch table
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jun 6 19:05:07 UTC 2022
Module: Mesa
Branch: main
Commit: c41ac0682ef6bb4945677265ee612e24b78431ca
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c41ac0682ef6bb4945677265ee612e24b78431ca
Author: Qiang Yu <yuq825 at gmail.com>
Date: Fri May 13 17:34:14 2022 +0800
mesa: add HWSelectModeBeginEnd dispatch table
Used when in glBegin/End section and HW GL_RENDER mode.
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/mesa/main/context.c | 1 +
src/mesa/main/feedback.c | 9 +++++++++
src/mesa/main/mtypes.h | 5 +++++
src/mesa/vbo/vbo.h | 3 +++
src/mesa/vbo/vbo_exec_api.c | 40 +++++++++++++++++++++++++++++++++++++---
src/mesa/vbo/vbo_noop.c | 5 +++++
6 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 6685c19c657..8a8193c521d 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1168,6 +1168,7 @@ _mesa_free_context_data(struct gl_context *ctx, bool destroy_debug_output)
free(ctx->Save);
free(ctx->ContextLost);
free(ctx->MarshalExec);
+ free(ctx->HWSelectModeBeginEnd);
/* Shared context state (display lists, textures, etc) */
_mesa_reference_shared_state(ctx, &ctx->Shared, NULL);
diff --git a/src/mesa/main/feedback.c b/src/mesa/main/feedback.c
index 34e6a82aea6..e6d925b274d 100644
--- a/src/mesa/main/feedback.c
+++ b/src/mesa/main/feedback.c
@@ -230,6 +230,15 @@ alloc_select_resource(struct gl_context *ctx)
if (!ctx->Const.HardwareAcceleratedSelect)
return;
+ if (!ctx->HWSelectModeBeginEnd) {
+ ctx->HWSelectModeBeginEnd = _mesa_alloc_dispatch_table(false);
+ if (!ctx->HWSelectModeBeginEnd) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "Cannot allocate HWSelectModeBeginEnd");
+ return;
+ }
+ vbo_install_hw_select_begin_end(ctx);
+ }
+
if (!s->SaveBuffer) {
s->SaveBuffer = malloc(NAME_STACK_BUFFER_SIZE);
if (!s->SaveBuffer) {
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 5db4417f665..4fa389d7e00 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3255,6 +3255,11 @@ struct gl_context
* display list). Only valid functions between those two are set.
*/
struct _glapi_table *BeginEnd;
+ /**
+ * Same as BeginEnd except vertex postion set functions. Used when
+ * HW GL_SELECT mode instead of BeginEnd.
+ */
+ struct _glapi_table *HWSelectModeBeginEnd;
/**
* Dispatch table for when a graphics reset has happened.
*/
diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
index 2fcbfc577b1..9e47b49d216 100644
--- a/src/mesa/vbo/vbo.h
+++ b/src/mesa/vbo/vbo.h
@@ -190,6 +190,9 @@ _vbo_DestroyContext(struct gl_context *ctx);
void
vbo_install_exec_vtxfmt(struct gl_context *ctx);
+void
+vbo_install_hw_select_begin_end(struct gl_context *ctx);
+
void
vbo_install_exec_vtxfmt_noop(struct gl_context *ctx);
diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
index 806cd6c60f8..f7ee3baa49b 100644
--- a/src/mesa/vbo/vbo_exec_api.c
+++ b/src/mesa/vbo/vbo_exec_api.c
@@ -477,7 +477,7 @@ is_vertex_position(const struct gl_context *ctx, GLuint index)
* \param C cast type (uint32_t or uint64_t)
* \param V0, V1, v2, V3 attribute value
*/
-#define ATTR_UNION(A, N, T, C, V0, V1, V2, V3) \
+#define ATTR_UNION_BASE(A, N, T, C, V0, V1, V2, V3) \
do { \
struct vbo_exec_context *exec = &vbo_context(ctx)->exec; \
int sz = (sizeof(C) / sizeof(GLfloat)); \
@@ -563,6 +563,9 @@ do { \
#define TAG(x) _mesa_##x
#define SUPPRESS_STATIC
+#define ATTR_UNION(A, N, T, C, V0, V1, V2, V3) \
+ ATTR_UNION_BASE(A, N, T, C, V0, V1, V2, V3)
+
#include "vbo_attrib_tmp.h"
@@ -842,7 +845,8 @@ _mesa_Begin(GLenum mode)
ctx->Driver.CurrentExecPrimitive = mode;
- ctx->Exec = ctx->BeginEnd;
+ ctx->Exec = _mesa_hw_select_enabled(ctx) ?
+ ctx->HWSelectModeBeginEnd : ctx->BeginEnd;
/* We may have been called from a display list, in which case we should
* leave dlist.c's dispatch table in place.
@@ -908,7 +912,8 @@ _mesa_End(void)
if (ctx->GLThread.enabled) {
ctx->CurrentServerDispatch = ctx->Exec;
- } else if (ctx->CurrentClientDispatch == ctx->BeginEnd) {
+ } else if (ctx->CurrentClientDispatch == ctx->BeginEnd ||
+ ctx->CurrentClientDispatch == ctx->HWSelectModeBeginEnd) {
ctx->CurrentClientDispatch = ctx->CurrentServerDispatch = ctx->Exec;
_glapi_set_dispatch(ctx->CurrentClientDispatch);
}
@@ -1215,3 +1220,32 @@ _es_Materialf(GLenum face, GLenum pname, GLfloat param)
p[1] = p[2] = p[3] = 0.0F;
_mesa_Materialfv(face, pname, p);
}
+
+#undef TAG
+#undef SUPPRESS_STATIC
+#define TAG(x) _hw_select_##x
+/* filter out none vertex api */
+#define HW_SELECT_MODE
+
+#undef ATTR_UNION
+#define ATTR_UNION(A, N, T, C, V0, V1, V2, V3) \
+ do { \
+ if ((A) == 0) { \
+ /* TODO: insert name stack attr. */ \
+ } \
+ ATTR_UNION_BASE(A, N, T, C, V0, V1, V2, V3); \
+ } while (0)
+
+#include "vbo_attrib_tmp.h"
+
+void
+vbo_install_hw_select_begin_end(struct gl_context *ctx)
+{
+ int numEntries = MAX2(_gloffset_COUNT, _glapi_get_dispatch_table_size());
+ memcpy(ctx->HWSelectModeBeginEnd, ctx->BeginEnd, numEntries * sizeof(_glapi_proc));
+
+#undef NAME
+#define NAME(x) _hw_select_##x
+ struct _glapi_table *tab = ctx->HWSelectModeBeginEnd;
+ #include "api_hw_select_init.h"
+}
diff --git a/src/mesa/vbo/vbo_noop.c b/src/mesa/vbo/vbo_noop.c
index f4b6120d096..9ed773d3bc5 100644
--- a/src/mesa/vbo/vbo_noop.c
+++ b/src/mesa/vbo/vbo_noop.c
@@ -134,6 +134,11 @@ vbo_install_exec_vtxfmt_noop(struct gl_context *ctx)
tab = ctx->BeginEnd;
#include "api_vtxfmt_init.h"
}
+
+ if (ctx->HWSelectModeBeginEnd) {
+ tab = ctx->HWSelectModeBeginEnd;
+ #include "api_vtxfmt_init.h"
+ }
}
More information about the mesa-commit
mailing list