[Mesa-dev] [PATCH 1/2] gallium: add red-alpha texture formats and a couple of util functions

Brian Paul brianp at vmware.com
Mon Feb 11 07:39:09 PST 2013


On 02/10/2013 05:15 PM, Marek Olšák wrote:
> This is for glGetTexImage and it will be used for samplers only (which some
> drivers already implement by reading util_format_description).
>
> v2: incorporate Brian's suggestion
>
> ---
>   src/gallium/auxiliary/util/u_format.csv |   12 ++++
>   src/gallium/auxiliary/util/u_format.h   |  117 +++++++++++++++++++++++++++++++
>   src/gallium/include/pipe/p_format.h     |   12 ++++
>   3 files changed, 141 insertions(+)
>
> diff --git a/src/gallium/auxiliary/util/u_format.csv b/src/gallium/auxiliary/util/u_format.csv
> index 1d27407..f3925bb 100644
> --- a/src/gallium/auxiliary/util/u_format.csv
> +++ b/src/gallium/auxiliary/util/u_format.csv
> @@ -360,3 +360,15 @@ PIPE_FORMAT_R16G16B16X16_SINT       , plain, 1, 1, sp16, sp16, sp16, x16, xyz1,
>   PIPE_FORMAT_R32G32B32X32_FLOAT      , plain, 1, 1, f32,  f32,  f32,  x32, xyz1, rgb
>   PIPE_FORMAT_R32G32B32X32_UINT       , plain, 1, 1, up32, up32, up32, x32, xyz1, rgb
>   PIPE_FORMAT_R32G32B32X32_SINT       , plain, 1, 1, sp32, sp32, sp32, x32, xyz1, rgb
> +
> +PIPE_FORMAT_R8A8_SNORM              , plain, 1, 1, sn8  ,  sn8 ,     ,     , x00y, rgb
> +PIPE_FORMAT_R16A16_UNORM            , plain, 1, 1, un16 , un16 ,     ,     , x00y, rgb
> +PIPE_FORMAT_R16A16_SNORM            , plain, 1, 1, sn16 , sn16 ,     ,     , x00y, rgb
> +PIPE_FORMAT_R16A16_FLOAT            , plain, 1, 1, f16  , f16  ,     ,     , x00y, rgb
> +PIPE_FORMAT_R32A32_FLOAT            , plain, 1, 1, f32  , f32  ,     ,     , x00y, rgb
> +PIPE_FORMAT_R8A8_UINT               , plain, 1, 1, up8  , up8  ,     ,     , x00y, rgb
> +PIPE_FORMAT_R8A8_SINT               , plain, 1, 1, sp8  , sp8  ,     ,     , x00y, rgb
> +PIPE_FORMAT_R16A16_UINT             , plain, 1, 1, up16 , up16 ,     ,     , x00y, rgb
> +PIPE_FORMAT_R16A16_SINT             , plain, 1, 1, sp16 , sp16 ,     ,     , x00y, rgb
> +PIPE_FORMAT_R32A32_UINT             , plain, 1, 1, up32 , up32 ,     ,     , x00y, rgb
> +PIPE_FORMAT_R32A32_SINT             , plain, 1, 1, sp32 , sp32 ,     ,     , x00y, rgb
> diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h
> index 63015dd..0030126 100644
> --- a/src/gallium/auxiliary/util/u_format.h
> +++ b/src/gallium/auxiliary/util/u_format.h
> @@ -888,6 +888,123 @@ util_format_stencil_only(enum pipe_format format)
>   }
>
>   /**
> + * Converts PIPE_FORMAT_*I* to PIPE_FORMAT_*R*.
> + * This is identity for non-intensity formats.
> + */
> +static INLINE enum pipe_format
> +util_format_intensity_to_red(enum pipe_format format)
> +{
> +   switch (format) {
> +   case PIPE_FORMAT_I8_UNORM:
> +      return PIPE_FORMAT_R8_UNORM;
> +   case PIPE_FORMAT_I8_SNORM:
> +      return PIPE_FORMAT_R8_SNORM;
> +   case PIPE_FORMAT_I16_UNORM:
> +      return PIPE_FORMAT_R16_UNORM;
> +   case PIPE_FORMAT_I16_SNORM:
> +      return PIPE_FORMAT_R16_SNORM;
> +   case PIPE_FORMAT_I16_FLOAT:
> +      return PIPE_FORMAT_R16_FLOAT;
> +   case PIPE_FORMAT_I32_FLOAT:
> +      return PIPE_FORMAT_R32_FLOAT;
> +   case PIPE_FORMAT_I8_UINT:
> +      return PIPE_FORMAT_R8_UINT;
> +   case PIPE_FORMAT_I8_SINT:
> +      return PIPE_FORMAT_R8_SINT;
> +   case PIPE_FORMAT_I16_UINT:
> +      return PIPE_FORMAT_R16_UINT;
> +   case PIPE_FORMAT_I16_SINT:
> +      return PIPE_FORMAT_R16_SINT;
> +   case PIPE_FORMAT_I32_UINT:
> +      return PIPE_FORMAT_R32_UINT;
> +   case PIPE_FORMAT_I32_SINT:
> +      return PIPE_FORMAT_R32_SINT;
> +   default:
> +      assert(!util_format_is_intensity(format));
> +      return format;
> +   }
> +}
> +
> +/**
> + * Converts PIPE_FORMAT_*L* to PIPE_FORMAT_*R*.
> + * This is identity for non-luminance formats.
> + */
> +static INLINE enum pipe_format
> +util_format_luminance_to_red(enum pipe_format format)
> +{
> +   switch (format) {
> +   case PIPE_FORMAT_L8_UNORM:
> +      return PIPE_FORMAT_R8_UNORM;
> +   case PIPE_FORMAT_L8_SNORM:
> +      return PIPE_FORMAT_R8_SNORM;
> +   case PIPE_FORMAT_L16_UNORM:
> +      return PIPE_FORMAT_R16_UNORM;
> +   case PIPE_FORMAT_L16_SNORM:
> +      return PIPE_FORMAT_R16_SNORM;
> +   case PIPE_FORMAT_L16_FLOAT:
> +      return PIPE_FORMAT_R16_FLOAT;
> +   case PIPE_FORMAT_L32_FLOAT:
> +      return PIPE_FORMAT_R32_FLOAT;
> +   case PIPE_FORMAT_L8_UINT:
> +      return PIPE_FORMAT_R8_UINT;
> +   case PIPE_FORMAT_L8_SINT:
> +      return PIPE_FORMAT_R8_SINT;
> +   case PIPE_FORMAT_L16_UINT:
> +      return PIPE_FORMAT_R16_UINT;
> +   case PIPE_FORMAT_L16_SINT:
> +      return PIPE_FORMAT_R16_SINT;
> +   case PIPE_FORMAT_L32_UINT:
> +      return PIPE_FORMAT_R32_UINT;
> +   case PIPE_FORMAT_L32_SINT:
> +      return PIPE_FORMAT_R32_SINT;
> +
> +   case PIPE_FORMAT_LATC1_UNORM:
> +      return PIPE_FORMAT_RGTC1_UNORM;
> +   case PIPE_FORMAT_LATC1_SNORM:
> +      return PIPE_FORMAT_RGTC1_SNORM;
> +
> +   case PIPE_FORMAT_L4A4_UNORM:
> +      /* XXX A4R4 is defined as x00y in u_format.csv */
> +      return PIPE_FORMAT_A4R4_UNORM;
> +
> +   case PIPE_FORMAT_L8A8_UNORM:
> +      return PIPE_FORMAT_R8A8_UNORM;
> +   case PIPE_FORMAT_L8A8_SNORM:
> +      return PIPE_FORMAT_R8A8_SNORM;
> +   case PIPE_FORMAT_L16A16_UNORM:
> +      return PIPE_FORMAT_R16A16_UNORM;
> +   case PIPE_FORMAT_L16A16_SNORM:
> +      return PIPE_FORMAT_R16A16_SNORM;
> +   case PIPE_FORMAT_L16A16_FLOAT:
> +      return PIPE_FORMAT_R16A16_FLOAT;
> +   case PIPE_FORMAT_L32A32_FLOAT:
> +      return PIPE_FORMAT_R32A32_FLOAT;
> +   case PIPE_FORMAT_L8A8_UINT:
> +      return PIPE_FORMAT_R8A8_UINT;
> +   case PIPE_FORMAT_L8A8_SINT:
> +      return PIPE_FORMAT_R8A8_SINT;
> +   case PIPE_FORMAT_L16A16_UINT:
> +      return PIPE_FORMAT_R16A16_UINT;
> +   case PIPE_FORMAT_L16A16_SINT:
> +      return PIPE_FORMAT_R16A16_SINT;
> +   case PIPE_FORMAT_L32A32_UINT:
> +      return PIPE_FORMAT_R32A32_UINT;
> +   case PIPE_FORMAT_L32A32_SINT:
> +      return PIPE_FORMAT_R32A32_SINT;
> +
> +   /* We don't have compressed red-alpha variants for these. */
> +   case PIPE_FORMAT_LATC2_UNORM:
> +   case PIPE_FORMAT_LATC2_SNORM:
> +      return PIPE_FORMAT_NONE;
> +
> +   default:
> +      assert(!util_format_is_luminance(format)&&
> +	     !util_format_is_luminance_alpha(format));
> +      return format;
> +   }
> +}
> +
> +/**
>    * Return the number of components stored.
>    * Formats with block size != 1x1 will always have 1 component (the block).
>    */
> diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
> index 5a3d000..098b25b 100644
> --- a/src/gallium/include/pipe/p_format.h
> +++ b/src/gallium/include/pipe/p_format.h
> @@ -328,6 +328,18 @@ enum pipe_format {
>      PIPE_FORMAT_R32G32B32X32_UINT       = 240,
>      PIPE_FORMAT_R32G32B32X32_SINT       = 241,
>
> +   PIPE_FORMAT_R8A8_SNORM              = 242,
> +   PIPE_FORMAT_R16A16_UNORM            = 243,
> +   PIPE_FORMAT_R16A16_SNORM            = 244,
> +   PIPE_FORMAT_R16A16_FLOAT            = 245,
> +   PIPE_FORMAT_R32A32_FLOAT            = 246,
> +   PIPE_FORMAT_R8A8_UINT               = 247,
> +   PIPE_FORMAT_R8A8_SINT               = 248,
> +   PIPE_FORMAT_R16A16_UINT             = 249,
> +   PIPE_FORMAT_R16A16_SINT             = 250,
> +   PIPE_FORMAT_R32A32_UINT             = 251,
> +   PIPE_FORMAT_R32A32_SINT             = 252,
> +
>      PIPE_FORMAT_COUNT
>   };
>

Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list