On 02/10/2012 05:25 PM, Anuj Phogat wrote:
On Fri, Feb 10, 2012 at 3:00 PM, Brian Paul <bri...@vmware.com
<mailto:bri...@vmware.com>> wrote:

    On 02/10/2012 02:39 PM, Anuj Phogat wrote:

        This patch adds the pixel pack operations in glGetTexImage for
        compressed textures with unsigned, normalized values. It also
        fixes the failures in intel oglconform pxstore-gettex due to
        following sub test cases:

          - Test all mipmaps with byte swapping enabled
          - Test all small mipmaps with all allowable alignment values
          - Test subimage packing for all mipmap levels

        Bugzilla: https://bugs.freedesktop.org/__show_bug.cgi?id=40864
        <https://bugs.freedesktop.org/show_bug.cgi?id=40864>

        Note: This is a candidate for stable branches

        Signed-off-by: Anuj Phogat<anuj.pho...@gmail.com
        <mailto:anuj.pho...@gmail.com>>
        ---
          src/mesa/drivers/common/meta.c |   55
        ++++++++++++++++++++++++++++++__+++++++--
          1 files changed, 52 insertions(+), 3 deletions(-)

        diff --git a/src/mesa/drivers/common/__meta.c
        b/src/mesa/drivers/common/__meta.c
        index aa5fef8..97c1912 100644
        --- a/src/mesa/drivers/common/__meta.c
        +++ b/src/mesa/drivers/common/__meta.c
        @@ -53,6 +53,7 @@
          #include "main/pixel.h"
          #include "main/pbo.h"
          #include "main/polygon.h"
        +#include "main/pack.h"
          #include "main/readpix.h"
          #include "main/scissor.h"
          #include "main/shaderapi.h"
        @@ -3438,6 +3439,14 @@ _mesa_meta_GetTexImage(struct
        gl_context *ctx,
                                 GLenum format, GLenum type, GLvoid
        *pixels,
                                 struct gl_texture_image *texImage)
          {
        +   GLuint row;
        +   GLfloat *srcRow;
        +   void *tempImage, *dest;
        +   const GLuint width = texImage->Width;
        +   const GLuint height = texImage->Height;
        +   const GLint tempRowLength = 0;
        +   GLbitfield transferOps = 0x0;
        +
             /* We can only use the decompress-with-blit method here
        if the texels are
              * unsigned, normalized values.  We could handle signed
        and unnormalized
              * with floating point renderbuffers...
        @@ -3445,14 +3454,54 @@ _mesa_meta_GetTexImage(struct
        gl_context *ctx,
             if (_mesa_is_format_compressed(__texImage->TexFormat)&&
                 _mesa_get_format_datatype(__texImage->TexFormat)
                 == GL_UNSIGNED_NORMALIZED) {
        +
                struct gl_texture_object *texObj = texImage->TexObject;
        -      const GLuint slice = 0; /* only 2D compressed textures
        for now */
        +      /* only 2D compressed textures for now */
        +      const GLuint slice = 0;
        +      const int dimensions = 2;
        +
        +      if (format == GL_LUMINANCE ||
        +          format == GL_LUMINANCE_ALPHA) {
        +         transferOps |= IMAGE_CLAMP_BIT;
        +      }
        +
        +      /* Allocate a temporary 2D RGBA float buffer */
        +      tempImage = malloc(width * height * 4 * sizeof(GLfloat));
        +      if (tempImage == NULL) {
        +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage");
        +         return;
        +      }
        +
                /* Need to unlock the texture here to prevent
        deadlock... */
                _mesa_unlock_texture(ctx, texObj);
        -      decompress_texture_image(ctx, texImage, slice, format,
        type, pixels,
        -                               ctx->Pack.RowLength);
        +
        +      /* Decompress in to temporary buffer with format = GL_RGBA,
        +       * type = GL_FLOAT and RowLength = 0 then pack in to user
        +       * supplied buffer
        +       */
        +      decompress_texture_image(ctx, texImage, slice, GL_RGBA,
        GL_FLOAT,
        +                               tempImage, tempRowLength);
                /* ... and relock it */
                _mesa_lock_texture(ctx, texObj);
        +
        +      srcRow = (GLfloat*) tempImage;
        +      for (row = 0; row<  height; row++) {
        +         dest = _mesa_image_address(__dimensions,&ctx->Pack,
        pixels,

        +                                    width, height, format, type,
        +                                    0, row, 0);
        +         if (_mesa_is_integer_format(__format)) {


    I don't think the format can be integer-valued at this point if we
    tested for datatype = GL_UNSIGNED_NORMALIZED above.


        +            _mesa_pack_rgba_span_int(ctx, width, (GLuint
        (*)[4]) srcRow,
        +                                     format, type, dest);
        +         }
        +         else {
        +            _mesa_pack_rgba_span_float(__ctx, width, (GLfloat
        (*)[4]) srcRow,
        +                                       format, type,
        dest,&ctx->Pack,

        +                                       transferOps);
        +         }
        +         srcRow += width * 4;
        +      }
        +
        +      free(tempImage);
             }
             else {
                _mesa_get_teximage(ctx, format, type, pixels, texImage);



    If the main problem here is the pixel store/pack operations, I
    think that another fix is much simpler:

    First, let's remove the destRowLength parameter to
    decompress_texture_image().  We're just passing
    ctx->Pack.RowLength but then we assign that value to
    ctx->Pack.RowLength at line 3412. That's pointless.

    Then, instead of calling _mesa_meta_begin(ctx, MESA_META_ALL) at
    line 3277, use (MESA_META_ALL & ~MESA_META_PIXEL_STORE).  The
    current pixel store params will stay in effect and
    _mesa_ReadPixels() call at line 3413 will apply them for us.


Yes, this fix works for me and is much simpler. I'll send out a patch
for review.

Great.  Thanks.


    BTW, I think we could avoid some FBO resizing/reallocating if we
    change line 3295 to read:

      if (width > decompress->Width || height > decompress->Height) {

I agree.

Let's do that in a separate patch though.

-Brian
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to