diff options
-rw-r--r-- | src/mesa/main/teximage.c | 81 |
1 files changed, 70 insertions, 11 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 76dcd9c514d..fa00183ac65 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -3031,15 +3031,12 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, const GLenum proxyTarget = get_proxy_target(target); const GLint maxLevels = _mesa_max_texture_levels(ctx, target); GLint expectedSize; + GLenum choose_format; + GLenum choose_type; + GLenum proxy_format; *reason = ""; /* no error */ - /* check level */ - if (level < 0 || level >= maxLevels) { - *reason = "level"; - return GL_INVALID_VALUE; - } - if (!target_can_be_compressed(ctx, target, internalFormat)) { *reason = "target"; return GL_INVALID_ENUM; @@ -3051,6 +3048,68 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, return GL_INVALID_ENUM; } + switch (internalFormat) { +#if FEATURE_ES + case GL_PALETTE4_RGB8_OES: + case GL_PALETTE4_RGBA8_OES: + case GL_PALETTE4_R5_G6_B5_OES: + case GL_PALETTE4_RGBA4_OES: + case GL_PALETTE4_RGB5_A1_OES: + case GL_PALETTE8_RGB8_OES: + case GL_PALETTE8_RGBA8_OES: + case GL_PALETTE8_R5_G6_B5_OES: + case GL_PALETTE8_RGBA4_OES: + case GL_PALETTE8_RGB5_A1_OES: + _mesa_cpal_compressed_format_type(internalFormat, &choose_format, + &choose_type); + proxy_format = choose_format; + + /* check level */ + if (level > 0 || level < -maxLevels) { + *reason = "level"; + return GL_INVALID_VALUE; + } + + if (dimensions != 2) { + *reason = "compressed paletted textures must be 2D"; + return GL_INVALID_OPERATION; + } + + /* Figure out the expected texture size (in bytes). This will be + * checked against the actual size later. + */ + expectedSize = _mesa_cpal_compressed_size(level, internalFormat, + width, height); + + /* This is for the benefit of the TestProxyTexImage below. It expects + * level to be non-negative. OES_compressed_paletted_texture uses a + * weird mechanism where the level specified to glCompressedTexImage2D + * is -(n-1) number of levels in the texture, and the data specifies the + * complete mipmap stack. This is done to ensure the palette is the + * same for all levels. + */ + level = -level; + break; +#endif + + default: + choose_format = GL_NONE; + choose_type = GL_NONE; + proxy_format = internalFormat; + + /* check level */ + if (level < 0 || level >= maxLevels) { + *reason = "level"; + return GL_INVALID_VALUE; + } + + /* Figure out the expected texture size (in bytes). This will be + * checked against the actual size later. + */ + expectedSize = compressed_tex_size(width, height, depth, internalFormat); + break; + } + /* This should really never fail */ if (_mesa_base_tex_format(ctx, internalFormat) < 0) { *reason = "internalFormat"; @@ -3073,8 +3132,8 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, /* check image size against compression block size */ { gl_format texFormat = - ctx->Driver.ChooseTextureFormat(ctx, internalFormat, - GL_NONE, GL_NONE); + ctx->Driver.ChooseTextureFormat(ctx, proxy_format, + choose_format, choose_type); GLuint bw, bh; _mesa_get_format_block_size(texFormat, &bw, &bh); @@ -3092,15 +3151,15 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, /* check image sizes */ if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, - internalFormat, GL_NONE, GL_NONE, - width, height, depth, border)) { + proxy_format, choose_format, + choose_type, + width, height, depth, border)) { /* See error comment above */ *reason = "invalid width, height or format"; return GL_INVALID_OPERATION; } /* check image size in bytes */ - expectedSize = compressed_tex_size(width, height, depth, internalFormat); if (expectedSize != imageSize) { /* Per GL_ARB_texture_compression: GL_INVALID_VALUE is generated [...] * if <imageSize> is not consistent with the format, dimensions, and |