[Mesa-dev] [PATCH 2/2] mesa: don't clear proxy image fields when regular GL error is generated
Brian Paul
brianp at vmware.com
Tue Aug 21 19:28:42 PDT 2012
If a proxy texture call generates a regular GL error, we should not
clear the proxy image's width/height/depth/format fields. Use a new
PROXY_ERROR token to distinguish proxy errors from regular GL errors.
Some additional clean-ups could still be done but this fixes the problem
at hand.
---
src/mesa/main/teximage.c | 41 ++++++++++++++++++++++++++++++-----------
1 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 95efa70..64dac61 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -1537,6 +1537,13 @@ mutable_tex_object(struct gl_context *ctx, GLenum target)
}
+/**
+ * Special value returned by error some texture error checking functions when
+ * an error is detected and the proxy texture image's width/height/depth/format
+ * fields should be zeroed-out.
+ */
+#define PROXY_ERROR 2
+
/**
* Test the glTexImage[123]D() parameters for errors.
@@ -1553,13 +1560,14 @@ mutable_tex_object(struct gl_context *ctx, GLenum target)
* \param depth image depth given by the user.
* \param border image border given by the user.
*
- * \return GL_TRUE if an error was detected, or GL_FALSE if no errors.
+ * \return PROXY_ERROR if there's an error that should zero-out the proxy image,
+ * GL_TRUE if a regular GL error is found, or GL_FALSE if no error,
*
* Verifies each of the parameters against the constants specified in
* __struct gl_contextRec::Const and the supported extensions, and according
* to the OpenGL specification.
*/
-static GLboolean
+static GLenum
texture_error_check( struct gl_context *ctx,
GLuint dimensions, GLenum target,
GLint level, GLint internalFormat,
@@ -1622,12 +1630,16 @@ texture_error_check( struct gl_context *ctx,
type, width, height,
depth, border);
if (!sizeOK) {
- if (!isProxy) {
+ if (isProxy) {
+ /* No GL error is recorded, but we need to zero-out the image dims */
+ return PROXY_ERROR;
+ }
+ else {
_mesa_error(ctx, GL_INVALID_VALUE,
"glTexImage%dD(level=%d, width=%d, height=%d, depth=%d)",
dimensions, level, width, height, depth);
+ return GL_TRUE;
}
- return GL_TRUE;
}
/* Check internalFormat */
@@ -2478,7 +2490,7 @@ teximage(struct gl_context *ctx, GLuint dims,
GLint border, GLenum format, GLenum type,
const GLvoid *pixels)
{
- GLboolean error;
+ GLenum error;
struct gl_pixelstore_attrib unpack_no_border;
const struct gl_pixelstore_attrib *unpack = &ctx->Unpack;
@@ -2511,12 +2523,12 @@ teximage(struct gl_context *ctx, GLuint dims,
struct gl_texture_image *texImage =
_mesa_get_proxy_tex_image(ctx, target, level);
- if (error) {
- /* when error, clear all proxy texture image parameters */
+ if (error == PROXY_ERROR) {
+ /* image too large, etc. Clear all proxy texture image parameters. */
if (texImage)
clear_teximage_fields(texImage);
}
- else {
+ else if (error == GL_FALSE) {
/* no error, set the tex image parameters */
struct gl_texture_object *texObj =
_mesa_get_current_tex_object(ctx, target);
@@ -3100,7 +3112,7 @@ get_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh)
/**
* Error checking for glCompressedTexImage[123]D().
* \param reason returns reason for error, if any
- * \return error code or GL_NO_ERROR.
+ * \return error code or GL_NO_ERROR or PROXY_ERROR.
*/
static GLenum
compressed_texture_error_check(struct gl_context *ctx, GLint dimensions,
@@ -3236,6 +3248,9 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions,
width, height, depth, border)) {
/* See error comment above */
*reason = "invalid width, height or format";
+ if (target == proxyTarget) {
+ return PROXY_ERROR;
+ }
return GL_INVALID_OPERATION;
}
@@ -3472,16 +3487,20 @@ compressedteximage(struct gl_context *ctx, GLuint dims,
texImage = _mesa_get_proxy_tex_image(ctx, target, level);
if (texImage) {
- if (error) {
+ if (error == PROXY_ERROR) {
/* if error, clear all proxy texture image parameters */
clear_teximage_fields(texImage);
}
- else {
+ else if (error == GL_NO_ERROR) {
/* no error: store the teximage parameters */
_mesa_init_teximage_fields(ctx, texImage, width, height,
depth, border, internalFormat,
MESA_FORMAT_NONE);
}
+ else {
+ /* other, regular error */
+ _mesa_error(ctx, error, "glCompressedTexImage%uD(%s)", dims, reason);
+ }
}
}
else {
--
1.7.3.4
More information about the mesa-dev
mailing list