[Mesa-dev] [PATCH] mesa: Handle transferOps in texstore_rgba

Jason Ekstrand jason at jlekstrand.net
Fri Feb 13 07:09:26 PST 2015


On Feb 13, 2015 1:23 AM, "Iago Toral Quiroga" <itoral at igalia.com> wrote:
>
> In the recent rewrite of the format conversion code we did not handle
this.
> This patch adds the missing support.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89068
> ---
>  src/mesa/main/texstore.c | 58
+++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 53 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
> index 4d32659..6743d13 100644
> --- a/src/mesa/main/texstore.c
> +++ b/src/mesa/main/texstore.c
> @@ -73,6 +73,7 @@
>  #include "texstore.h"
>  #include "enums.h"
>  #include "glformats.h"
> +#include "pixeltransfer.h"
>  #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
>  #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
>
> @@ -675,12 +676,13 @@ texstore_compressed(TEXSTORE_PARAMS)
>  static GLboolean
>  texstore_rgba(TEXSTORE_PARAMS)
>  {
> -   void *tempImage = NULL;
> +   void *tempImage = NULL, *tempRGBA = NULL;
>     int srcRowStride, img;
> -   GLubyte *src;
> +   GLubyte *src, *dst;
>     uint32_t srcMesaFormat;
>     uint8_t rebaseSwizzle[4];
>     bool needRebase;
> +   bool transferOpsDone = false;
>
>     /* We have to handle MESA_FORMAT_YCBCR manually because it is a
special case
>      * and _mesa_format_convert does not support it. In this case the we
only
> @@ -709,6 +711,11 @@ texstore_rgba(TEXSTORE_PARAMS)
>        if (!tempImage)
>           return GL_FALSE;
>
> +      /* _mesa_unpack_color_index_to_rgba_ubyte has handled transferops
> +       * if needed.
> +       */
> +      transferOpsDone = true;
> +
>        /* Now we only have to adjust our src info for a conversion from
>         * the RGBA ubyte and then we continue as usual.
>         */
> @@ -737,13 +744,53 @@ texstore_rgba(TEXSTORE_PARAMS)
>     srcRowStride =
>        _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
>
> +   srcMesaFormat = _mesa_format_from_format_and_type(srcFormat, srcType);
> +   dstFormat = _mesa_get_srgb_format_linear(dstFormat);
> +
> +   /* If we have transferOps then we need to convert to RGBA float first,
> +      then apply transferOps, then do the conversion to dst
> +    */
> +   if (!transferOpsDone &&
> +       _mesa_texstore_needs_transfer_ops(ctx, baseInternalFormat,
dstFormat)) {
> +      /* Allocate RGBA float image */
> +      int elementCount = srcWidth * srcHeight * srcDepth;
> +      tempRGBA = malloc(4 * elementCount * sizeof(float));
> +      if (!tempRGBA) {
> +         free(tempImage);
> +         free(tempRGBA);
> +         return GL_FALSE;
> +      }
> +
> +      /* Convert from src to RGBA float */
> +      src = (GLubyte *) srcAddr;
> +      dst = (GLubyte *) tempRGBA;
> +      for (img = 0; img < srcDepth; img++) {
> +         _mesa_format_convert(dst, RGBA32_FLOAT, 4 * srcWidth *
sizeof(float),
> +                              src, srcMesaFormat, srcRowStride,
> +                              srcWidth, srcHeight, NULL);
> +         src += srcHeight * srcRowStride;
> +         dst += srcHeight * 4 * srcWidth * sizeof(float);
> +      }
> +
> +      /* Apply transferOps */
> +      _mesa_apply_rgba_transfer_ops(ctx, ctx->_ImageTransferState,
elementCount,
> +                                    (float(*)[4]) tempRGBA);
> +
> +      /* Now we have to adjust our src info for a conversion from
> +       * the RGBA float image and then we continue as usual.
> +       */
> +      srcAddr = tempRGBA;
> +      srcFormat = GL_RGBA;
> +      srcType = GL_FLOAT;
> +      srcRowStride =
> +         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat,
srcType);

This isn't quite correct.  This function will take the user's packing into
account while our temporary is densely packed.  The actual stride is just
width * 4*sizeof(float).

> +      srcMesaFormat = _mesa_format_from_format_and_type(srcFormat,
srcType);

Just use the actual format here.  No need to waste time looking it up.

Other than those two,
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

> +   }
> +
>     src = (GLubyte *)
>        _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
>                            srcFormat, srcType, 0, 0, 0);
>
> -   srcMesaFormat = _mesa_format_from_format_and_type(srcFormat, srcType);
> -   dstFormat = _mesa_get_srgb_format_linear(dstFormat);
> -
>     if (_mesa_get_format_base_format(dstFormat) != baseInternalFormat) {
>        needRebase =
>
_mesa_compute_rgba2base2rgba_component_mapping(baseInternalFormat,
> @@ -761,6 +808,7 @@ texstore_rgba(TEXSTORE_PARAMS)
>     }
>
>     free(tempImage);
> +   free(tempRGBA);
>
>     return GL_TRUE;
>  }
> --
> 1.9.1
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150213/e633ed5f/attachment.html>


More information about the mesa-dev mailing list