diff src/video/SDL_renderer_gles.c @ 5150:ad50b3db78bd

The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
author Sam Lantinga <slouken@libsdl.org>
date Tue, 01 Feb 2011 19:19:43 -0800
parents c8e049de174c
children 5429daf5e3f9
line wrap: on
line diff
--- a/src/video/SDL_renderer_gles.c	Tue Feb 01 19:15:42 2011 -0800
+++ b/src/video/SDL_renderer_gles.c	Tue Feb 01 19:19:43 2011 -0800
@@ -54,8 +54,8 @@
 static const float inv255f = 1.0f / 255.0f;
 
 static SDL_Renderer *GLES_CreateRenderer(SDL_Window * window, Uint32 flags);
-static int GLES_ActivateRenderer(SDL_Renderer * renderer);
-static int GLES_DisplayModeChanged(SDL_Renderer * renderer);
+static void GLES_WindowEvent(SDL_Renderer * renderer,
+                             const SDL_WindowEvent *event);
 static int GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
 static int GLES_QueryTexturePixels(SDL_Renderer * renderer,
                                    SDL_Texture * texture, void **pixels,
@@ -218,8 +218,7 @@
         return NULL;
     }
 
-    renderer->ActivateRenderer = GLES_ActivateRenderer;
-    renderer->DisplayModeChanged = GLES_DisplayModeChanged;
+    renderer->WindowEvent = GLES_WindowEvent;
     renderer->CreateTexture = GLES_CreateTexture;
     renderer->QueryTexturePixels = GLES_QueryTexturePixels;
     renderer->SetTexturePalette = GLES_SetTexturePalette;
@@ -311,6 +310,8 @@
     return renderer;
 }
 
+static SDL_GLContext SDL_CurrentContext = NULL;
+
 static int
 GLES_ActivateRenderer(SDL_Renderer * renderer)
 {
@@ -318,8 +319,11 @@
     GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
     SDL_Window *window = renderer->window;
 
-    if (SDL_GL_MakeCurrent(window, data->context) < 0) {
-        return -1;
+    if (SDL_CurrentContext != data->context) {
+        if (SDL_GL_MakeCurrent(window, data->context) < 0) {
+            return -1;
+        }
+        SDL_CurrentContext = data->context;
     }
     if (data->updateSize) {
         data->glMatrixMode(GL_PROJECTION);
@@ -334,13 +338,16 @@
     return 0;
 }
 
-static int
-GLES_DisplayModeChanged(SDL_Renderer * renderer)
+static void
+GLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
 {
     GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
 
-    data->updateSize = SDL_TRUE;
-    return 0;
+    if (event->event == SDL_WINDOWEVENT_RESIZED) {
+        /* Rebind the context to the window area and update matrices */
+        SDL_CurrentContext = NULL;
+        data->updateSize = SDL_TRUE;
+    }
 }
 
 static __inline__ int
@@ -364,6 +371,8 @@
     int texture_w, texture_h;
     GLenum result;
 
+    GLES_ActivateRenderer(renderer);
+
     switch (texture->format) {
     case SDL_PIXELFORMAT_RGB24:
         internalFormat = GL_RGB;
@@ -498,6 +507,8 @@
     void * temp_ptr;
     int i;
 
+    GLES_ActivateRenderer(renderer);
+
     renderdata->glGetError();
     renderdata->glEnable(data->type);
     SetupTextureUpdate(renderdata, texture, pitch);
@@ -599,6 +610,8 @@
     int i;
     GLshort *vertices;
 
+    GLES_ActivateRenderer(renderer);
+
     GLES_SetBlendMode(data, renderer->blendMode);
 
     data->glColor4f((GLfloat) renderer->r * inv255f,
@@ -626,6 +639,8 @@
     int i;
     GLshort *vertices;
 
+    GLES_ActivateRenderer(renderer);
+
     GLES_SetBlendMode(data, renderer->blendMode);
 
     data->glColor4f((GLfloat) renderer->r * inv255f,
@@ -659,6 +674,8 @@
     GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
     int i;
 
+    GLES_ActivateRenderer(renderer);
+
     GLES_SetBlendMode(data, renderer->blendMode);
 
     data->glColor4f((GLfloat) renderer->r * inv255f,
@@ -696,6 +713,8 @@
     GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
     int i;
 
+    GLES_ActivateRenderer(renderer);
+
     GLES_SetBlendMode(data, renderer->blendMode);
 
     data->glColor4f((GLfloat) renderer->r * inv255f,
@@ -739,6 +758,8 @@
     void *temp_buffer;          /* used for reformatting dirty rect pixels */
     void *temp_ptr;
 
+    GLES_ActivateRenderer(renderer);
+
     data->glEnable(GL_TEXTURE_2D);
 
     if (texturedata->dirty.list) {
@@ -859,6 +880,8 @@
 static void
 GLES_RenderPresent(SDL_Renderer * renderer)
 {
+    GLES_ActivateRenderer(renderer);
+
     SDL_GL_SwapWindow(renderer->window);
 }
 
@@ -867,6 +890,8 @@
 {
     GLES_TextureData *data = (GLES_TextureData *) texture->driverdata;
 
+    GLES_ActivateRenderer(renderer);
+
     if (!data) {
         return;
     }