[Mesa-dev] [PATCH 1/2] mesa: Add gl_formats to cover all GLUser provided format/type combinations

Marek Olšák maraeo at gmail.com
Fri Nov 15 09:52:49 PST 2013


I don't understand this and I don't think this is the right way to
implement hw-accelerated TexImage. Some of the formats are unsupported
by all hardware I know, others just don't make any sense (e.g.
RGBA5999_REV).

I think the proper way to implement PBO unpacking is to read the PBO
as a TBO. If you don't have a PBO, you can always create it.

Marek

On Fri, Nov 15, 2013 at 12:53 AM, Mark Mueller <markkmueller at gmail.com> wrote:
> This and the subsequent patch are the first steps in adding support to load textures
> via GPU instead of CPU. This patch expands Mesa's gl_formats such that all GLUser
> format/type combinations are represented and thus can be communicated to lower levels
> within dri drivers. The new formats are source only thus they require no associated
> Texstore functions or render targets, therefore they are added _privately_ at the end
> of the gl_formats list.
>
> Signed-off-by: Mark Mueller <MarkKMueller at gmail.com>
> ---
>  src/mesa/main/formats.c   | 441 +++++++++++++++++++++++++++++++++++++++++++++-
>  src/mesa/main/formats.h   |  70 +++++++-
>  src/mesa/main/texformat.c | 271 ++++++++++++++++++++++++++++
>  src/mesa/main/texformat.h |  11 ++
>  4 files changed, 789 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
> index 07d2a72..2c32bba 100644
> --- a/src/mesa/main/formats.c
> +++ b/src/mesa/main/formats.c
> @@ -76,7 +76,7 @@ struct gl_format_info
>   * These must be in the same order as the MESA_FORMAT_* enums so that
>   * we can do lookups without searching.
>   */
> -static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
> +static struct gl_format_info format_info[MESA_PRIVATE_FORMAT_COUNT] =
>  {
>     {
>        MESA_FORMAT_NONE,            /* Name */
> @@ -1572,7 +1572,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
>     },
>     {
>        MESA_FORMAT_RGB9_E5_FLOAT,
> -      "MESA_FORMAT_RGB9_E5",
> +      "MESA_FORMAT_RGB9_E5_FLOAT",
>        GL_RGB,
>        GL_FLOAT,
>        9, 9, 9, 0,
> @@ -1763,6 +1763,440 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
>        0, 0, 0, 0, 0,
>        1, 1, 16
>     },
> +
> +   /*
> +    * Formats to exactly represent format/type combinations for OGLUser provided
> +    * textures. These formats are required only for caching of an unaltered copy of
> +    * the application texture prior to passing them to the GPU, where they are
> +    * processed to the final internalFormat and miptree location. Texstore functions
> +    * do not apply and these are not intended to be used as render targets.
> +    * Listing is based on the order presented in the glTexImage2D spec.
> +    */
> +   /* Red Solo - !cup */
> +   {
> +      MESA_FORMAT_R32,
> +      "MESA_FORMAT_R32",
> +      GL_RED,
> +      GL_UNSIGNED_NORMALIZED,
> +      16, 0, 0, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 2
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_R32,
> +      "MESA_FORMAT_SIGNED_R32",
> +      GL_RED,
> +      GL_SIGNED_NORMALIZED,
> +      32, 0, 0, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +
> +   /* Red Green - !show */
> +   {
> +      MESA_FORMAT_SIGNED_RG88,
> +      "MESA_FORMAT_SIGNED_RG88",
> +      GL_RG,
> +      GL_SIGNED_NORMALIZED,
> +      8, 8, 0, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 2
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_RG1616,
> +      "MESA_FORMAT_SIGNED_RG1616",
> +      GL_RG,
> +      GL_SIGNED_NORMALIZED,
> +      16, 16, 0, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +   {
> +      MESA_FORMAT_RG3232,
> +      "MESA_FORMAT_RG3232",
> +      GL_RG,
> +      GL_UNSIGNED_NORMALIZED,
> +      32, 32, 0, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 8
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_RG3232,
> +      "MESA_FORMAT_SIGNED_RG3232",
> +      GL_RG,
> +      GL_SIGNED_NORMALIZED,
> +      32, 32, 0, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 8
> +   },
> +
> +   /* Red Green Blue */
> +   {
> +      MESA_FORMAT_SIGNED_RGB888,
> +      "MESA_FORMAT_SIGNED_RGB888",
> +      GL_RGB,
> +      GL_SIGNED_NORMALIZED,
> +      8, 8, 8, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 3
> +   },
> +   {
> +      MESA_FORMAT_RGB161616,
> +      "MESA_FORMAT_RG161616",
> +      GL_RGB,
> +      GL_UNSIGNED_NORMALIZED,
> +      16, 16, 16, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 6
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_RGB161616,
> +      "MESA_FORMAT_SIGNED_RGB161616",
> +      GL_RGB,
> +      GL_SIGNED_NORMALIZED,
> +      16, 16, 16, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 6
> +   },
> +   {
> +      MESA_FORMAT_RGB323232,
> +      "MESA_FORMAT_RGB323232",
> +      GL_RGB,
> +      GL_UNSIGNED_NORMALIZED,
> +      32, 32, 32, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 12
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_RGB323232,
> +      "MESA_FORMAT_SIGNED_RGB323232",
> +      GL_RGB,
> +      GL_SIGNED_NORMALIZED,
> +      32, 32, 32, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 12
> +   },
> +   {
> +      MESA_FORMAT_RGB233_REV,
> +      "MESA_FORMAT_RGB233_REV",
> +      GL_RGB,
> +      GL_UNSIGNED_NORMALIZED,
> +      3, 3, 2, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 1
> +   },
> +   {
> +      MESA_FORMAT_RGB101111_REV,
> +      "MESA_FORMAT_RGB101111_REV",
> +      GL_RGB,
> +      GL_UNSIGNED_NORMALIZED,
> +      11, 11, 10, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +
> +   /* Blue Green Red */
> +   {
> +       MESA_FORMAT_SIGNED_BGR888,
> +       "MESA_FORMAT_SIGNED_BGR888",
> +       GL_RGB,
> +       GL_SIGNED_NORMALIZED,
> +       8, 8, 8, 0,
> +       0, 0, 0, 0, 0,
> +       1, 1, 3
> +   },
> +   {
> +      MESA_FORMAT_BGR161616,
> +      "MESA_FORMAT_BGR161616",
> +      GL_RGB,
> +      GL_UNSIGNED_NORMALIZED,
> +      16, 16, 16, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 6
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_BGR161616,
> +      "MESA_FORMAT_SIGNED_BGR161616",
> +      GL_RGB,
> +      GL_SIGNED_NORMALIZED,
> +      16, 16, 16, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 6
> +   },
> +   {
> +      MESA_FORMAT_BGR_FLOAT16,
> +      "MESA_FORMAT_BGR_FLOAT16",
> +      GL_RGB,
> +      GL_FLOAT,
> +      16, 16, 16, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 6
> +   },
> +   {
> +      MESA_FORMAT_BGR323232,
> +      "MESA_FORMAT_BGR323232",
> +      GL_RGB,
> +      GL_UNSIGNED_NORMALIZED,
> +      32, 32, 32, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 12
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_BGR323232,
> +      "MESA_FORMAT_SIGNED_BGR323232",
> +      GL_RGB,
> +      GL_SIGNED_NORMALIZED,
> +      32, 32, 32, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 12
> +   },
> +   {
> +      MESA_FORMAT_BGR_FLOAT32,
> +      "MESA_FORMAT_BGR_FLOAT32",
> +      GL_RGB,
> +      GL_FLOAT,
> +      32, 32, 32, 0,
> +      0, 0, 0, 0, 0,
> +      1, 1, 12
> +   },
> +
> +   /* Red Green Blue Alpha */
> +   {
> +      MESA_FORMAT_RGBA16161616,
> +      "MESA_FORMAT_RGBA161616",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      16, 16, 16, 16,
> +      0, 0, 0, 0, 0,
> +      1, 1, 8
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_RGBA16161616,
> +      "MESA_FORMAT_SIGNED_RGBA161616",
> +      GL_RGBA,
> +      GL_SIGNED_NORMALIZED,
> +      16, 16, 16, 16,
> +      0, 0, 0, 0, 0,
> +      1, 1, 8
> +   },
> +   {
> +      MESA_FORMAT_RGBA32323232,
> +      "MESA_FORMAT_RGBA323232",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      32, 32, 32, 32,
> +      0, 0, 0, 0, 0,
> +      1, 1, 16
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_RGBA32323232,
> +      "MESA_FORMAT_SIGNED_RGBA323232",
> +      GL_RGBA,
> +      GL_SIGNED_NORMALIZED,
> +      32, 32, 32, 32,
> +      0, 0, 0, 0, 0,
> +      1, 1, 16
> +   },
> +   {
> +      MESA_FORMAT_RGBA1010102,
> +      "MESA_FORMAT_RGBA1010102",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      10, 10, 10, 2,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +   {
> +      MESA_FORMAT_RGBA2101010_REV,
> +      "MESA_FORMAT_RGBA2101010_REV",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      10, 10, 10, 2,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +   {
> +      MESA_FORMAT_RGBA5999_REV,
> +      "MESA_FORMAT_RGBA5999_REV",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      9, 9, 9, 5,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +   {
> +      MESA_FORMAT_RGBA4444,        /* Name */
> +      "MESA_FORMAT_RGBA4444",      /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_RGBA4444_REV,    /* Name */
> +      "MESA_FORMAT_RGBA4444_REV",  /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_RGBA1555_REV,    /* Name */
> +      "MESA_FORMAT_RGBA1555_REV",  /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */
> +   },
> +
> +   /* Blue Green Red Alpha */
> +   {
> +      MESA_FORMAT_BGRA8888,        /* Name */
> +      "MESA_FORMAT_BGRA8888",      /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 4                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_BGRA8888_REV,    /* Name */
> +      "MESA_FORMAT_BGRA8888",      /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 4                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_BGRA8888,
> +      "MESA_FORMAT_SIGNED_BGRA8888",
> +      GL_RGBA,
> +      GL_SIGNED_NORMALIZED,
> +      8, 8, 8, 8,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +   {
> +      MESA_FORMAT_BGRA16161616,
> +      "MESA_FORMAT_BGRA16161616",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      16, 16, 16, 16,
> +      0, 0, 0, 0, 0,
> +      1, 1, 8
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_BGRA16161616,
> +      "MESA_FORMAT_SIGNED_BGRA16161616",
> +      GL_RGBA,
> +      GL_SIGNED_NORMALIZED,
> +      16, 16, 16, 16,
> +      0, 0, 0, 0, 0,
> +      1, 1, 8
> +   },
> +   {
> +      MESA_FORMAT_BGRA_FLOAT16,
> +      "MESA_FORMAT_BGRA_FLOAT16",
> +      GL_RGBA,
> +      GL_FLOAT,
> +      16, 16, 16, 16,
> +      0, 0, 0, 0, 0,
> +      1, 1, 8
> +   },
> +   {
> +      MESA_FORMAT_BGRA32323232,
> +      "MESA_FORMAT_BGRA32323232",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      32, 32, 32, 32,
> +      0, 0, 0, 0, 0,
> +      1, 1, 16
> +   },
> +   {
> +      MESA_FORMAT_SIGNED_BGRA32323232,
> +      "MESA_FORMAT_SIGNED_BGRA32323232",
> +      GL_RGBA,
> +      GL_SIGNED_NORMALIZED,
> +      32, 32, 32, 32,
> +      0, 0, 0, 0, 0,
> +      1, 1, 16
> +   },
> +   {
> +      MESA_FORMAT_BGRA_FLOAT32,
> +      "MESA_FORMAT_BGRA_FLOAT32",
> +      GL_RGBA,
> +      GL_FLOAT,
> +      32, 32, 32, 32,
> +      0, 0, 0, 0, 0,
> +      1, 1, 16
> +   },
> +   {
> +      MESA_FORMAT_BGRA4444,        /* Name */
> +      "MESA_FORMAT_BGRA4444",      /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_BGRA4444_REV,    /* Name */
> +      "MESA_FORMAT_BGRA4444_REV",  /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_BGRA5551,        /* Name */
> +      "MESA_FORMAT_BGRA5551",      /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_BGRA1555_REV,    /* Name */
> +      "MESA_FORMAT_BGRA1555_REV",  /* StrName */
> +      GL_RGBA,                     /* BaseFormat */
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */
> +      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */
> +   },
> +   {
> +      MESA_FORMAT_BGRA1010102,
> +      "MESA_FORMAT_BGRA1010102",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      10, 10, 10, 2,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +   {
> +      MESA_FORMAT_BGRA2101010_REV,
> +      "MESA_FORMAT_BGRA2101010_REV",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      10, 10, 10, 2,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
> +   {
> +      MESA_FORMAT_BGRA5999_REV,
> +      "MESA_FORMAT_BGRA5999_REV",
> +      GL_RGBA,
> +      GL_UNSIGNED_NORMALIZED,
> +      9, 9, 9, 5,
> +      0, 0, 0, 0, 0,
> +      1, 1, 4
> +   },
>  };
>
>
> @@ -2221,7 +2655,7 @@ _mesa_test_formats(void)
>  {
>     GLuint i;
>
> -   STATIC_ASSERT(Elements(format_info) == MESA_FORMAT_COUNT);
> +   STATIC_ASSERT(Elements(format_info) == MESA_PRIVATE_FORMAT_COUNT);
>
>     for (i = 0; i < MESA_FORMAT_COUNT; i++) {
>        const struct gl_format_info *info = _mesa_get_format_info(i);
> @@ -3361,6 +3795,7 @@ _mesa_format_matches_format_and_type(gl_format gl_format,
>     case MESA_FORMAT_XBGR32323232_FLOAT:
>     case MESA_FORMAT_XBGR32323232_UINT:
>     case MESA_FORMAT_XBGR32323232_SINT:
> +   default:
>        return GL_FALSE;
>     }
>
> diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
> index 64b4b9a..687b525 100644
> --- a/src/mesa/main/formats.h
> +++ b/src/mesa/main/formats.h
> @@ -304,7 +304,75 @@ typedef enum
>     MESA_FORMAT_XBGR32323232_UINT, /* ... */
>     MESA_FORMAT_XBGR32323232_SINT, /* ... */
>
> -   MESA_FORMAT_COUNT
> +   MESA_FORMAT_COUNT,
> +
> +   /*
> +    * Formats to exactly represent format/type combinations for OGLUser provided
> +    * textures. These formats are required only for caching of an unaltered copy of
> +    * the application texture prior to passing them to the GPU, where they are
> +    * processed to the final internalFormat and miptree location. Texstore functions
> +    * do not apply and these are not intended to be used as render targets.
> +    * Listing is based on the order presented in the glTexImage2D spec.
> +    */
> +   /* Red Solo - !cup */
> +   MESA_FORMAT_R32 = MESA_FORMAT_COUNT,
> +   MESA_FORMAT_SIGNED_R32,
> +
> +   /* Red Green - !show */
> +   MESA_FORMAT_SIGNED_RG88,
> +   MESA_FORMAT_SIGNED_RG1616,
> +   MESA_FORMAT_RG3232,
> +   MESA_FORMAT_SIGNED_RG3232,
> +
> +   /* Red Green Blue */
> +   MESA_FORMAT_SIGNED_RGB888,
> +   MESA_FORMAT_RGB161616,
> +   MESA_FORMAT_SIGNED_RGB161616,
> +   MESA_FORMAT_RGB323232,
> +   MESA_FORMAT_SIGNED_RGB323232,
> +   MESA_FORMAT_RGB233_REV,
> +   MESA_FORMAT_RGB101111_REV,
> +
> +   /* Blue Green Red */
> +   MESA_FORMAT_SIGNED_BGR888,
> +   MESA_FORMAT_BGR161616,
> +   MESA_FORMAT_SIGNED_BGR161616,
> +   MESA_FORMAT_BGR_FLOAT16,
> +   MESA_FORMAT_BGR323232,
> +   MESA_FORMAT_SIGNED_BGR323232,
> +   MESA_FORMAT_BGR_FLOAT32,
> +
> +   /* Red Green Blue Alpha */
> +   MESA_FORMAT_RGBA16161616,
> +   MESA_FORMAT_SIGNED_RGBA16161616,
> +   MESA_FORMAT_RGBA32323232,
> +   MESA_FORMAT_SIGNED_RGBA32323232,
> +   MESA_FORMAT_RGBA1010102,
> +   MESA_FORMAT_RGBA2101010_REV,
> +   MESA_FORMAT_RGBA5999_REV,
> +   MESA_FORMAT_RGBA4444,
> +   MESA_FORMAT_RGBA4444_REV,
> +   MESA_FORMAT_RGBA1555_REV,
> +
> +   /* Blue Green Red Alpha */
> +   MESA_FORMAT_BGRA8888,
> +   MESA_FORMAT_BGRA8888_REV,
> +   MESA_FORMAT_SIGNED_BGRA8888,
> +   MESA_FORMAT_BGRA16161616,
> +   MESA_FORMAT_SIGNED_BGRA16161616,
> +   MESA_FORMAT_BGRA_FLOAT16,
> +   MESA_FORMAT_BGRA32323232,
> +   MESA_FORMAT_SIGNED_BGRA32323232,
> +   MESA_FORMAT_BGRA_FLOAT32,
> +   MESA_FORMAT_BGRA4444,
> +   MESA_FORMAT_BGRA4444_REV,
> +   MESA_FORMAT_BGRA5551,
> +   MESA_FORMAT_BGRA1555_REV,
> +   MESA_FORMAT_BGRA1010102,
> +   MESA_FORMAT_BGRA2101010_REV,
> +   MESA_FORMAT_BGRA5999_REV,
> +
> +   MESA_PRIVATE_FORMAT_COUNT
>  } gl_format;
>
>
> diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c
> index d3aa477..713fdf2 100644
> --- a/src/mesa/main/texformat.c
> +++ b/src/mesa/main/texformat.c
> @@ -831,3 +831,274 @@ _mesa_tex_target_is_array(GLenum target)
>        return GL_FALSE;
>     }
>  }
> +
> +/**
> + * Choose a texture format that exaclty matches the application texture
> + * given the format, and type Format parameters passed to glTexImage().
> + *
> + * \param ctx  the GL context.
> + * \param format  incoming image pixel format.
> + * \param type  incoming image data type.
> + *
> + * \return a matching gl_format for the given format/type arguments
> + *
> + */
> +gl_format
> +_mesa_choose_cached_tex_format(struct gl_context *ctx, GLenum format, GLenum type)
> +{
> +   switch (format) {
> +   case GL_RED:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_SIGNED_R8;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_R8;
> +      case GL_SHORT:
> +         return MESA_FORMAT_SIGNED_R16;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_R16;
> +      case GL_INT:
> +         return MESA_FORMAT_SIGNED_R32;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_R32;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_R_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_R_FLOAT16;
> +      }
> +      break;
> +
> +   case GL_RG:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_SIGNED_RG88;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_RG88;
> +      case GL_SHORT:
> +         return MESA_FORMAT_SIGNED_RG1616;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_RG1616;
> +      case GL_INT:
> +         return MESA_FORMAT_SIGNED_RG3232;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_RG3232;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_RG_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_RG_FLOAT16;
> +      }
> +      break;
> +
> +   case GL_RGB:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_SIGNED_RGB888;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_RGB888;
> +      case GL_SHORT:
> +         return MESA_FORMAT_SIGNED_RGB161616;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_RGB161616;
> +      case GL_INT:
> +         return MESA_FORMAT_SIGNED_RGB323232;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_RGB323232;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_RGB_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_RGB_FLOAT16;
> +      case GL_UNSIGNED_BYTE_3_3_2:
> +         return MESA_FORMAT_RGB332;
> +      case GL_UNSIGNED_BYTE_2_3_3_REV:
> +         return MESA_FORMAT_RGB233_REV;
> +      case GL_UNSIGNED_SHORT_5_6_5:
> +         return MESA_FORMAT_RGB565;
> +      case GL_UNSIGNED_SHORT_5_6_5_REV:
> +         return MESA_FORMAT_RGB565_REV;
> +      case GL_UNSIGNED_INT_10F_11F_11F_REV:
> +         return MESA_FORMAT_RGB101111_REV;
> +      }
> +      break;
> +
> +   case GL_BGR:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_SIGNED_BGR888;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_BGR888;
> +      case GL_SHORT:
> +         return MESA_FORMAT_SIGNED_BGR161616;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_BGR161616;
> +      case GL_INT:
> +         return MESA_FORMAT_SIGNED_BGR323232;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_BGR323232;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_BGR_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_BGR_FLOAT16;
> +      }
> +      break;
> +
> +   case GL_RGBA:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_SIGNED_RGBA8888;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_RGBA8888;
> +      case GL_SHORT:
> +         return MESA_FORMAT_SIGNED_RGBA16161616;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_RGBA16161616;
> +      case GL_INT:
> +         return MESA_FORMAT_SIGNED_RGBA32323232;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_RGBA32323232;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_RGBA_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_RGBA_FLOAT16;
> +      case GL_UNSIGNED_SHORT_4_4_4_4:
> +         return MESA_FORMAT_RGBA4444;
> +      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
> +         return MESA_FORMAT_RGBA4444_REV;
> +      case GL_UNSIGNED_SHORT_5_5_5_1:
> +         return MESA_FORMAT_RGBA5551;
> +      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
> +         return MESA_FORMAT_RGBA1555_REV;
> +      case GL_UNSIGNED_INT_8_8_8_8:
> +         return MESA_FORMAT_RGBA32323232;
> +      case GL_UNSIGNED_INT_8_8_8_8_REV:
> +         return MESA_FORMAT_RGBA8888_REV;
> +      case GL_UNSIGNED_INT_10_10_10_2:
> +         return MESA_FORMAT_RGBA1010102;
> +      case GL_UNSIGNED_INT_2_10_10_10_REV:
> +         return MESA_FORMAT_RGBA2101010_REV;
> +      case GL_UNSIGNED_INT_5_9_9_9_REV:
> +         return MESA_FORMAT_RGBA5999_REV;
> +      }
> +      break;
> +
> +   case GL_BGRA:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_SIGNED_BGRA8888;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_BGRA8888;
> +      case GL_SHORT:
> +         return MESA_FORMAT_SIGNED_BGRA16161616;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_BGRA16161616;
> +      case GL_INT:
> +         return MESA_FORMAT_BGRA32323232;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_SIGNED_BGRA32323232;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_BGRA_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_BGRA_FLOAT16;
> +      case GL_UNSIGNED_SHORT_4_4_4_4:
> +         return MESA_FORMAT_BGRA4444;
> +      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
> +         return MESA_FORMAT_BGRA4444_REV;
> +      case GL_UNSIGNED_SHORT_5_5_5_1:
> +         return MESA_FORMAT_BGRA5551;
> +      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
> +         return MESA_FORMAT_BGRA1555_REV;
> +      case GL_UNSIGNED_INT_8_8_8_8:
> +         return MESA_FORMAT_BGRA8888;
> +      case GL_UNSIGNED_INT_8_8_8_8_REV:
> +         return MESA_FORMAT_BGRA8888_REV;
> +      case GL_UNSIGNED_INT_10_10_10_2:
> +         return MESA_FORMAT_BGRA1010102;
> +      case GL_UNSIGNED_INT_2_10_10_10_REV:
> +         return MESA_FORMAT_BGRA2101010_REV;
> +      case GL_UNSIGNED_INT_5_9_9_9_REV:
> +         return MESA_FORMAT_BGRA5999_REV;
> +      }
> +      break;
> +
> +   case GL_LUMINANCE:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_LUMINANCE_INT8;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_LUMINANCE_UINT8;
> +      case GL_SHORT:
> +         return MESA_FORMAT_LUMINANCE_INT16;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_LUMINANCE_UINT16;
> +      case GL_INT:
> +         return MESA_FORMAT_LUMINANCE_INT32;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_LUMINANCE_UINT32;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_LUMINANCE_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_LUMINANCE_FLOAT16;
> +      }
> +      break;
> +
> +   case GL_LUMINANCE_ALPHA:
> +      switch (type) {
> +      case GL_BYTE:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_UINT8;
> +      case GL_SHORT:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_INT16;
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_UINT16;
> +      case GL_INT:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_INT32;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_UINT32;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
> +      case GL_HALF_FLOAT:
> +         return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
> +      }
> +      break;
> +
> +   case GL_DEPTH_COMPONENT:
> +      switch (type) {
> +      case GL_INT:
> +         return MESA_FORMAT_Z32;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_Z32;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_Z32_FLOAT;
> +      }
> +      break;
> +
> +   case GL_STENCIL_INDEX:
> +      switch (type) {
> +      case GL_BYTE:
> +      case GL_UNSIGNED_BYTE:
> +         return MESA_FORMAT_S8;
> +      }
> +      break;
> +
> +   case GL_DEPTH_STENCIL:
> +      switch (type) {
> +      case GL_UNSIGNED_SHORT:
> +         return MESA_FORMAT_Z24_S8;
> +      case GL_INT:
> +         return MESA_FORMAT_Z32;
> +      case GL_UNSIGNED_INT:
> +         return MESA_FORMAT_Z32;
> +      case GL_FLOAT:
> +         return MESA_FORMAT_Z32_FLOAT_X24S8;
> +      case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
> +         return MESA_FORMAT_Z24_S8;
> +      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
> +         return MESA_FORMAT_S8_Z24;
> +      }
> +      break;
> +   }
> +
> +   _mesa_problem(ctx, "%s(): unexpected format %s and type %s\n",
> +                 __FUNCTION__, _mesa_lookup_enum_by_nr(format), _mesa_lookup_enum_by_nr(type));
> +   return MESA_FORMAT_NONE;
> +}
> diff --git a/src/mesa/main/texformat.h b/src/mesa/main/texformat.h
> index 88ad4d1..66d50b3 100644
> --- a/src/mesa/main/texformat.h
> +++ b/src/mesa/main/texformat.h
> @@ -29,13 +29,24 @@
>
>  #include "formats.h"
>
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
>  struct gl_context;
>
>  extern gl_format
> +_mesa_choose_cached_tex_format(struct gl_context *ctx, GLenum format, GLenum type);
> +extern gl_format
>  _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
>                          GLint internalFormat, GLenum format, GLenum type);
>
>  extern GLboolean
>  _mesa_tex_target_is_array(GLenum target);
>
> +#ifdef __cplusplus
> +}
> +#endif
> +
>  #endif
> --
> 1.8.3.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list