# HG changeset patch # User Sam Lantinga # Date 1279117895 25200 # Node ID 3abf0b9cafad743041c06dbc6e4a24dfae230f0a # Parent a256e1dadf3f414fa90e2c477209b1b587cff346 pelya 2010-07-12 03:53:48 PDT In function GLES_RenderCopy() in SDL_renderer_gles.c:819 there is one memcpy() that can be avoided if we're updating whole texture. Because of that the SDL 1.3 in compatibility mode is working even slower than software rendering in SDL 1.2. diff -r a256e1dadf3f -r 3abf0b9cafad src/video/SDL_renderer_gles.c --- a/src/video/SDL_renderer_gles.c Wed Jul 14 07:25:07 2010 -0700 +++ b/src/video/SDL_renderer_gles.c Wed Jul 14 07:31:35 2010 -0700 @@ -822,20 +822,25 @@ maybe it'd be a good idea to keep a temp buffer around for this purpose rather than allocating it each time */ - temp_buffer = SDL_malloc(rect->w * rect->h * bpp); - temp_ptr = temp_buffer; - for (i = 0; i < rect->h; i++) { - SDL_memcpy(temp_ptr, pixels, rect->w * bpp); - temp_ptr += rect->w * bpp; - pixels += pitch; + if( rect->x == 0 && rect->w * bpp == pitch ) { + temp_buffer = pixels; /* Updating whole texture, no need to reformat */ + } else { + temp_buffer = SDL_malloc(rect->w * rect->h * bpp); + temp_ptr = temp_buffer; + for (i = 0; i < rect->h; i++) { + SDL_memcpy(temp_ptr, pixels, rect->w * bpp); + temp_ptr += rect->w * bpp; + pixels += pitch; + } } data->glTexSubImage2D(texturedata->type, 0, rect->x, rect->y, rect->w, rect->h, texturedata->format, texturedata->formattype, temp_buffer); - SDL_free(temp_buffer); - + if( temp_buffer != pixels ) { + SDL_free(temp_buffer); + } } SDL_ClearDirtyRects(&texturedata->dirty); }