update extension usage..

nearly all of the previous required extensions are CORE in OpenGL 2.0
the remaining ones need to have fallback checks for ARB vs EXT vs APPLE 
variants..
This commit is contained in:
Edward Rudd 2013-12-31 16:31:03 -05:00
parent 27ae261d0e
commit eacc143ea0
5 changed files with 76 additions and 37 deletions

View File

@ -873,7 +873,7 @@ void Bitmap::drawText(const IntRect &rect, const char *str, int align)
}
TEX::bind(p->gl.tex);
TEX::uploadSubImage(posRect.x, posRect.y, posRect.w, posRect.h, txtSurf->pixels, GL_BGRA_EXT);
TEX::uploadSubImage(posRect.x, posRect.y, posRect.w, posRect.h, txtSurf->pixels, GL_BGRA);
PixelStore::reset();
}
@ -884,7 +884,7 @@ void Bitmap::drawText(const IntRect &rect, const char *str, int align)
TEXFBO &gpTF = shState->gpTexFBO(txtSurf->w, txtSurf->h);
TEX::bind(gpTF.tex);
TEX::uploadSubImage(0, 0, txtSurf->w, txtSurf->h, txtSurf->pixels, GL_BGRA_EXT);
TEX::uploadSubImage(0, 0, txtSurf->w, txtSurf->h, txtSurf->pixels, GL_BGRA);
FBO::bind(gpTF.fbo, FBO::Read);
p->bindFBO();
@ -917,7 +917,7 @@ void Bitmap::drawText(const IntRect &rect, const char *str, int align)
shader.setOpacity(txtAlpha);
shState->bindTex();
TEX::uploadSubImage(0, 0, txtSurf->w, txtSurf->h, txtSurf->pixels, GL_BGRA_EXT);
TEX::uploadSubImage(0, 0, txtSurf->w, txtSurf->h, txtSurf->pixels, GL_BGRA);
TEX::setSmooth(true);
Quad &quad = shState->gpQuad();

View File

@ -109,19 +109,19 @@ namespace RBO
inline ID gen()
{
ID id;
glGenRenderbuffersEXT(1, &id.gl);
glGenRenderbuffers(1, &id.gl);
return id;
}
inline void del(ID id)
{
glDeleteRenderbuffersEXT(1, &id.gl);
glDeleteRenderbuffers(1, &id.gl);
}
inline void bind(ID id)
{
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, id.gl);
glBindRenderbuffer(GL_RENDERBUFFER, id.gl);
}
inline void unbind()
@ -131,7 +131,7 @@ namespace RBO
inline void allocEmpty(GLsizei width, GLsizei height)
{
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
}
}
@ -155,25 +155,25 @@ namespace FBO
inline ID gen()
{
ID id;
glGenFramebuffersEXT(1, &id.gl);
glGenFramebuffers(1, &id.gl);
return id;
}
inline void del(ID id)
{
glDeleteFramebuffersEXT(1, &id.gl);
glDeleteFramebuffers(1, &id.gl);
}
inline void bind(ID id, Mode mode)
{
static const GLenum modes[] =
{
GL_DRAW_FRAMEBUFFER_EXT,
GL_READ_FRAMEBUFFER_EXT
GL_DRAW_FRAMEBUFFER,
GL_READ_FRAMEBUFFER
};
glBindFramebufferEXT(modes[mode], id.gl);
glBindFramebuffer(modes[mode], id.gl);
}
inline void unbind(Mode mode)
@ -183,12 +183,12 @@ namespace FBO
inline void setTarget(TEX::ID target, unsigned colorAttach = 0)
{
glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttach, GL_TEXTURE_2D, target.gl, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttach, GL_TEXTURE_2D, target.gl, 0);
}
inline void setTarget(RBO::ID target, unsigned colorAttach = 0)
{
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttach, GL_RENDERBUFFER, target.gl);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + colorAttach, GL_RENDERBUFFER, target.gl);
}
inline void blit(int srcX, int srcY,
@ -203,7 +203,7 @@ namespace FBO
GL_LINEAR
};
glBlitFramebufferEXT(srcX, srcY, srcX+srcW, srcY+srcH,
glBlitFramebuffer(srcX, srcY, srcX+srcW, srcY+srcH,
dstX, dstY, dstX+dstW, dstY+dstH,
GL_COLOR_BUFFER_BIT, modes[mode]);
}

