Fixed bug 2122 - SDL_CreateTexture allows illegal texture sizes
Lloyd Bryant
SDL_CreateTexture() is succeeding (i.e. returning a valid pointer) when the requested horizontal or vertical size of the texture exceeds the maximum allowed by the render. This results in hard-to-understand errors showing up when later attempting to use that texture (such as with SDL_SetRenderTarget()).
--- a/src/render/SDL_render.c Mon Sep 30 21:57:03 2013 -0700
+++ b/src/render/SDL_render.c Mon Sep 30 22:16:14 2013 -0700
@@ -410,6 +410,11 @@
SDL_SetError("Texture dimensions can't be 0");
return NULL;
}
+ if ((renderer->info.max_texture_width && w > renderer->info.max_texture_width) ||
+ (renderer->info.max_texture_height && h > renderer->info.max_texture_height)) {
+ SDL_SetError("Texture dimensions are limited to %dx%d", renderer->info.max_texture_width, renderer->info.max_texture_height);
+ return NULL;
+ }
texture = (SDL_Texture *) SDL_calloc(1, sizeof(*texture));
if (!texture) {
SDL_OutOfMemory();
--- a/src/render/opengles2/SDL_render_gles2.c Mon Sep 30 21:57:03 2013 -0700
+++ b/src/render/opengles2/SDL_render_gles2.c Mon Sep 30 22:16:14 2013 -0700
@@ -1627,6 +1627,7 @@
#endif
Uint32 windowFlags;
GLint window_framebuffer;
+ GLint value;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
@@ -1685,6 +1686,13 @@
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
}
+ value = 0;
+ rdata->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
+ renderer->info.max_texture_width = value;
+ value = 0;
+ rdata->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
+ renderer->info.max_texture_height = value;
+
/* Determine supported shader formats */
/* HACK: glGetInteger is broken on the Zune HD's compositor, so we just hardcode this */
rdata->glGetError();