Reduce duplicated code in the texture update code paths
This commit is contained in:
parent
7133afac5f
commit
e455951633
3 changed files with 76 additions and 72 deletions
|
@ -293,7 +293,6 @@ power_of_2(int input)
|
|||
static int
|
||||
GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
{
|
||||
GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata;
|
||||
GLES_TextureData *data;
|
||||
GLint internalFormat;
|
||||
GLenum format, type;
|
||||
|
@ -370,46 +369,60 @@ static int
|
|||
GLES_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||
const SDL_Rect * rect, const void *pixels, int pitch)
|
||||
{
|
||||
GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata;
|
||||
GLES_TextureData *data = (GLES_TextureData *) texture->driverdata;
|
||||
GLenum result;
|
||||
int bpp = SDL_BYTESPERPIXEL(texture->format);
|
||||
void * temp_buffer;
|
||||
void * temp_ptr;
|
||||
int i;
|
||||
Uint8 *blob = NULL;
|
||||
Uint8 *src;
|
||||
int srcPitch;
|
||||
int y;
|
||||
|
||||
GLES_ActivateRenderer(renderer);
|
||||
|
||||
/* Bail out if we're supposed to update an empty rectangle */
|
||||
if (rect->w <= 0 || rect->h <= 0)
|
||||
return 0;
|
||||
|
||||
/* Reformat the texture data into a tightly packed array */
|
||||
srcPitch = rect->w * SDL_BYTESPERPIXEL(texture->format);
|
||||
src = (Uint8 *)pixels;
|
||||
if (pitch != srcPitch)
|
||||
{
|
||||
blob = (Uint8 *)SDL_malloc(srcPitch * rect->h);
|
||||
if (!blob)
|
||||
{
|
||||
SDL_OutOfMemory();
|
||||
return -1;
|
||||
}
|
||||
src = blob;
|
||||
for (y = 0; y < rect->h; ++y)
|
||||
{
|
||||
SDL_memcpy(src, pixels, srcPitch);
|
||||
src += srcPitch;
|
||||
pixels = (Uint8 *)pixels + pitch;
|
||||
}
|
||||
src = blob;
|
||||
}
|
||||
|
||||
/* Create a texture subimage with the supplied data */
|
||||
glGetError();
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glEnable(data->type);
|
||||
glBindTexture(data->type, data->texture);
|
||||
|
||||
if( rect->w * bpp == pitch ) {
|
||||
temp_buffer = (void *)pixels; /* No need to reformat */
|
||||
} else {
|
||||
/* Reformatting of mem area required */
|
||||
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;
|
||||
}
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glTexSubImage2D(data->type,
|
||||
0,
|
||||
rect->x,
|
||||
rect->y,
|
||||
rect->w,
|
||||
rect->h,
|
||||
data->format,
|
||||
data->formattype,
|
||||
src);
|
||||
if (blob) {
|
||||
SDL_free(blob);
|
||||
}
|
||||
|
||||
glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w,
|
||||
rect->h, data->format, data->formattype,
|
||||
temp_buffer);
|
||||
|
||||
if( temp_buffer != pixels ) {
|
||||
SDL_free(temp_buffer);
|
||||
}
|
||||
|
||||
glDisable(data->type);
|
||||
result = glGetError();
|
||||
if (result != GL_NO_ERROR) {
|
||||
GLES_SetError("glTexSubImage2D()", result);
|
||||
if (glGetError() != GL_NO_ERROR)
|
||||
{
|
||||
SDL_SetError("Failed to update texture");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -431,24 +444,21 @@ GLES_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
|||
static void
|
||||
GLES_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||
{
|
||||
GLES_RenderData *renderdata = (GLES_RenderData *) renderer->driverdata;
|
||||
GLES_TextureData *data = (GLES_TextureData *) texture->driverdata;
|
||||
SDL_Rect rect;
|
||||
|
||||
GLES_ActivateRenderer(renderer);
|
||||
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glEnable(data->type);
|
||||
glBindTexture(data->type, data->texture);
|
||||
glTexSubImage2D(data->type, 0, 0, 0, texture->w,
|
||||
texture->h, data->format, data->formattype,
|
||||
data->pixels);
|
||||
glDisable(data->type);
|
||||
/* We do whole texture updates, at least for now */
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.w = texture->w;
|
||||
rect.h = texture->h;
|
||||
GLES_UpdateTexture(renderer, texture, &rect, data->pixels, data->pitch);
|
||||
}
|
||||
|
||||
static void
|
||||
GLES_SetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect)
|
||||
{
|
||||
GL_ActivateRenderer(renderer);
|
||||
GLES_ActivateRenderer(renderer);
|
||||
|
||||
if (rect) {
|
||||
int w, h;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue