From 0b41cd6a387989b2e7ce4a05cf4f7c9f7f027b38 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 17 May 2025 18:13:14 +0800 Subject: [PATCH] [Fix] (MultiDraw): Declare original glDraw funcs. --- src/main/cpp/gl/multidraw.cpp | 75 +++++++++++++++++++++++++++++++++++ src/main/cpp/gl/multidraw.h | 10 ++--- 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/main/cpp/gl/multidraw.cpp b/src/main/cpp/gl/multidraw.cpp index d36aab1..f38356d 100644 --- a/src/main/cpp/gl/multidraw.cpp +++ b/src/main/cpp/gl/multidraw.cpp @@ -3,10 +3,72 @@ // #include "multidraw.h" +#include "../config/settings.h" #include #define DEBUG 0 +typedef void (*glMultiDrawElements_t)(GLenum, const GLsizei*, GLenum, const void* const*, GLsizei); + +void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount) { + static glMultiDrawElements_t func_ptr = nullptr; + + if (func_ptr == nullptr) { + switch (global_settings.multidraw_mode) { + case multidraw_mode_t::PreferIndirect: + func_ptr = mg_glMultiDrawElements_indirect; + break; + case multidraw_mode_t::PreferBaseVertex: + func_ptr = mg_glMultiDrawElements_basevertex; + break; + case multidraw_mode_t::PreferMultidrawIndirect: + func_ptr = mg_glMultiDrawElements_multiindirect; + break; + case multidraw_mode_t::DrawElements: + func_ptr = mg_glMultiDrawElements_drawelements; + break; + case multidraw_mode_t::Compute: + func_ptr = mg_glMultiDrawElements_compute; + break; + default: + func_ptr = mg_glMultiDrawElements_drawelements; + break; + } + } + func_ptr(mode, count, type, indices, primcount); +} + +typedef void (*glMultiDrawElementsBaseVertex_t)(GLenum, GLsizei*, GLenum, const void* const*, GLsizei, const GLint*); + +void glMultiDrawElementsBaseVertex(GLenum mode, GLsizei *counts, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex) { + static glMultiDrawElementsBaseVertex_t func_ptr = nullptr; + + if (func_ptr == nullptr) { + switch (global_settings.multidraw_mode) { + case multidraw_mode_t::PreferIndirect: + func_ptr = mg_glMultiDrawElementsBaseVertex_indirect; + break; + case multidraw_mode_t::PreferBaseVertex: + func_ptr = mg_glMultiDrawElementsBaseVertex_basevertex; + break; + case multidraw_mode_t::PreferMultidrawIndirect: + func_ptr = mg_glMultiDrawElementsBaseVertex_multiindirect; + break; + case multidraw_mode_t::DrawElements: + func_ptr = mg_glMultiDrawElementsBaseVertex_drawelements; + break; + case multidraw_mode_t::Compute: + func_ptr = mg_glMultiDrawElementsBaseVertex_compute; + break; + default: + func_ptr = mg_glMultiDrawElementsBaseVertex_drawelements; + break; + } + } + + func_ptr(mode, counts, type, indices, primcount, basevertex); +} + static bool g_indirect_cmds_inited = false; static GLsizei g_cmdbufsize = 0; GLuint g_indirectbuffer = 0; @@ -281,6 +343,19 @@ void mg_glMultiDrawElements_drawelements(GLenum mode, const GLsizei *count, GLen CHECK_GL_ERROR } +void mg_glMultiDrawElements_compute(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount) { + LOG() + + for (GLsizei i = 0; i < primcount; ++i) { + const GLsizei c = count[i]; + if (c > 0) { + GLES.glDrawElements(mode, c, type, indices[i]); + } + } + + CHECK_GL_ERROR +} + void mg_glMultiDrawElements_multiindirect(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount) { LOG() diff --git a/src/main/cpp/gl/multidraw.h b/src/main/cpp/gl/multidraw.h index 330e17b..3b44596 100644 --- a/src/main/cpp/gl/multidraw.h +++ b/src/main/cpp/gl/multidraw.h @@ -33,23 +33,19 @@ struct drawcmd_compute_t { GLint baseVertex; }; +GLAPI GLAPIENTRY void glMultiDrawElementsBaseVertex(GLenum mode, GLsizei *counts, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); GLAPI GLAPIENTRY void mg_glMultiDrawElementsBaseVertex_indirect(GLenum mode, GLsizei *counts, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); - GLAPI GLAPIENTRY void mg_glMultiDrawElementsBaseVertex_multiindirect(GLenum mode, GLsizei *counts, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); - GLAPI GLAPIENTRY void mg_glMultiDrawElementsBaseVertex_basevertex(GLenum mode, GLsizei *counts, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); - GLAPI GLAPIENTRY void mg_glMultiDrawElementsBaseVertex_drawelements(GLenum mode, GLsizei *counts, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); - GLAPI GLAPIENTRY void mg_glMultiDrawElementsBaseVertex_compute(GLenum mode, GLsizei *counts, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); +GLAPI GLAPIENTRY void glMultiDrawElements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount); GLAPI GLAPIENTRY void mg_glMultiDrawElements_indirect(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount); - GLAPI GLAPIENTRY void mg_glMultiDrawElements_multiindirect(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount); - GLAPI GLAPIENTRY void mg_glMultiDrawElements_basevertex(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount); - GLAPI GLAPIENTRY void mg_glMultiDrawElements_drawelements(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount); +GLAPI GLAPIENTRY void mg_glMultiDrawElements_compute(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount); #ifdef __cplusplus }