mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-04 18:25:27 +02:00
Move some GLES checks to runtime.
This commit is contained in:
1 parent
9baedbcc2a
commit
8487e56b42
5 files changed
+201
-197
No files matched your search
+5
-5
@@ -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");
|
||||
}
|
||||
|
||||
+44
-43
@@ -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) {
|
||||
|
||||
+145
-143
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user