Mercurial > sdl-ios-xcode
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; }