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

Brian Paul brianp at vmware.com
Thu Feb 7 16:56:35 PST 2013


On 02/07/2013 01:13 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).
> ---
>   src/gallium/auxiliary/util/u_format.csv |   12 +++
>   src/gallium/auxiliary/util/u_format.h   |  123 +++++++++++++++++++++++++++++++
>   src/gallium/include/pipe/p_format.h     |   12 +++
>   3 files changed, 147 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..1a5d954 100644
> --- a/src/gallium/auxiliary/util/u_format.h
> +++ b/src/gallium/auxiliary/util/u_format.h
> @@ -888,6 +888,129 @@ 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)
> +{
> +   if (!util_format_is_intensity(format))
> +      return format;

If we removed that test, and just did 'return format' for the default 
case, wouldn't that work too?  We seem to be catching all the 
intensity formats in the switch.  That way we could avoid a 
util_format_description() call.

Then, the default case below could have
assert(!util_format_is_intensity(format))
as a sanity check.


> +
> +   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(0);
> +      return PIPE_FORMAT_NONE;
> +   }
> +}
> +
> +/**
> + * 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)
> +{
> +   if (!util_format_is_luminance(format)&&
> +       !util_format_is_luminance_alpha(format))
> +      return format;

Same comment as above.


> +
> +   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(0);
> +      return PIPE_FORMAT_NONE;
> +   }
> +}
> +
> +/**
>    * 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
>   };
>



More information about the mesa-dev mailing list