[Fix] (MultiDraw): Declare original glDraw funcs.

This commit is contained in:
BZLZHH 2025-05-17 18:13:14 +08:00
parent 8d1179d232
commit 0b41cd6a38
2 changed files with 78 additions and 7 deletions

View File

@ -3,10 +3,72 @@
// //
#include "multidraw.h" #include "multidraw.h"
#include "../config/settings.h"
#include <vector> #include <vector>
#define DEBUG 0 #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 bool g_indirect_cmds_inited = false;
static GLsizei g_cmdbufsize = 0; static GLsizei g_cmdbufsize = 0;
GLuint g_indirectbuffer = 0; GLuint g_indirectbuffer = 0;
@ -281,6 +343,19 @@ void mg_glMultiDrawElements_drawelements(GLenum mode, const GLsizei *count, GLen
CHECK_GL_ERROR 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) { void mg_glMultiDrawElements_multiindirect(GLenum mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount) {
LOG() LOG()

View File

@ -33,23 +33,19 @@ struct drawcmd_compute_t {
GLint baseVertex; 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_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_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_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_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 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_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_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_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_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 #ifdef __cplusplus
} }