From 0910c139eaafc66862deeb07056b56e1e4ed1c6b Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Fri, 10 May 2013 10:31:01 -0300 Subject: [PATCH] Fixes OpenGL* Clip Rect functions (by Emmanuel Gil Peyrot) --- src/render/opengl/SDL_render_gl.c | 2 +- src/render/opengles/SDL_glesfuncs.h | 1 + src/render/opengles/SDL_render_gles.c | 12 +++++++++--- src/render/opengles2/SDL_gles2funcs.h | 1 + src/render/opengles2/SDL_render_gles2.c | 12 +++++++++--- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index 08933fa2e..11c88d47c 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -794,7 +794,7 @@ GL_UpdateClipRect(SDL_Renderer * renderer) if (!SDL_RectEmpty(rect)) { data->glEnable(GL_SCISSOR_TEST); - data->glScissor(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h); + data->glScissor(rect->x, rect->h - rect->y, rect->x, rect->y); } else { data->glDisable(GL_SCISSOR_TEST); } diff --git a/src/render/opengles/SDL_glesfuncs.h b/src/render/opengles/SDL_glesfuncs.h index aade01229..36f6fe7b6 100644 --- a/src/render/opengles/SDL_glesfuncs.h +++ b/src/render/opengles/SDL_glesfuncs.h @@ -20,6 +20,7 @@ SDL_PROC(void, glMatrixMode, (GLenum)) SDL_PROC(void, glOrthof, (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat)) SDL_PROC(void, glPixelStorei, (GLenum, GLint)) SDL_PROC(void, glReadPixels, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*)) +SDL_PROC(void, glScissor, (GLint, GLint, GLsizei, GLsizei)) SDL_PROC(void, glTexCoordPointer, (GLint, GLenum, GLsizei, const GLvoid *)) SDL_PROC(void, glTexEnvf, (GLenum, GLenum, GLfloat)) SDL_PROC(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *)) diff --git a/src/render/opengles/SDL_render_gles.c b/src/render/opengles/SDL_render_gles.c index 3a7a44152..a71a346d9 100644 --- a/src/render/opengles/SDL_render_gles.c +++ b/src/render/opengles/SDL_render_gles.c @@ -635,13 +635,19 @@ GLES_UpdateViewport(SDL_Renderer * renderer) static int GLES_UpdateClipRect(SDL_Renderer * renderer) { + GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; const SDL_Rect *rect = &renderer->clip_rect; + if (SDL_CurrentContext != data->context) { + /* We'll update the clip rect after we rebind the context */ + return 0; + } + if (!SDL_RectEmpty(rect)) { - glEnable(GL_SCISSOR_TEST); - glScissor(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h); + data->glEnable(GL_SCISSOR_TEST); + data->glScissor(rect->x, rect->h - rect->y, rect->w, rect->h); } else { - glDisable(GL_SCISSOR_TEST); + data->glDisable(GL_SCISSOR_TEST); } return 0; } diff --git a/src/render/opengles2/SDL_gles2funcs.h b/src/render/opengles2/SDL_gles2funcs.h index 7b7d5e17d..d7cd1d515 100644 --- a/src/render/opengles2/SDL_gles2funcs.h +++ b/src/render/opengles2/SDL_gles2funcs.h @@ -30,6 +30,7 @@ SDL_PROC(GLint, glGetUniformLocation, (GLuint, const char *)) SDL_PROC(void, glLinkProgram, (GLuint)) SDL_PROC(void, glPixelStorei, (GLenum, GLint)) SDL_PROC(void, glReadPixels, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*)) +SDL_PROC(void, glScissor, (GLint, GLint, GLsizei, GLsizei)) SDL_PROC(void, glShaderBinary, (GLsizei, const GLuint *, GLenum, const void *, GLsizei)) SDL_PROC(void, glShaderSource, (GLuint, GLsizei, const char **, const GLint *)) SDL_PROC(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)) diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c index f55283f69..3e3af7355 100644 --- a/src/render/opengles2/SDL_render_gles2.c +++ b/src/render/opengles2/SDL_render_gles2.c @@ -278,13 +278,19 @@ GLES2_UpdateViewport(SDL_Renderer * renderer) static int GLES2_UpdateClipRect(SDL_Renderer * renderer) { + GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata; const SDL_Rect *rect = &renderer->clip_rect; + if (SDL_CurrentContext != rdata->context) { + /* We'll update the clip rect after we rebind the context */ + return 0; + } + if (!SDL_RectEmpty(rect)) { - glEnable(GL_SCISSOR_TEST); - glScissor(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h); + rdata->glEnable(GL_SCISSOR_TEST); + rdata->glScissor(rect->x, rect->h - rect->y, rect->w, rect->h); } else { - glDisable(GL_SCISSOR_TEST); + rdata->glDisable(GL_SCISSOR_TEST); } return 0; }