diff --git a/modules/juce_opengl/native/juce_MissingGLDefinitions.h b/modules/juce_opengl/native/juce_MissingGLDefinitions.h index dac8bff321..ea9fe3c67a 100644 --- a/modules/juce_opengl/native/juce_MissingGLDefinitions.h +++ b/modules/juce_opengl/native/juce_MissingGLDefinitions.h @@ -92,6 +92,10 @@ enum MissingOpenGLDefinitions GL_MULTISAMPLE = 0x809D, #endif + #ifndef GL_MAX_ELEMENTS_INDICES + GL_MAX_ELEMENTS_INDICES = 0x80E9, + #endif + #if JUCE_WINDOWS && ! defined (GL_TEXTURE0) GL_OPERAND0_RGB = 0x8590, GL_OPERAND1_RGB = 0x8591, diff --git a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp index a9b883ee02..25ebc578fc 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp @@ -1171,6 +1171,15 @@ struct StateHelpers { JUCE_CHECK_OPENGL_ERROR + #if JUCE_ANDROID || JUCE_IOS + int numQuads = maxNumQuads; + #else + GLint maxIndices = 0; + glGetIntegerv (GL_MAX_ELEMENTS_INDICES, &maxIndices); + auto numQuads = jmin ((int) maxNumQuads, (int) maxIndices / 6); + maxVertices = numQuads * 4 - 4; + #endif + for (int i = 0, v = 0; i < numQuads * 6; i += 6, v += 4) { indexData[i] = (GLushort) v; @@ -1212,7 +1221,7 @@ struct StateHelpers numVertices += 4; - if (numVertices > numQuads * 4 - 4) + if (numVertices > maxVertices) draw(); } @@ -1264,14 +1273,20 @@ struct StateHelpers GLuint colour; }; - enum { numQuads = 256 }; + enum { maxNumQuads = 256 }; GLuint buffers[2]; - VertexInfo vertexData[numQuads * 4]; - GLushort indexData[numQuads * 6]; + VertexInfo vertexData[maxNumQuads * 4]; + GLushort indexData[maxNumQuads * 6]; const OpenGLContext& context; int numVertices = 0; + #if JUCE_ANDROID || JUCE_IOS + enum { maxVertices = maxNumQuads * 4 - 4 }; + #else + int maxVertices = 0; + #endif + void draw() noexcept { context.extensions.glBufferSubData (GL_ARRAY_BUFFER, 0, (GLsizeiptr) ((size_t) numVertices * sizeof (VertexInfo)), vertexData);