diff options
-rw-r--r-- | src/mesa/main/teximage.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index cdb090542dc..3cf74f29594 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -1247,11 +1247,12 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, switch (target) { case GL_PROXY_TEXTURE_1D: - maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); - if (width < 2 * border || width > 2 * border + maxSize) - return GL_FALSE; if (level >= ctx->Const.MaxTextureLevels) return GL_FALSE; + maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); /* level zero size */ + maxSize >>= level; /* level size */ + if (width < 2 * border || width > 2 * border + maxSize) + return GL_FALSE; if (!ctx->Extensions.ARB_texture_non_power_of_two) { if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) return GL_FALSE; @@ -1259,13 +1260,14 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, return GL_TRUE; case GL_PROXY_TEXTURE_2D: + if (level >= ctx->Const.MaxTextureLevels) + return GL_FALSE; maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); + maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) return GL_FALSE; if (height < 2 * border || height > 2 * border + maxSize) return GL_FALSE; - if (level >= ctx->Const.MaxTextureLevels) - return GL_FALSE; if (!ctx->Extensions.ARB_texture_non_power_of_two) { if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) return GL_FALSE; @@ -1275,15 +1277,16 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, return GL_TRUE; case GL_PROXY_TEXTURE_3D: + if (level >= ctx->Const.Max3DTextureLevels) + return GL_FALSE; maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); + maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) return GL_FALSE; if (height < 2 * border || height > 2 * border + maxSize) return GL_FALSE; if (depth < 2 * border || depth > 2 * border + maxSize) return GL_FALSE; - if (level >= ctx->Const.Max3DTextureLevels) - return GL_FALSE; if (!ctx->Extensions.ARB_texture_non_power_of_two) { if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) return GL_FALSE; @@ -1295,23 +1298,24 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, return GL_TRUE; case GL_PROXY_TEXTURE_RECTANGLE_NV: + if (level != 0) + return GL_FALSE; maxSize = ctx->Const.MaxTextureRectSize; if (width < 0 || width > maxSize) return GL_FALSE; if (height < 0 || height > maxSize) return GL_FALSE; - if (level != 0) - return GL_FALSE; return GL_TRUE; case GL_PROXY_TEXTURE_CUBE_MAP_ARB: + if (level >= ctx->Const.MaxCubeTextureLevels) + return GL_FALSE; maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1); + maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) return GL_FALSE; if (height < 2 * border || height > 2 * border + maxSize) return GL_FALSE; - if (level >= ctx->Const.MaxCubeTextureLevels) - return GL_FALSE; if (!ctx->Extensions.ARB_texture_non_power_of_two) { if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) return GL_FALSE; @@ -1321,13 +1325,14 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, return GL_TRUE; case GL_PROXY_TEXTURE_1D_ARRAY_EXT: + if (level >= ctx->Const.MaxTextureLevels) + return GL_FALSE; maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); + maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) return GL_FALSE; if (height < 1 || height > ctx->Const.MaxArrayTextureLayers) return GL_FALSE; - if (level >= ctx->Const.MaxTextureLevels) - return GL_FALSE; if (!ctx->Extensions.ARB_texture_non_power_of_two) { if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) return GL_FALSE; @@ -1335,15 +1340,16 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, return GL_TRUE; case GL_PROXY_TEXTURE_2D_ARRAY_EXT: + if (level >= ctx->Const.MaxTextureLevels) + return GL_FALSE; maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); + maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) return GL_FALSE; if (height < 2 * border || height > 2 * border + maxSize) return GL_FALSE; if (depth < 1 || depth > ctx->Const.MaxArrayTextureLayers) return GL_FALSE; - if (level >= ctx->Const.MaxTextureLevels) - return GL_FALSE; if (!ctx->Extensions.ARB_texture_non_power_of_two) { if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) return GL_FALSE; |