OpenGL ES Renderer: Do some minor changes/fixes.
- Fix a bug where _isShaderFixedLocationSupported wasn't being set to true, causing shaders to fail. - OpenGL version checks now account for non-compliant ES drivers that contain text before the version number. - Manually set the default read/draw buffers for all FBOs upon creation. We shouldn't need to do this, since they should always be set later, but just in case... - Add missing GL_BGRA macro. - Tidy up the OpenGL naming in some error strings.
This commit is contained in:
parent
3a6f2f6dc5
commit
86a29d768a
|
@ -754,30 +754,46 @@ static void OGLGetDriverVersion(const char *oglVersionString,
|
|||
|
||||
// First, check for the dot in the revision string. There should be at
|
||||
// least one present.
|
||||
const char *versionStrEnd = strstr(oglVersionString, ".");
|
||||
if (versionStrEnd == NULL)
|
||||
const char *versionStrDot = strstr(oglVersionString, ".");
|
||||
if (versionStrDot == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Next, check for the space before the vendor-specific info (if present).
|
||||
versionStrEnd = strstr(oglVersionString, " ");
|
||||
if (versionStrEnd == NULL)
|
||||
// Next, check for a space that is after the dot, but before the vendor-specific info (if present).
|
||||
versionStringLength = strlen(oglVersionString); // Set our default string length here
|
||||
const size_t endCheckLength = versionStringLength - (versionStrDot - oglVersionString); // Maximum possible length to check
|
||||
const char *checkStringLimit = (endCheckLength < 10) ? versionStrDot + endCheckLength : versionStrDot + 10; // But we're going to limit ourselves to checking only the first 10 characters
|
||||
|
||||
char *versionStrEnd = (char *)versionStrDot;
|
||||
while (versionStrEnd < checkStringLimit)
|
||||
{
|
||||
// If a space was not found, then the vendor-specific info is not present,
|
||||
// and therefore the entire string must be the version number.
|
||||
versionStringLength = strlen(oglVersionString);
|
||||
versionStrEnd++;
|
||||
if (*versionStrEnd == ' ')
|
||||
{
|
||||
versionStringLength = versionStrEnd - oglVersionString;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
// Check for any spaces before the dot. There shouldn't be any text before the version number, so
|
||||
// this step shouldn't be necessary. However, some drivers can defy the OpenGL spec and include
|
||||
// text before the version number, and so we need to handle such non-compliant drivers just in case.
|
||||
char *versionStrStart = (char *)versionStrDot;
|
||||
while (versionStrStart > oglVersionString)
|
||||
{
|
||||
// If a space was found, then the vendor-specific info is present,
|
||||
// and therefore the version number is everything before the space.
|
||||
versionStringLength = versionStrEnd - oglVersionString;
|
||||
versionStrStart--;
|
||||
if (*versionStrStart == ' ')
|
||||
{
|
||||
versionStrStart++; // Don't include the space we just checked.
|
||||
versionStringLength -= versionStrStart - oglVersionString;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Copy the version substring and parse it.
|
||||
char *versionSubstring = (char *)malloc(versionStringLength * sizeof(char));
|
||||
strncpy(versionSubstring, oglVersionString, versionStringLength);
|
||||
strncpy(versionSubstring, versionStrStart, versionStringLength);
|
||||
|
||||
unsigned int major = 0;
|
||||
unsigned int minor = 0;
|
||||
|
@ -977,28 +993,28 @@ static Render3D* OpenGLRendererCreate()
|
|||
switch (VARIANTID)
|
||||
{
|
||||
case OpenGLVariantID_Legacy_1_2:
|
||||
strncpy(variantString, "Open GL 1.2 (forced)", sizeof(variantString));
|
||||
strncpy(variantString, "OpenGL 1.2 (forced)", sizeof(variantString));
|
||||
break;
|
||||
|
||||
case OpenGLVariantID_Legacy_2_0:
|
||||
strncpy(variantString, "Open GL 2.0 (forced)", sizeof(variantString));
|
||||
strncpy(variantString, "OpenGL 2.0 (forced)", sizeof(variantString));
|
||||
break;
|
||||
|
||||
case OpenGLVariantID_Legacy_2_1:
|
||||
strncpy(variantString, "Open GL 2.1 (forced)", sizeof(variantString));
|
||||
strncpy(variantString, "OpenGL 2.1 (forced)", sizeof(variantString));
|
||||
break;
|
||||
|
||||
case OpenGLVariantID_CoreProfile_3_2:
|
||||
strncpy(variantString, "Open GL 3.2 (forced)", sizeof(variantString));
|
||||
strncpy(variantString, "OpenGL 3.2 (forced)", sizeof(variantString));
|
||||
break;
|
||||
|
||||
case OpenGLVariantID_LegacyAuto:
|
||||
case OpenGLVariantID_StandardAuto:
|
||||
strncpy(variantString, "Open GL (auto)", sizeof(variantString));
|
||||
strncpy(variantString, "OpenGL (auto)", sizeof(variantString));
|
||||
break;
|
||||
|
||||
case OpenGLVariantID_ES_3_0:
|
||||
strncpy(variantString, "Open GL ES 3.0", sizeof(variantString));
|
||||
strncpy(variantString, "OpenGL ES 3.0", sizeof(variantString));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -2983,6 +2999,10 @@ Render3DError OpenGLRenderer_1_2::CreateFBOs()
|
|||
return OGLERROR_FBO_CREATE_ERROR;
|
||||
}
|
||||
|
||||
// Assign the default read/draw buffers.
|
||||
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboFramebufferFlipID);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, OGL_COLOROUT_ATTACHMENT_ID, GL_TEXTURE_2D, OGLRef.texGColorID, 0);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, OGL_WORKING_ATTACHMENT_ID, GL_TEXTURE_2D, OGLRef.texFinalColorID, 0);
|
||||
|
@ -2995,6 +3015,10 @@ Render3DError OpenGLRenderer_1_2::CreateFBOs()
|
|||
return OGLERROR_FBO_CREATE_ERROR;
|
||||
}
|
||||
|
||||
// Assign the default read/draw buffers.
|
||||
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboRenderID);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, OGL_COLOROUT_ATTACHMENT_ID, GL_TEXTURE_2D, OGLRef.texGColorID, 0);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, OGL_POLYID_ATTACHMENT_ID, GL_TEXTURE_2D, OGLRef.texGPolyID, 0);
|
||||
|
@ -3011,6 +3035,7 @@ Render3DError OpenGLRenderer_1_2::CreateFBOs()
|
|||
return OGLERROR_FBO_CREATE_ERROR;
|
||||
}
|
||||
|
||||
// Assign the default read/draw buffers.
|
||||
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
|
||||
|
|
|
@ -306,6 +306,12 @@ EXTERNOGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT)
|
|||
|
||||
#endif // GL_EXT_framebuffer_object
|
||||
|
||||
// Some headers, such as the OpenGL ES headers, may not include this macro.
|
||||
// Add it manually to avoid compiling issues.
|
||||
#ifndef GL_BGRA
|
||||
#define GL_BGRA 0x80E1
|
||||
#endif
|
||||
|
||||
// OPENGL CORE EQUIVALENTS FOR LEGACY FUNCTIONS
|
||||
// Some OpenGL variants, such as OpenGL ES, do not include certain legacy functions in their
|
||||
// API. The loss of these functions will cause compile time errors when referenced, and so
|
||||
|
|
|
@ -949,6 +949,10 @@ Render3DError OpenGLRenderer_3_2::CreateFBOs()
|
|||
return OGLERROR_FBO_CREATE_ERROR;
|
||||
}
|
||||
|
||||
// Assign the default read/draw buffers.
|
||||
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, OGL_COLOROUT_ATTACHMENT_ID, GL_TEXTURE_2D, OGLRef.texGColorID, 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, OGL_POLYID_ATTACHMENT_ID, GL_TEXTURE_2D, OGLRef.texGPolyID, 0);
|
||||
|
@ -964,6 +968,10 @@ Render3DError OpenGLRenderer_3_2::CreateFBOs()
|
|||
return OGLERROR_FBO_CREATE_ERROR;
|
||||
}
|
||||
|
||||
// Assign the default read/draw buffers.
|
||||
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
|
||||
|
||||
OGLRef.selectedRenderingFBO = OGLRef.fboRenderID;
|
||||
INFO("OpenGL: Successfully created FBOs.\n");
|
||||
|
||||
|
|
|
@ -278,6 +278,9 @@ Render3DError OpenGLESRenderer_3_0::InitExtensions()
|
|||
// TBOs are only supported in ES 3.2.
|
||||
this->_isTBOSupported = IsOpenGLDriverVersionSupported(3, 2, 0);
|
||||
|
||||
// Fixed locations in shaders are supported in ES 3.0 by default.
|
||||
this->_isShaderFixedLocationSupported = true;
|
||||
|
||||
GLfloat maxAnisotropyOGL = 1.0f;
|
||||
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropyOGL);
|
||||
this->_deviceInfo.maxAnisotropy = (float)maxAnisotropyOGL;
|
||||
|
|
Loading…
Reference in New Issue