mirror of
https://github.com/MobileGL-Dev/MobileGlues.git
synced 2025-09-22 02:32:29 -04:00
[Fix] (MultiDraw): Declare original glDraw funcs.
This commit is contained in:
parent
8d1179d232
commit
0b41cd6a38
@ -3,10 +3,72 @@
|
||||
//
|
||||
|
||||
#include "multidraw.h"
|
||||
#include "../config/settings.h"
|
||||
#include <vector>
|
||||
|
||||
#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()
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user