Skip to content

Commit aec7499

Browse files
committed
Feat[basevertex]: add support for OES_draw_elements_base_vertex, EXT_draw_elements_base_vertex, EXT_multi_draw_indirect
1 parent 9efa509 commit aec7499

4 files changed

Lines changed: 23 additions & 10 deletions

File tree

ltw/src/main/tinywrapper/basevertex.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ typedef struct {
1818

1919
void basevertex_init(context_t* context) {
2020
basevertex_renderer_t *renderer = &context->basevertex;
21-
if(context->es32) {
22-
printf("LTW: BaseVertex render calls will use OpenGL ES 3.2 variants\n");
21+
if(context->drawelementsbasevertex != NULL) {
22+
printf("LTW: BaseVertex render calls will use the host driver implementation\n");
2323
return;
2424
}
2525
if(!context->es31) {
@@ -50,8 +50,8 @@ static void restore_state(GLuint element_buffer) {
5050

5151
void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) {
5252
if(!current_context) return;
53-
if(current_context->es32) {
54-
es3_functions.glDrawElementsBaseVertex(mode, count, type, indices, basevertex);
53+
if(current_context->drawelementsbasevertex != NULL) {
54+
current_context->drawelementsbasevertex(mode, count, type, indices, basevertex);
5555
return;
5656
}
5757
basevertex_renderer_t *renderer = &current_context->basevertex;
@@ -89,9 +89,9 @@ void glMultiDrawElementsBaseVertex(GLenum mode,
8989
GLsizei drawcount,
9090
const GLint *basevertex) {
9191
if(!current_context) return;
92-
if(current_context->es32) {
92+
if(current_context->drawelementsbasevertex != NULL) {
9393
for(GLsizei i = 0; i < drawcount; i++) {
94-
es3_functions.glDrawElementsBaseVertex(mode, count[i], type, indices[i], basevertex[i]);
94+
current_context->drawelementsbasevertex(mode, count[i], type, indices[i], basevertex[i]);
9595
}
9696
return;
9797
}
@@ -121,7 +121,9 @@ void glMultiDrawElementsBaseVertex(GLenum mode,
121121
}
122122
es3_functions.glBindBuffer(GL_DRAW_INDIRECT_BUFFER, renderer->indirectRenderBuffer);
123123
es3_functions.glBufferData(GL_DRAW_INDIRECT_BUFFER, (long)sizeof(indirect_pass_t) * drawcount, indirect_passes, GL_STREAM_DRAW);
124-
for(GLsizei i = 0; i < drawcount; i++) {
124+
if(current_context->multidraw_indirect) {
125+
es3_functions.glMultiDrawElementsIndirectEXT(mode, type, 0, drawcount, 0);
126+
} else for(GLsizei i = 0; i < drawcount; i++) {
125127
es3_functions.glDrawElementsIndirect(mode, type, (void*)(sizeof(indirect_pass_t) * i));
126128
}
127129
restore_state(elementbuffer);

ltw/src/main/tinywrapper/egl.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,14 @@ static void find_esversion(context_t* context) {
146146
const char* extensions = (const char*) es3_functions.glGetString(GL_EXTENSIONS);
147147
if(strstr(extensions, "GL_EXT_buffer_storage")) context->buffer_storage = true;
148148
if(strstr(extensions, "GL_EXT_texture_buffer")) context->buffer_texture_ext = true;
149+
if(strstr(extensions, "GL_EXT_multi_draw_indirect")) context->multidraw_indirect = true;
150+
151+
bool basevertex_oes = strstr(extensions, "GL_OES_draw_elements_base_vertex");
152+
bool basevertex_ext = strstr(extensions, "GL_EXT_draw_elements_base_vertex");
153+
if(context->es32) context->drawelementsbasevertex = es3_functions.glDrawElementsBaseVertex;
154+
else if(basevertex_oes) context->drawelementsbasevertex = es3_functions.glDrawElementsBaseVertexOES;
155+
else if(basevertex_ext) context->drawelementsbasevertex = es3_functions.glDrawElementsBaseVertexEXT;
156+
else context->drawelementsbasevertex = NULL;
149157

150158
build_extension_string(context);
151159

ltw/src/main/tinywrapper/egl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ typedef struct {
6060
typedef struct {
6161
EGLContext phys_context;
6262
bool context_rdy;
63-
bool es31, es32, buffer_storage, buffer_texture_ext;
64-
bool force_depth32_fallback;
63+
bool es31, es32, buffer_storage, buffer_texture_ext, multidraw_indirect;
64+
PFNGLDRAWELEMENTSBASEVERTEXPROC drawelementsbasevertex;
6565
GLint shader_version;
6666
basevertex_renderer_t basevertex;
6767
GLuint multidraw_element_buffer;

ltw/src/main/tinywrapper/es3_extended.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ GLESFUNC(glMultiDrawElementsEXT,PFNGLMULTIDRAWELEMENTSEXTPROC)
1111
GLESFUNC(glGetTexLevelParameteriv,PFNGLGETTEXLEVELPARAMETERIVPROC)
1212
GLESFUNC(glGetTexLevelParameterfv,PFNGLGETTEXLEVELPARAMETERFVPROC)
1313
GLESFUNC(glDrawElementsBaseVertex, PFNGLDRAWELEMENTSBASEVERTEXPROC)
14+
GLESFUNC(glDrawElementsBaseVertexOES, PFNGLDRAWELEMENTSBASEVERTEXOESPROC)
15+
GLESFUNC(glDrawElementsBaseVertexEXT, PFNGLDRAWELEMENTSBASEVERTEXEXTPROC)
1416
GLESFUNC(glBufferStorageEXT, PFNGLBUFFERSTORAGEEXTPROC)
1517
GLESFUNC(glTexBuffer, PFNGLTEXBUFFERPROC);
1618
GLESFUNC(glTexBufferRange, PFNGLTEXBUFFERRANGEPROC);
1719
GLESFUNC(glTexBufferEXT, PFNGLTEXBUFFEREXTPROC)
18-
GLESFUNC(glTexBufferRangeEXT, PFNGLTEXBUFFERRANGEEXTPROC)
20+
GLESFUNC(glTexBufferRangeEXT, PFNGLTEXBUFFERRANGEEXTPROC)
21+
GLESFUNC(glMultiDrawElementsIndirectEXT, PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC)

0 commit comments

Comments
 (0)