[Mesa-dev] [PATCH] mesa/texstore: Don't use the _mesa_swizzle_and_convert if we need transfer ops

Roland Scheidegger sroland at vmware.com
Wed Aug 13 17:18:17 PDT 2014


Reviewed-by: Roland Scheidegger <sroland at vmware.com>

Not sure though why you moved the function, it's declared elsewhere anyway.
(And I bet there's cases where transfer ops wouldn't actually be
required which aren't caught by this check, like for instance RGB
formats with only alpha pixel scale, but that was already there, plus I
guess we don't care all that much about performance for apps which
fiddle with that stuff...)


Am 13.08.2014 20:05, schrieb Jason Ekstrand:
> The _mesa_swizzle_and_convert path can't do transfer ops, so we should bail
> if they're needed.
> 
> Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
> ---
>  src/mesa/main/texstore.c | 63 +++++++++++++++++++++++++-----------------------
>  1 file changed, 33 insertions(+), 30 deletions(-)
> 
> diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
> index 42cebbd..50c7dde 100644
> --- a/src/mesa/main/texstore.c
> +++ b/src/mesa/main/texstore.c
> @@ -1462,6 +1462,36 @@ invert_swizzle(uint8_t dst[4], const uint8_t src[4])
>              dst[i] = j;
>  }
>  
> +GLboolean
> +_mesa_texstore_needs_transfer_ops(struct gl_context *ctx,
> +                                  GLenum baseInternalFormat,
> +                                  mesa_format dstFormat)
> +{
> +   GLenum dstType;
> +
> +   /* There are different rules depending on the base format. */
> +   switch (baseInternalFormat) {
> +   case GL_DEPTH_COMPONENT:
> +   case GL_DEPTH_STENCIL:
> +      return ctx->Pixel.DepthScale != 1.0f ||
> +             ctx->Pixel.DepthBias != 0.0f;
> +
> +   case GL_STENCIL_INDEX:
> +      return GL_FALSE;
> +
> +   default:
> +      /* Color formats.
> +       * Pixel transfer ops (scale, bias, table lookup) do not apply
> +       * to integer formats.
> +       */
> +      dstType = _mesa_get_format_datatype(dstFormat);
> +
> +      return dstType != GL_INT && dstType != GL_UNSIGNED_INT &&
> +             ctx->_ImageTransferState;
> +   }
> +}
> +
> +
>  /** Store a texture by per-channel conversions and swizzling.
>   *
>   * This function attempts to perform a texstore operation by doing simple
> @@ -1495,6 +1525,9 @@ texstore_swizzle(TEXSTORE_PARAMS)
>     if (!is_array)
>        return GL_FALSE;
>  
> +   if (_mesa_texstore_needs_transfer_ops(ctx, baseInternalFormat, dstFormat))
> +      return GL_FALSE;
> +
>     switch (srcType) {
>     case GL_FLOAT:
>     case GL_UNSIGNED_BYTE:
> @@ -1762,36 +1795,6 @@ texstore_rgba(TEXSTORE_PARAMS)
>  }
>  
>  GLboolean
> -_mesa_texstore_needs_transfer_ops(struct gl_context *ctx,
> -                                  GLenum baseInternalFormat,
> -                                  mesa_format dstFormat)
> -{
> -   GLenum dstType;
> -
> -   /* There are different rules depending on the base format. */
> -   switch (baseInternalFormat) {
> -   case GL_DEPTH_COMPONENT:
> -   case GL_DEPTH_STENCIL:
> -      return ctx->Pixel.DepthScale != 1.0f ||
> -             ctx->Pixel.DepthBias != 0.0f;
> -
> -   case GL_STENCIL_INDEX:
> -      return GL_FALSE;
> -
> -   default:
> -      /* Color formats.
> -       * Pixel transfer ops (scale, bias, table lookup) do not apply
> -       * to integer formats.
> -       */
> -      dstType = _mesa_get_format_datatype(dstFormat);
> -
> -      return dstType != GL_INT && dstType != GL_UNSIGNED_INT &&
> -             ctx->_ImageTransferState;
> -   }
> -}
> -
> -
> -GLboolean
>  _mesa_texstore_can_use_memcpy(struct gl_context *ctx,
>                                GLenum baseInternalFormat, mesa_format dstFormat,
>                                GLenum srcFormat, GLenum srcType,
> 



More information about the mesa-dev mailing list