147 lines
5.9 KiB
Diff
147 lines
5.9 KiB
Diff
From 9cf1afbf8ae87ddbb29b24a0f9f2724e9e2935c1 Mon Sep 17 00:00:00 2001
|
|
From: Brian Paul <brianp@vmware.com>
|
|
Date: Tue, 4 Sep 2012 20:17:15 -0600
|
|
Subject: [PATCH 03/13] mesa: fix per-level max texture size error checking
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This is a long-standing omission in Mesa's texture image size checking.
|
|
We need to take the mipmap level into consideration when checking if the
|
|
width, height and depth are too large.
|
|
|
|
Fixes the new piglit max-texture-size-level test.
|
|
Thanks to Stéphane Marchesin for finding this problem.
|
|
|
|
Note: This is a candidate for the stable branches.
|
|
|
|
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
|
|
(cherry picked from commit 771e7b6d884bb4294a89f276a904d90b28efb90a)
|
|
---
|
|
src/mesa/main/teximage.c | 36 +++++++++++++++++++++---------------
|
|
1 file changed, 21 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
|
|
index 3aecc0f..ed22fa9 100644
|
|
--- a/src/mesa/main/teximage.c
|
|
+++ b/src/mesa/main/teximage.c
|
|
@@ -1251,11 +1251,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;
|
|
@@ -1263,13 +1264,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;
|
|
@@ -1279,15 +1281,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;
|
|
@@ -1299,23 +1302,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;
|
|
@@ -1325,13 +1329,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;
|
|
@@ -1339,15 +1344,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;
|
|
--
|
|
1.9.2
|
|
|