View File

@ -71,20 +71,20 @@ void GLBlendMode::apply(const BlendType &value)
case BlendNormal :
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
break;
case BlendAddition :
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE,
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE,
GL_ONE, GL_ONE);
break;
case BlendSubstraction :
// FIXME Alpha calculation is untested
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT_EXT);
glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE,
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE,
GL_ONE, GL_ONE);
break;
}

View File

@ -39,21 +39,11 @@
static const char *reqExt[] =
{
"GL_ARB_fragment_shader",
"GL_ARB_shader_objects",
"GL_ARB_vertex_shader",
"GL_ARB_shading_language_100",
"GL_ARB_texture_non_power_of_two",
"GL_ARB_vertex_array_object",
"GL_ARB_vertex_buffer_object",
"GL_EXT_bgra",
"GL_EXT_blend_func_separate",
"GL_EXT_blend_subtract",
"GL_EXT_framebuffer_object",
"GL_EXT_framebuffer_blit",
// Everything we are using is CORE in OpenGL 2.0 except FBOs and VAOs which we'll handle in a special function
0
};
static void
rgssThreadError(RGSSThreadData *rtData, const std::string &msg)
{
@ -77,6 +67,50 @@ printGLInfo()
Debug() << "GLSL Version :" << glGetStringInt(GL_SHADING_LANGUAGE_VERSION);
}
static bool
setupOptionalGLExtensions(RGSSThreadData* threadData)
{
if (!GLEW_ARB_framebuffer_object) {
if (!GLEW_EXT_framebuffer_object && !GLEW_EXT_framebuffer_blit) {
rgssThreadError(threadData, "GL extensions \"GL_ARB_framebuffer_object\" or compatible extensiosns GL_EXT_framebuffer_object and GL_EXT_framebuffer_blit are not present");
return false;
} else {
// setup compat
// From EXT_framebuffer_object
glGenRenderbuffers = glGenRenderbuffersEXT;
glDeleteRenderbuffers = glDeleteRenderbuffersEXT;
glBindRenderbuffer = glBindRenderbufferEXT;
glRenderbufferStorage = glRenderbufferStorageEXT;
glGenFramebuffers = glGenFramebuffersEXT;
glDeleteFramebuffers = glDeleteFramebuffersEXT;
glBindFramebuffer = glBindFramebufferEXT;
glFramebufferTexture2D = glFramebufferTexture2DEXT;
glFramebufferRenderbuffer = glFramebufferRenderbufferEXT;
// From EXT_framebuffer_blit
glBlitFramebuffer = glBlitFramebufferEXT;
}
}
if (!GLEW_ARB_timer_query && GLEW_EXT_timer_query) {
glGetQueryObjecti64v = glGetQueryObjecti64vEXT;
glGetQueryObjectui64v = glGetQueryObjectui64vEXT;
}
if (!GLEW_ARB_vertex_array_object ) {
if (!GLEW_APPLE_vertex_array_object) {
rgssThreadError(threadData, "GL extensions \"GL_ARB_vertex_array_object\" or compatible extensiosn GL_APPLE_vertex_array_object are not present");
return false;
} else {
// setup compat
glBindVertexArray = glBindVertexArrayAPPLE;
// the cast is because apple's uses const GLuint* and ARB doesn't
glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glGenVertexArraysAPPLE;
glDeleteVertexArrays = glDeleteVertexArraysAPPLE;
}
}
return true;
}
int rgssThreadFun(void *userdata)
{
RGSSThreadData *threadData = static_cast<RGSSThreadData*>(userdata);
@ -132,6 +166,11 @@ int rgssThreadFun(void *userdata)
return 0;
}
}
/* Setup optional GL extensions */
if (!setupOptionalGLExtensions(threadData)) {
SDL_GL_DeleteContext(glCtx);
return 0;
}
SDL_GL_SetSwapInterval(threadData->config.vsync ? 1 : 0);

View File

@ -193,7 +193,7 @@ PerfTimer *createCPUTimer(int iter)
PerfTimer *createGPUTimer(int iter)
{
if (GLEW_EXT_timer_query)
if (GLEW_ARB_timer_query || GLEW_EXT_timer_query)
{
return new GPUTimerGLQuery(iter);
}