diff --git a/gfx/texture.cpp b/gfx/texture.cpp index f4eab57b7a..6cc617a241 100644 --- a/gfx/texture.cpp +++ b/gfx/texture.cpp @@ -68,11 +68,11 @@ bool Texture::Load(const char *filename) { glGenTextures(1, &id_); glBindTexture(GL_TEXTURE_2D, id_); if (bpp == 1) { -#if defined(USING_GLES2) - glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); -#else - glTexImage2D(GL_TEXTURE_2D, 0, 1, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); -#endif + if (gl_extensions.IsGLES) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); + } else { + glTexImage2D(GL_TEXTURE_2D, 0, 1, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); + } } else { FLOG("unsupported"); } diff --git a/gfx_es2/fbo.cpp b/gfx_es2/fbo.cpp index a338417bf3..35cd3c0ee8 100644 --- a/gfx_es2/fbo.cpp +++ b/gfx_es2/fbo.cpp @@ -19,10 +19,11 @@ #ifndef GL_DEPTH_COMPONENT24 #define GL_DEPTH_COMPONENT24 GL_DEPTH_COMPONENT24_OES #endif +#endif + #ifndef GL_DEPTH24_STENCIL8_OES #define GL_DEPTH24_STENCIL8_OES 0x88F0 #endif -#endif #ifdef IOS extern void bindDefaultFBO(); @@ -174,56 +175,56 @@ FBO *fbo_create(int width, int height, int num_color_textures, bool z_stencil, F glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -#ifdef USING_GLES2 - if (gl_extensions.OES_packed_depth_stencil) { - ILOG("Creating %i x %i FBO using DEPTH24_STENCIL8", width, height); - // Standard method + if (gl_extensions.IsGLES) { + if (gl_extensions.OES_packed_depth_stencil) { + ILOG("Creating %i x %i FBO using DEPTH24_STENCIL8", width, height); + // Standard method + fbo->stencil_buffer = 0; + fbo->z_buffer = 0; + // 24-bit Z, 8-bit stencil combined + glGenRenderbuffers(1, &fbo->z_stencil_buffer); + glBindRenderbuffer(GL_RENDERBUFFER, fbo->z_stencil_buffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, width, height); + + // Bind it all together + glBindFramebuffer(GL_FRAMEBUFFER, fbo->handle); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo->color_texture, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->z_stencil_buffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->z_stencil_buffer); + } else { + ILOG("Creating %i x %i FBO using separate stencil", width, height); + // TEGRA + fbo->z_stencil_buffer = 0; + // 16/24-bit Z, separate 8-bit stencil + glGenRenderbuffers(1, &fbo->z_buffer); + glBindRenderbuffer(GL_RENDERBUFFER, fbo->z_buffer); + glRenderbufferStorage(GL_RENDERBUFFER, gl_extensions.OES_depth24 ? GL_DEPTH_COMPONENT24 : GL_DEPTH_COMPONENT16, width, height); + + // 8-bit stencil buffer + glGenRenderbuffers(1, &fbo->stencil_buffer); + glBindRenderbuffer(GL_RENDERBUFFER, fbo->stencil_buffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height); + + // Bind it all together + glBindFramebuffer(GL_FRAMEBUFFER, fbo->handle); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo->color_texture, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->z_buffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->stencil_buffer); + } + } else { fbo->stencil_buffer = 0; fbo->z_buffer = 0; - // 24-bit Z, 8-bit stencil combined + // 24-bit Z, 8-bit stencil glGenRenderbuffers(1, &fbo->z_stencil_buffer); glBindRenderbuffer(GL_RENDERBUFFER, fbo->z_stencil_buffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, width, height); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); // Bind it all together glBindFramebuffer(GL_FRAMEBUFFER, fbo->handle); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo->color_texture, 0); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->z_stencil_buffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->z_stencil_buffer); - } else { - ILOG("Creating %i x %i FBO using separate stencil", width, height); - // TEGRA - fbo->z_stencil_buffer = 0; - // 16/24-bit Z, separate 8-bit stencil - glGenRenderbuffers(1, &fbo->z_buffer); - glBindRenderbuffer(GL_RENDERBUFFER, fbo->z_buffer); - glRenderbufferStorage(GL_RENDERBUFFER, gl_extensions.OES_depth24 ? GL_DEPTH_COMPONENT24 : GL_DEPTH_COMPONENT16, width, height); - - // 8-bit stencil buffer - glGenRenderbuffers(1, &fbo->stencil_buffer); - glBindRenderbuffer(GL_RENDERBUFFER, fbo->stencil_buffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height); - - // Bind it all together - glBindFramebuffer(GL_FRAMEBUFFER, fbo->handle); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo->color_texture, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->z_buffer); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->stencil_buffer); } -#else - fbo->stencil_buffer = 0; - fbo->z_buffer = 0; - // 24-bit Z, 8-bit stencil - glGenRenderbuffers(1, &fbo->z_stencil_buffer); - glBindRenderbuffer(GL_RENDERBUFFER, fbo->z_stencil_buffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); - - // Bind it all together - glBindFramebuffer(GL_FRAMEBUFFER, fbo->handle); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo->color_texture, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->z_stencil_buffer); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo->z_stencil_buffer); -#endif GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); switch(status) { @@ -269,9 +270,9 @@ FBO *fbo_create_from_native_fbo(GLuint native_fbo, FBO *fbo) static GLenum fbo_get_fb_target(bool read, GLuint **cached) { bool supportsBlit = gl_extensions.FBO_ARB; -#ifdef USING_GLES2 - supportsBlit = supportsBlit && (gl_extensions.GLES3 || gl_extensions.NV_framebuffer_blit); -#endif + if (gl_extensions.IsGLES) { + supportsBlit = supportsBlit && (gl_extensions.GLES3 || gl_extensions.NV_framebuffer_blit); + } // Note: GL_FRAMEBUFFER_EXT and GL_FRAMEBUFFER have the same value, same with _NV. if (supportsBlit) { diff --git a/gfx_es2/gl_state.cpp b/gfx_es2/gl_state.cpp index b378e4abcf..90045eafd6 100644 --- a/gfx_es2/gl_state.cpp +++ b/gfx_es2/gl_state.cpp @@ -97,6 +97,10 @@ void CheckGLExtensions() { done = true; memset(&gl_extensions, 0, sizeof(gl_extensions)); +#ifdef USING_GLES2 + gl_extensions.IsGLES = true; +#endif + const char *renderer = (const char *)glGetString(GL_RENDERER); const char *versionStr = (const char *)glGetString(GL_VERSION); const char *glslVersionStr = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION); @@ -141,85 +145,89 @@ void CheckGLExtensions() { gl_extensions.model[sizeof(gl_extensions.model) - 1] = 0; } -#ifndef USING_GLES2 - char buffer[64] = { 0 }; - if (versionStr) { - strncpy(buffer, versionStr, 63); - } - const char *lastNumStart = buffer; - int numVer = 0; - int len = (int)strlen(buffer); - for (int i = 0; i < len && numVer < 3; i++) { - if (buffer[i] == '.') { - buffer[i] = 0; - gl_extensions.ver[numVer++] = strtol(lastNumStart, NULL, 10); - i++; - lastNumStart = buffer + i; + if (!gl_extensions.IsGLES) { + // For desktop GL, grab the version and attempt to parse. + char buffer[64] = { 0 }; + if (versionStr) { + strncpy(buffer, versionStr, 63); } - } - if (numVer < 3) - gl_extensions.ver[numVer++] = strtol(lastNumStart, NULL, 10); -#else - gl_extensions.ver[0] = 2; -#endif - -#if defined(USING_GLES2) -#ifdef GL_MAJOR_VERSION - // Before grabbing the values, reset the error. - glGetError(); - glGetIntegerv(GL_MAJOR_VERSION, &gl_extensions.ver[0]); - glGetIntegerv(GL_MINOR_VERSION, &gl_extensions.ver[1]); - if (glGetError() != GL_NO_ERROR) { - gl_extensions.ver[0] = 2; - gl_extensions.ver[1] = 0; - } -#endif - - // If the above didn't give us a version, or gave us a crazy version, fallback. - if (gl_extensions.ver[0] < 3 || gl_extensions.ver[0] > 5) { - // Try to load GLES 3.0 only if "3.0" found in version - // This simple heuristic avoids issues on older devices where you can only call eglGetProcAddress a limited - // number of times. Make sure to check for 3.0 in the shader version too to avoid false positives, see #5584. - bool gl_3_0_in_string = strstr(versionStr, "3.0") && strstr(glslVersionStr, "3.0"); - bool gl_3_1_in_string = strstr(versionStr, "3.1") && strstr(glslVersionStr, "3.1"); // intentionally left out .1 - if ((gl_3_0_in_string || gl_3_1_in_string) && gl3stubInit()) { - gl_extensions.ver[0] = 3; - if (gl_3_1_in_string) { - gl_extensions.ver[1] = 1; + const char *lastNumStart = buffer; + int numVer = 0; + int len = (int)strlen(buffer); + for (int i = 0; i < len && numVer < 3; i++) { + if (buffer[i] == '.') { + buffer[i] = 0; + gl_extensions.ver[numVer++] = strtol(lastNumStart, NULL, 10); + i++; + lastNumStart = buffer + i; } + } + if (numVer < 3) + gl_extensions.ver[numVer++] = strtol(lastNumStart, NULL, 10); + + // If the GL version >= 4.3, we know it's a true superset of OpenGL ES 3.0 and can thus enable + // all the same modern paths. + // Most of it could be enabled on lower GPUs as well, but let's start this way. + if (gl_extensions.VersionGEThan(4, 3, 0)) { gl_extensions.GLES3 = true; - // Though, let's ban Mali from the GLES 3 path for now, see #4078 - if (strstr(renderer, "Mali") != 0) { - gl_extensions.GLES3 = false; - } - } else { - // Just to be safe. + } + } else { + // Start by assuming we're at 2.0. + gl_extensions.ver[0] = 2; + +#ifdef USING_GLES2 +#ifdef GL_MAJOR_VERSION + // Before grabbing the values, reset the error. + glGetError(); + glGetIntegerv(GL_MAJOR_VERSION, &gl_extensions.ver[0]); + glGetIntegerv(GL_MINOR_VERSION, &gl_extensions.ver[1]); + // We check error here to detect if these properties were supported. + if (glGetError() != GL_NO_ERROR) { + // They weren't, reset to GLES 2.0. gl_extensions.ver[0] = 2; gl_extensions.ver[1] = 0; } - } else { - // Otherwise, let's trust GL_MAJOR_VERSION. Note that Mali is intentionally not banned here. - if (gl_extensions.ver[0] >= 3) { - gl_extensions.GLES3 = gl3stubInit(); - } - } - - if (gl_extensions.GLES3) { - if (gl_extensions.ver[1] >= 1) { - ILOG("OpenGL ES 3.1 support detected!\n"); - } else { - ILOG("OpenGL ES 3.0 support detected!\n"); - } - } -#else - // If the GL version >= 4.3, we know it's a true superset of OpenGL ES 3.0 and can thus enable - // all the same modern paths. - // Most of it could be enabled on lower GPUs as well, but let's start this way. - if (gl_extensions.VersionGEThan(4, 3, 0)) { - gl_extensions.GLES3 = true; - } #endif + // If the above didn't give us a version, or gave us a crazy version, fallback. + if (gl_extensions.ver[0] < 3 || gl_extensions.ver[0] > 5) { + // Try to load GLES 3.0 only if "3.0" found in version + // This simple heuristic avoids issues on older devices where you can only call eglGetProcAddress a limited + // number of times. Make sure to check for 3.0 in the shader version too to avoid false positives, see #5584. + bool gl_3_0_in_string = strstr(versionStr, "3.0") && strstr(glslVersionStr, "3.0"); + bool gl_3_1_in_string = strstr(versionStr, "3.1") && strstr(glslVersionStr, "3.1"); // intentionally left out .1 + if ((gl_3_0_in_string || gl_3_1_in_string) && gl3stubInit()) { + gl_extensions.ver[0] = 3; + if (gl_3_1_in_string) { + gl_extensions.ver[1] = 1; + } + gl_extensions.GLES3 = true; + // Though, let's ban Mali from the GLES 3 path for now, see #4078 + if (strstr(renderer, "Mali") != 0) { + gl_extensions.GLES3 = false; + } + } else { + // Just to be safe. + gl_extensions.ver[0] = 2; + gl_extensions.ver[1] = 0; + } + } else { + // Otherwise, let's trust GL_MAJOR_VERSION. Note that Mali is intentionally not banned here. + if (gl_extensions.ver[0] >= 3) { + gl_extensions.GLES3 = gl3stubInit(); + } + } +#endif + + if (gl_extensions.GLES3) { + if (gl_extensions.ver[1] >= 1) { + ILOG("OpenGL ES 3.1 support detected!\n"); + } else { + ILOG("OpenGL ES 3.0 support detected!\n"); + } + } + } + const char *extString = (const char *)glGetString(GL_EXTENSIONS); if (extString) { g_all_gl_extensions = extString; @@ -260,70 +268,70 @@ void CheckGLExtensions() { gl_extensions.ARB_blend_func_extended = false; } -#ifdef USING_GLES2 - gl_extensions.OES_texture_npot = strstr(extString, "OES_texture_npot") != 0; - gl_extensions.OES_packed_depth_stencil = (strstr(extString, "GL_OES_packed_depth_stencil") != 0) || gl_extensions.GLES3; - gl_extensions.OES_depth24 = strstr(extString, "GL_OES_depth24") != 0; - gl_extensions.OES_depth_texture = strstr(extString, "GL_OES_depth_texture") != 0; - gl_extensions.OES_mapbuffer = strstr(extString, "GL_OES_mapbuffer") != 0; - gl_extensions.EXT_blend_minmax = strstr(extString, "GL_EXT_blend_minmax") != 0; - gl_extensions.EXT_unpack_subimage = strstr(extString, "GL_EXT_unpack_subimage") != 0; - gl_extensions.EXT_shader_framebuffer_fetch = strstr(extString, "GL_EXT_shader_framebuffer_fetch") != 0; - gl_extensions.NV_shader_framebuffer_fetch = strstr(extString, "GL_NV_shader_framebuffer_fetch") != 0; - gl_extensions.ARM_shader_framebuffer_fetch = strstr(extString, "GL_ARM_shader_framebuffer_fetch") != 0; - gl_extensions.ANY_shader_framebuffer_fetch = gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.NV_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch; - gl_extensions.NV_copy_image = strstr(extString, "GL_NV_copy_image") != 0; + if (gl_extensions.IsGLES) { + gl_extensions.OES_texture_npot = strstr(extString, "OES_texture_npot") != 0; + gl_extensions.OES_packed_depth_stencil = (strstr(extString, "GL_OES_packed_depth_stencil") != 0) || gl_extensions.GLES3; + gl_extensions.OES_depth24 = strstr(extString, "GL_OES_depth24") != 0; + gl_extensions.OES_depth_texture = strstr(extString, "GL_OES_depth_texture") != 0; + gl_extensions.OES_mapbuffer = strstr(extString, "GL_OES_mapbuffer") != 0; + gl_extensions.EXT_blend_minmax = strstr(extString, "GL_EXT_blend_minmax") != 0; + gl_extensions.EXT_unpack_subimage = strstr(extString, "GL_EXT_unpack_subimage") != 0; + gl_extensions.EXT_shader_framebuffer_fetch = strstr(extString, "GL_EXT_shader_framebuffer_fetch") != 0; + gl_extensions.NV_shader_framebuffer_fetch = strstr(extString, "GL_NV_shader_framebuffer_fetch") != 0; + gl_extensions.ARM_shader_framebuffer_fetch = strstr(extString, "GL_ARM_shader_framebuffer_fetch") != 0; + gl_extensions.ANY_shader_framebuffer_fetch = gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.NV_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch; + gl_extensions.NV_copy_image = strstr(extString, "GL_NV_copy_image") != 0; - // Framebuffer fetch appears to be buggy at least on Tegra 3 devices. So we blacklist it. - // Tales of Destiny 2 has been reported to display green. - if (gl_extensions.ANY_shader_framebuffer_fetch && strstr(renderer, "NVIDIA Tegra 3") != 0) { - gl_extensions.ANY_shader_framebuffer_fetch = false; - } + // Framebuffer fetch appears to be buggy at least on Tegra 3 devices. So we blacklist it. + // Tales of Destiny 2 has been reported to display green. + if (gl_extensions.ANY_shader_framebuffer_fetch && strstr(renderer, "NVIDIA Tegra 3") != 0) { + gl_extensions.ANY_shader_framebuffer_fetch = false; + } #if defined(ANDROID) || defined(BLACKBERRY) - // On Android, incredibly, this is not consistently non-zero! It does seem to have the same value though. - // https://twitter.com/ID_AA_Carmack/status/387383037794603008 + // On Android, incredibly, this is not consistently non-zero! It does seem to have the same value though. + // https://twitter.com/ID_AA_Carmack/status/387383037794603008 #ifdef _DEBUG - void *invalidAddress = (void *)eglGetProcAddress("InvalidGlCall1"); - void *invalidAddress2 = (void *)eglGetProcAddress("AnotherInvalidGlCall2"); - DLOG("Addresses returned for invalid extensions: %p %p", invalidAddress, invalidAddress2); + void *invalidAddress = (void *)eglGetProcAddress("InvalidGlCall1"); + void *invalidAddress2 = (void *)eglGetProcAddress("AnotherInvalidGlCall2"); + DLOG("Addresses returned for invalid extensions: %p %p", invalidAddress, invalidAddress2); #endif - if (gl_extensions.NV_draw_texture) { - glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)eglGetProcAddress("glDrawTextureNV"); - } + if (gl_extensions.NV_draw_texture) { + glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)eglGetProcAddress("glDrawTextureNV"); + } - if (gl_extensions.NV_copy_image) { - glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)eglGetProcAddress("glCopyImageSubDataNV"); - } + if (gl_extensions.NV_copy_image) { + glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)eglGetProcAddress("glCopyImageSubDataNV"); + } - if (gl_extensions.NV_framebuffer_blit) { - glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC)eglGetProcAddress("glBlitFramebufferNV"); - } + if (gl_extensions.NV_framebuffer_blit) { + glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC)eglGetProcAddress("glBlitFramebufferNV"); + } - gl_extensions.OES_vertex_array_object = strstr(extString, "GL_OES_vertex_array_object") != 0; - if (gl_extensions.OES_vertex_array_object) { - glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress ( "glGenVertexArraysOES" ); - glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOESPROC)eglGetProcAddress ( "glBindVertexArrayOES" ); - glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOESPROC)eglGetProcAddress ( "glDeleteVertexArraysOES" ); - glIsVertexArrayOES = (PFNGLISVERTEXARRAYOESPROC)eglGetProcAddress ( "glIsVertexArrayOES" ); - } + gl_extensions.OES_vertex_array_object = strstr(extString, "GL_OES_vertex_array_object") != 0; + if (gl_extensions.OES_vertex_array_object) { + glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress ( "glGenVertexArraysOES" ); + glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOESPROC)eglGetProcAddress ( "glBindVertexArrayOES" ); + glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOESPROC)eglGetProcAddress ( "glDeleteVertexArraysOES" ); + glIsVertexArrayOES = (PFNGLISVERTEXARRAYOESPROC)eglGetProcAddress ( "glIsVertexArrayOES" ); + } - // Hm, this should be available on iOS too. - gl_extensions.EXT_discard_framebuffer = strstr(extString, "GL_EXT_discard_framebuffer") != 0; - if (gl_extensions.EXT_discard_framebuffer) { - glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)eglGetProcAddress("glDiscardFramebufferEXT"); - } + // Hm, this should be available on iOS too. + gl_extensions.EXT_discard_framebuffer = strstr(extString, "GL_EXT_discard_framebuffer") != 0; + if (gl_extensions.EXT_discard_framebuffer) { + glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)eglGetProcAddress("glDiscardFramebufferEXT"); + } #else - gl_extensions.OES_vertex_array_object = false; - gl_extensions.EXT_discard_framebuffer = false; + gl_extensions.OES_vertex_array_object = false; + gl_extensions.EXT_discard_framebuffer = false; #endif + } else { + // Desktops support minmax and subimage unpack (GL_UNPACK_ROW_LENGTH etc) + gl_extensions.EXT_blend_minmax = true; + gl_extensions.EXT_unpack_subimage = true; + } -#else - // Desktops support minmax and subimage unpack (GL_UNPACK_ROW_LENGTH etc) - gl_extensions.EXT_blend_minmax = true; - gl_extensions.EXT_unpack_subimage = true; -#endif // GLES 3 subsumes many ES2 extensions. if (gl_extensions.GLES3) { gl_extensions.EXT_unpack_subimage = true; @@ -353,11 +361,7 @@ void CheckGLExtensions() { } #endif -#ifdef USING_GLES2 - if (true) { -#else - if (strstr(extString, "GL_ARB_ES2_compatibility")) { -#endif + if (gl_extensions.IsGLES || strstr(extString, "GL_ARB_ES2_compatibility")) { const GLint precisions[6] = { GL_LOW_FLOAT, GL_MEDIUM_FLOAT, GL_HIGH_FLOAT, GL_LOW_INT, GL_MEDIUM_INT, GL_HIGH_INT @@ -372,23 +376,21 @@ void CheckGLExtensions() { } } - -#ifdef USING_GLES2 - gl_extensions.FBO_ARB = true; - gl_extensions.FBO_EXT = false; -#else - - gl_extensions.FBO_ARB = false; - gl_extensions.FBO_EXT = false; - gl_extensions.PBO_ARB = true; - gl_extensions.PBO_NV = true; - if (strlen(extString) != 0) { - gl_extensions.FBO_ARB = strstr(extString, "GL_ARB_framebuffer_object") != 0; - gl_extensions.FBO_EXT = strstr(extString, "GL_EXT_framebuffer_object") != 0; - gl_extensions.PBO_ARB = strstr(extString, "GL_ARB_pixel_buffer_object") != 0; - gl_extensions.PBO_NV = strstr(extString, "GL_NV_pixel_buffer_object") != 0; + if (gl_extensions.IsGLES) { + gl_extensions.FBO_ARB = true; + gl_extensions.FBO_EXT = false; + } else { + gl_extensions.FBO_ARB = false; + gl_extensions.FBO_EXT = false; + gl_extensions.PBO_ARB = true; + gl_extensions.PBO_NV = true; + if (strlen(extString) != 0) { + gl_extensions.FBO_ARB = strstr(extString, "GL_ARB_framebuffer_object") != 0; + gl_extensions.FBO_EXT = strstr(extString, "GL_EXT_framebuffer_object") != 0; + gl_extensions.PBO_ARB = strstr(extString, "GL_ARB_pixel_buffer_object") != 0; + gl_extensions.PBO_NV = strstr(extString, "GL_NV_pixel_buffer_object") != 0; + } } -#endif ProcessGPUFeatures(); diff --git a/gfx_es2/gpu_features.h b/gfx_es2/gpu_features.h index 79309b8b19..cf86c6f7a4 100644 --- a/gfx_es2/gpu_features.h +++ b/gfx_es2/gpu_features.h @@ -33,6 +33,7 @@ struct GLExtensions { int gpuVendor; char model[128]; + bool IsGLES; bool GLES3; // true if the full OpenGL ES 3.0 is supported // OES @@ -92,6 +93,6 @@ extern GLExtensions gl_extensions; // Call this after filling out vendor etc to lookup the bugs etc. -// Only needs to be called ones. Currently called by CheckGLExtensions(). +// Only needs to be called once. Currently called by CheckGLExtensions(). void ProcessGPUFeatures(); diff --git a/thin3d/thin3d_gl.cpp b/thin3d/thin3d_gl.cpp index fe3ac92d32..b224a06aa5 100644 --- a/thin3d/thin3d_gl.cpp +++ b/thin3d/thin3d_gl.cpp @@ -342,11 +342,11 @@ public: // TODO: Make these actually query the right information switch (info) { case APINAME: - #ifdef USING_GLES2 - return "OpenGL ES"; - #else - return "OpenGL"; - #endif + if (gl_extensions.IsGLES) { + return "OpenGL ES"; + } else { + return "OpenGL"; + } case VENDORSTRING: return (const char *)glGetString(GL_VENDOR); case VENDOR: switch (gl_extensions.gpuVendor) {