<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Nov 15, 2013 at 9:52 AM, Marek Olšák <span dir="ltr"><<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">I don't understand this and I don't think this is the right way to<br>

implement hw-accelerated TexImage. Some of the formats are unsupported<br>
by all hardware I know, others just don't make any sense (e.g.<br>
RGBA5999_REV).<br></blockquote><div><br></div><div>Please check out st_choose_matching_format. This is what the function comment says:</div><div>/**</div><div> * Given an OpenGL user-requested format and type, and swapBytes state,</div>
<div> * return the format which exactly matches those parameters, so that</div><div> * a memcpy-based transfer can be done.</div><div> *</div><div> * If no format is supported, return PIPE_FORMAT_NONE.</div><div> */</div>
<div><br></div><div>My patch allows for similar functionality without using Gallium PIPE_FORMATs, which aren't supported in the i965 driver. RGPA5999_REV is there because it is used by a the glean test case pixelFormats. Having hardware support for the added formats is not relevant.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
I think the proper way to implement PBO unpacking is to read the PBO<br>
as a TBO. If you don't have a PBO, you can always create it.<br>
<br></blockquote><div><br></div><div>The i965 driver already has machinery to trigger unpacking and processing of textures on the GPU, though some work is needed for it to handle more than simple cases. These additional gl_formats are an important part of making that happen.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Marek<br>
<div><div class="h5"><br>
On Fri, Nov 15, 2013 at 12:53 AM, Mark Mueller <<a href="mailto:markkmueller@gmail.com">markkmueller@gmail.com</a>> wrote:<br>
> This and the subsequent patch are the first steps in adding support to load textures<br>
> via GPU instead of CPU. This patch expands Mesa's gl_formats such that all GLUser<br>
> format/type combinations are represented and thus can be communicated to lower levels<br>
> within dri drivers. The new formats are source only thus they require no associated<br>
> Texstore functions or render targets, therefore they are added _privately_ at the end<br>
> of the gl_formats list.<br>
><br>
> Signed-off-by: Mark Mueller <<a href="mailto:MarkKMueller@gmail.com">MarkKMueller@gmail.com</a>><br>
> ---<br>
>  src/mesa/main/formats.c   | 441 +++++++++++++++++++++++++++++++++++++++++++++-<br>
>  src/mesa/main/formats.h   |  70 +++++++-<br>
>  src/mesa/main/texformat.c | 271 ++++++++++++++++++++++++++++<br>
>  src/mesa/main/texformat.h |  11 ++<br>
>  4 files changed, 789 insertions(+), 4 deletions(-)<br>
><br>
> diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c<br>
> index 07d2a72..2c32bba 100644<br>
> --- a/src/mesa/main/formats.c<br>
> +++ b/src/mesa/main/formats.c<br>
> @@ -76,7 +76,7 @@ struct gl_format_info<br>
>   * These must be in the same order as the MESA_FORMAT_* enums so that<br>
>   * we can do lookups without searching.<br>
>   */<br>
> -static struct gl_format_info format_info[MESA_FORMAT_COUNT] =<br>
> +static struct gl_format_info format_info[MESA_PRIVATE_FORMAT_COUNT] =<br>
>  {<br>
>     {<br>
>        MESA_FORMAT_NONE,            /* Name */<br>
> @@ -1572,7 +1572,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =<br>
>     },<br>
>     {<br>
>        MESA_FORMAT_RGB9_E5_FLOAT,<br>
> -      "MESA_FORMAT_RGB9_E5",<br>
> +      "MESA_FORMAT_RGB9_E5_FLOAT",<br>
>        GL_RGB,<br>
>        GL_FLOAT,<br>
>        9, 9, 9, 0,<br>
> @@ -1763,6 +1763,440 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =<br>
>        0, 0, 0, 0, 0,<br>
>        1, 1, 16<br>
>     },<br>
> +<br>
> +   /*<br>
> +    * Formats to exactly represent format/type combinations for OGLUser provided<br>
> +    * textures. These formats are required only for caching of an unaltered copy of<br>
> +    * the application texture prior to passing them to the GPU, where they are<br>
> +    * processed to the final internalFormat and miptree location. Texstore functions<br>
> +    * do not apply and these are not intended to be used as render targets.<br>
> +    * Listing is based on the order presented in the glTexImage2D spec.<br>
> +    */<br>
> +   /* Red Solo - !cup */<br>
> +   {<br>
> +      MESA_FORMAT_R32,<br>
> +      "MESA_FORMAT_R32",<br>
> +      GL_RED,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      16, 0, 0, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 2<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_R32,<br>
> +      "MESA_FORMAT_SIGNED_R32",<br>
> +      GL_RED,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      32, 0, 0, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +<br>
> +   /* Red Green - !show */<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RG88,<br>
> +      "MESA_FORMAT_SIGNED_RG88",<br>
> +      GL_RG,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      8, 8, 0, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 2<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RG1616,<br>
> +      "MESA_FORMAT_SIGNED_RG1616",<br>
> +      GL_RG,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      16, 16, 0, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RG3232,<br>
> +      "MESA_FORMAT_RG3232",<br>
> +      GL_RG,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      32, 32, 0, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 8<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RG3232,<br>
> +      "MESA_FORMAT_SIGNED_RG3232",<br>
> +      GL_RG,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      32, 32, 0, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 8<br>
> +   },<br>
> +<br>
> +   /* Red Green Blue */<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RGB888,<br>
> +      "MESA_FORMAT_SIGNED_RGB888",<br>
> +      GL_RGB,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      8, 8, 8, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 3<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGB161616,<br>
> +      "MESA_FORMAT_RG161616",<br>
> +      GL_RGB,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      16, 16, 16, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 6<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RGB161616,<br>
> +      "MESA_FORMAT_SIGNED_RGB161616",<br>
> +      GL_RGB,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      16, 16, 16, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 6<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGB323232,<br>
> +      "MESA_FORMAT_RGB323232",<br>
> +      GL_RGB,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      32, 32, 32, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 12<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RGB323232,<br>
> +      "MESA_FORMAT_SIGNED_RGB323232",<br>
> +      GL_RGB,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      32, 32, 32, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 12<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGB233_REV,<br>
> +      "MESA_FORMAT_RGB233_REV",<br>
> +      GL_RGB,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      3, 3, 2, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 1<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGB101111_REV,<br>
> +      "MESA_FORMAT_RGB101111_REV",<br>
> +      GL_RGB,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      11, 11, 10, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +<br>
> +   /* Blue Green Red */<br>
> +   {<br>
> +       MESA_FORMAT_SIGNED_BGR888,<br>
> +       "MESA_FORMAT_SIGNED_BGR888",<br>
> +       GL_RGB,<br>
> +       GL_SIGNED_NORMALIZED,<br>
> +       8, 8, 8, 0,<br>
> +       0, 0, 0, 0, 0,<br>
> +       1, 1, 3<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGR161616,<br>
> +      "MESA_FORMAT_BGR161616",<br>
> +      GL_RGB,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      16, 16, 16, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 6<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_BGR161616,<br>
> +      "MESA_FORMAT_SIGNED_BGR161616",<br>
> +      GL_RGB,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      16, 16, 16, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 6<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGR_FLOAT16,<br>
> +      "MESA_FORMAT_BGR_FLOAT16",<br>
> +      GL_RGB,<br>
> +      GL_FLOAT,<br>
> +      16, 16, 16, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 6<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGR323232,<br>
> +      "MESA_FORMAT_BGR323232",<br>
> +      GL_RGB,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      32, 32, 32, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 12<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_BGR323232,<br>
> +      "MESA_FORMAT_SIGNED_BGR323232",<br>
> +      GL_RGB,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      32, 32, 32, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 12<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGR_FLOAT32,<br>
> +      "MESA_FORMAT_BGR_FLOAT32",<br>
> +      GL_RGB,<br>
> +      GL_FLOAT,<br>
> +      32, 32, 32, 0,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 12<br>
> +   },<br>
> +<br>
> +   /* Red Green Blue Alpha */<br>
> +   {<br>
> +      MESA_FORMAT_RGBA16161616,<br>
> +      "MESA_FORMAT_RGBA161616",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      16, 16, 16, 16,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 8<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RGBA16161616,<br>
> +      "MESA_FORMAT_SIGNED_RGBA161616",<br>
> +      GL_RGBA,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      16, 16, 16, 16,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 8<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGBA32323232,<br>
> +      "MESA_FORMAT_RGBA323232",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      32, 32, 32, 32,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 16<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_RGBA32323232,<br>
> +      "MESA_FORMAT_SIGNED_RGBA323232",<br>
> +      GL_RGBA,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      32, 32, 32, 32,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 16<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGBA1010102,<br>
> +      "MESA_FORMAT_RGBA1010102",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      10, 10, 10, 2,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGBA2101010_REV,<br>
> +      "MESA_FORMAT_RGBA2101010_REV",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      10, 10, 10, 2,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGBA5999_REV,<br>
> +      "MESA_FORMAT_RGBA5999_REV",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      9, 9, 9, 5,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGBA4444,        /* Name */<br>
> +      "MESA_FORMAT_RGBA4444",      /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGBA4444_REV,    /* Name */<br>
> +      "MESA_FORMAT_RGBA4444_REV",  /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_RGBA1555_REV,    /* Name */<br>
> +      "MESA_FORMAT_RGBA1555_REV",  /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +<br>
> +   /* Blue Green Red Alpha */<br>
> +   {<br>
> +      MESA_FORMAT_BGRA8888,        /* Name */<br>
> +      "MESA_FORMAT_BGRA8888",      /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA8888_REV,    /* Name */<br>
> +      "MESA_FORMAT_BGRA8888",      /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_BGRA8888,<br>
> +      "MESA_FORMAT_SIGNED_BGRA8888",<br>
> +      GL_RGBA,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      8, 8, 8, 8,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA16161616,<br>
> +      "MESA_FORMAT_BGRA16161616",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      16, 16, 16, 16,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 8<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_BGRA16161616,<br>
> +      "MESA_FORMAT_SIGNED_BGRA16161616",<br>
> +      GL_RGBA,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      16, 16, 16, 16,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 8<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA_FLOAT16,<br>
> +      "MESA_FORMAT_BGRA_FLOAT16",<br>
> +      GL_RGBA,<br>
> +      GL_FLOAT,<br>
> +      16, 16, 16, 16,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 8<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA32323232,<br>
> +      "MESA_FORMAT_BGRA32323232",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      32, 32, 32, 32,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 16<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_SIGNED_BGRA32323232,<br>
> +      "MESA_FORMAT_SIGNED_BGRA32323232",<br>
> +      GL_RGBA,<br>
> +      GL_SIGNED_NORMALIZED,<br>
> +      32, 32, 32, 32,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 16<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA_FLOAT32,<br>
> +      "MESA_FORMAT_BGRA_FLOAT32",<br>
> +      GL_RGBA,<br>
> +      GL_FLOAT,<br>
> +      32, 32, 32, 32,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 16<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA4444,        /* Name */<br>
> +      "MESA_FORMAT_BGRA4444",      /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA4444_REV,    /* Name */<br>
> +      "MESA_FORMAT_BGRA4444_REV",  /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA5551,        /* Name */<br>
> +      "MESA_FORMAT_BGRA5551",      /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA1555_REV,    /* Name */<br>
> +      "MESA_FORMAT_BGRA1555_REV",  /* StrName */<br>
> +      GL_RGBA,                     /* BaseFormat */<br>
> +      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> +      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */<br>
> +      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> +      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA1010102,<br>
> +      "MESA_FORMAT_BGRA1010102",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      10, 10, 10, 2,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA2101010_REV,<br>
> +      "MESA_FORMAT_BGRA2101010_REV",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      10, 10, 10, 2,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
> +   {<br>
> +      MESA_FORMAT_BGRA5999_REV,<br>
> +      "MESA_FORMAT_BGRA5999_REV",<br>
> +      GL_RGBA,<br>
> +      GL_UNSIGNED_NORMALIZED,<br>
> +      9, 9, 9, 5,<br>
> +      0, 0, 0, 0, 0,<br>
> +      1, 1, 4<br>
> +   },<br>
>  };<br>
><br>
><br>
> @@ -2221,7 +2655,7 @@ _mesa_test_formats(void)<br>
>  {<br>
>     GLuint i;<br>
><br>
> -   STATIC_ASSERT(Elements(format_info) == MESA_FORMAT_COUNT);<br>
> +   STATIC_ASSERT(Elements(format_info) == MESA_PRIVATE_FORMAT_COUNT);<br>
><br>
>     for (i = 0; i < MESA_FORMAT_COUNT; i++) {<br>
>        const struct gl_format_info *info = _mesa_get_format_info(i);<br>
> @@ -3361,6 +3795,7 @@ _mesa_format_matches_format_and_type(gl_format gl_format,<br>
>     case MESA_FORMAT_XBGR32323232_FLOAT:<br>
>     case MESA_FORMAT_XBGR32323232_UINT:<br>
>     case MESA_FORMAT_XBGR32323232_SINT:<br>
> +   default:<br>
>        return GL_FALSE;<br>
>     }<br>
><br>
> diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h<br>
> index 64b4b9a..687b525 100644<br>
> --- a/src/mesa/main/formats.h<br>
> +++ b/src/mesa/main/formats.h<br>
> @@ -304,7 +304,75 @@ typedef enum<br>
>     MESA_FORMAT_XBGR32323232_UINT, /* ... */<br>
>     MESA_FORMAT_XBGR32323232_SINT, /* ... */<br>
><br>
> -   MESA_FORMAT_COUNT<br>
> +   MESA_FORMAT_COUNT,<br>
> +<br>
> +   /*<br>
> +    * Formats to exactly represent format/type combinations for OGLUser provided<br>
> +    * textures. These formats are required only for caching of an unaltered copy of<br>
> +    * the application texture prior to passing them to the GPU, where they are<br>
> +    * processed to the final internalFormat and miptree location. Texstore functions<br>
> +    * do not apply and these are not intended to be used as render targets.<br>
> +    * Listing is based on the order presented in the glTexImage2D spec.<br>
> +    */<br>
> +   /* Red Solo - !cup */<br>
> +   MESA_FORMAT_R32 = MESA_FORMAT_COUNT,<br>
> +   MESA_FORMAT_SIGNED_R32,<br>
> +<br>
> +   /* Red Green - !show */<br>
> +   MESA_FORMAT_SIGNED_RG88,<br>
> +   MESA_FORMAT_SIGNED_RG1616,<br>
> +   MESA_FORMAT_RG3232,<br>
> +   MESA_FORMAT_SIGNED_RG3232,<br>
> +<br>
> +   /* Red Green Blue */<br>
> +   MESA_FORMAT_SIGNED_RGB888,<br>
> +   MESA_FORMAT_RGB161616,<br>
> +   MESA_FORMAT_SIGNED_RGB161616,<br>
> +   MESA_FORMAT_RGB323232,<br>
> +   MESA_FORMAT_SIGNED_RGB323232,<br>
> +   MESA_FORMAT_RGB233_REV,<br>
> +   MESA_FORMAT_RGB101111_REV,<br>
> +<br>
> +   /* Blue Green Red */<br>
> +   MESA_FORMAT_SIGNED_BGR888,<br>
> +   MESA_FORMAT_BGR161616,<br>
> +   MESA_FORMAT_SIGNED_BGR161616,<br>
> +   MESA_FORMAT_BGR_FLOAT16,<br>
> +   MESA_FORMAT_BGR323232,<br>
> +   MESA_FORMAT_SIGNED_BGR323232,<br>
> +   MESA_FORMAT_BGR_FLOAT32,<br>
> +<br>
> +   /* Red Green Blue Alpha */<br>
> +   MESA_FORMAT_RGBA16161616,<br>
> +   MESA_FORMAT_SIGNED_RGBA16161616,<br>
> +   MESA_FORMAT_RGBA32323232,<br>
> +   MESA_FORMAT_SIGNED_RGBA32323232,<br>
> +   MESA_FORMAT_RGBA1010102,<br>
> +   MESA_FORMAT_RGBA2101010_REV,<br>
> +   MESA_FORMAT_RGBA5999_REV,<br>
> +   MESA_FORMAT_RGBA4444,<br>
> +   MESA_FORMAT_RGBA4444_REV,<br>
> +   MESA_FORMAT_RGBA1555_REV,<br>
> +<br>
> +   /* Blue Green Red Alpha */<br>
> +   MESA_FORMAT_BGRA8888,<br>
> +   MESA_FORMAT_BGRA8888_REV,<br>
> +   MESA_FORMAT_SIGNED_BGRA8888,<br>
> +   MESA_FORMAT_BGRA16161616,<br>
> +   MESA_FORMAT_SIGNED_BGRA16161616,<br>
> +   MESA_FORMAT_BGRA_FLOAT16,<br>
> +   MESA_FORMAT_BGRA32323232,<br>
> +   MESA_FORMAT_SIGNED_BGRA32323232,<br>
> +   MESA_FORMAT_BGRA_FLOAT32,<br>
> +   MESA_FORMAT_BGRA4444,<br>
> +   MESA_FORMAT_BGRA4444_REV,<br>
> +   MESA_FORMAT_BGRA5551,<br>
> +   MESA_FORMAT_BGRA1555_REV,<br>
> +   MESA_FORMAT_BGRA1010102,<br>
> +   MESA_FORMAT_BGRA2101010_REV,<br>
> +   MESA_FORMAT_BGRA5999_REV,<br>
> +<br>
> +   MESA_PRIVATE_FORMAT_COUNT<br>
>  } gl_format;<br>
><br>
><br>
> diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c<br>
> index d3aa477..713fdf2 100644<br>
> --- a/src/mesa/main/texformat.c<br>
> +++ b/src/mesa/main/texformat.c<br>
> @@ -831,3 +831,274 @@ _mesa_tex_target_is_array(GLenum target)<br>
>        return GL_FALSE;<br>
>     }<br>
>  }<br>
> +<br>
> +/**<br>
> + * Choose a texture format that exaclty matches the application texture<br>
> + * given the format, and type Format parameters passed to glTexImage().<br>
> + *<br>
> + * \param ctx  the GL context.<br>
> + * \param format  incoming image pixel format.<br>
> + * \param type  incoming image data type.<br>
> + *<br>
> + * \return a matching gl_format for the given format/type arguments<br>
> + *<br>
> + */<br>
> +gl_format<br>
> +_mesa_choose_cached_tex_format(struct gl_context *ctx, GLenum format, GLenum type)<br>
> +{<br>
> +   switch (format) {<br>
> +   case GL_RED:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_SIGNED_R8;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_R8;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_SIGNED_R16;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_R16;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_SIGNED_R32;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_R32;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_R_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_R_FLOAT16;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_RG:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_SIGNED_RG88;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_RG88;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_SIGNED_RG1616;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_RG1616;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_SIGNED_RG3232;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_RG3232;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_RG_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_RG_FLOAT16;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_RGB:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_SIGNED_RGB888;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_RGB888;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_SIGNED_RGB161616;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_RGB161616;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_SIGNED_RGB323232;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_RGB323232;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_RGB_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_RGB_FLOAT16;<br>
> +      case GL_UNSIGNED_BYTE_3_3_2:<br>
> +         return MESA_FORMAT_RGB332;<br>
> +      case GL_UNSIGNED_BYTE_2_3_3_REV:<br>
> +         return MESA_FORMAT_RGB233_REV;<br>
> +      case GL_UNSIGNED_SHORT_5_6_5:<br>
> +         return MESA_FORMAT_RGB565;<br>
> +      case GL_UNSIGNED_SHORT_5_6_5_REV:<br>
> +         return MESA_FORMAT_RGB565_REV;<br>
> +      case GL_UNSIGNED_INT_10F_11F_11F_REV:<br>
> +         return MESA_FORMAT_RGB101111_REV;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_BGR:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_SIGNED_BGR888;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_BGR888;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_SIGNED_BGR161616;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_BGR161616;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_SIGNED_BGR323232;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_BGR323232;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_BGR_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_BGR_FLOAT16;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_RGBA:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_SIGNED_RGBA8888;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_RGBA8888;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_SIGNED_RGBA16161616;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_RGBA16161616;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_SIGNED_RGBA32323232;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_RGBA32323232;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_RGBA_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_RGBA_FLOAT16;<br>
> +      case GL_UNSIGNED_SHORT_4_4_4_4:<br>
> +         return MESA_FORMAT_RGBA4444;<br>
> +      case GL_UNSIGNED_SHORT_4_4_4_4_REV:<br>
> +         return MESA_FORMAT_RGBA4444_REV;<br>
> +      case GL_UNSIGNED_SHORT_5_5_5_1:<br>
> +         return MESA_FORMAT_RGBA5551;<br>
> +      case GL_UNSIGNED_SHORT_1_5_5_5_REV:<br>
> +         return MESA_FORMAT_RGBA1555_REV;<br>
> +      case GL_UNSIGNED_INT_8_8_8_8:<br>
> +         return MESA_FORMAT_RGBA32323232;<br>
> +      case GL_UNSIGNED_INT_8_8_8_8_REV:<br>
> +         return MESA_FORMAT_RGBA8888_REV;<br>
> +      case GL_UNSIGNED_INT_10_10_10_2:<br>
> +         return MESA_FORMAT_RGBA1010102;<br>
> +      case GL_UNSIGNED_INT_2_10_10_10_REV:<br>
> +         return MESA_FORMAT_RGBA2101010_REV;<br>
> +      case GL_UNSIGNED_INT_5_9_9_9_REV:<br>
> +         return MESA_FORMAT_RGBA5999_REV;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_BGRA:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_SIGNED_BGRA8888;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_BGRA8888;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_SIGNED_BGRA16161616;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_BGRA16161616;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_BGRA32323232;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_SIGNED_BGRA32323232;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_BGRA_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_BGRA_FLOAT16;<br>
> +      case GL_UNSIGNED_SHORT_4_4_4_4:<br>
> +         return MESA_FORMAT_BGRA4444;<br>
> +      case GL_UNSIGNED_SHORT_4_4_4_4_REV:<br>
> +         return MESA_FORMAT_BGRA4444_REV;<br>
> +      case GL_UNSIGNED_SHORT_5_5_5_1:<br>
> +         return MESA_FORMAT_BGRA5551;<br>
> +      case GL_UNSIGNED_SHORT_1_5_5_5_REV:<br>
> +         return MESA_FORMAT_BGRA1555_REV;<br>
> +      case GL_UNSIGNED_INT_8_8_8_8:<br>
> +         return MESA_FORMAT_BGRA8888;<br>
> +      case GL_UNSIGNED_INT_8_8_8_8_REV:<br>
> +         return MESA_FORMAT_BGRA8888_REV;<br>
> +      case GL_UNSIGNED_INT_10_10_10_2:<br>
> +         return MESA_FORMAT_BGRA1010102;<br>
> +      case GL_UNSIGNED_INT_2_10_10_10_REV:<br>
> +         return MESA_FORMAT_BGRA2101010_REV;<br>
> +      case GL_UNSIGNED_INT_5_9_9_9_REV:<br>
> +         return MESA_FORMAT_BGRA5999_REV;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_LUMINANCE:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_LUMINANCE_INT8;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_LUMINANCE_UINT8;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_LUMINANCE_INT16;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_LUMINANCE_UINT16;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_LUMINANCE_INT32;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_LUMINANCE_UINT32;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_LUMINANCE_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_LUMINANCE_FLOAT16;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_LUMINANCE_ALPHA:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_INT8;<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_UINT8;<br>
> +      case GL_SHORT:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_INT16;<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_UINT16;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_INT32;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_UINT32;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;<br>
> +      case GL_HALF_FLOAT:<br>
> +         return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_DEPTH_COMPONENT:<br>
> +      switch (type) {<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_Z32;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_Z32;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_Z32_FLOAT;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_STENCIL_INDEX:<br>
> +      switch (type) {<br>
> +      case GL_BYTE:<br>
> +      case GL_UNSIGNED_BYTE:<br>
> +         return MESA_FORMAT_S8;<br>
> +      }<br>
> +      break;<br>
> +<br>
> +   case GL_DEPTH_STENCIL:<br>
> +      switch (type) {<br>
> +      case GL_UNSIGNED_SHORT:<br>
> +         return MESA_FORMAT_Z24_S8;<br>
> +      case GL_INT:<br>
> +         return MESA_FORMAT_Z32;<br>
> +      case GL_UNSIGNED_INT:<br>
> +         return MESA_FORMAT_Z32;<br>
> +      case GL_FLOAT:<br>
> +         return MESA_FORMAT_Z32_FLOAT_X24S8;<br>
> +      case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */<br>
> +         return MESA_FORMAT_Z24_S8;<br>
> +      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:<br>
> +         return MESA_FORMAT_S8_Z24;<br>
> +      }<br>
> +      break;<br>
> +   }<br>
> +<br>
> +   _mesa_problem(ctx, "%s(): unexpected format %s and type %s\n",<br>
> +                 __FUNCTION__, _mesa_lookup_enum_by_nr(format), _mesa_lookup_enum_by_nr(type));<br>
> +   return MESA_FORMAT_NONE;<br>
> +}<br>
> diff --git a/src/mesa/main/texformat.h b/src/mesa/main/texformat.h<br>
> index 88ad4d1..66d50b3 100644<br>
> --- a/src/mesa/main/texformat.h<br>
> +++ b/src/mesa/main/texformat.h<br>
> @@ -29,13 +29,24 @@<br>
><br>
>  #include "formats.h"<br>
><br>
> +<br>
> +#ifdef __cplusplus<br>
> +extern "C" {<br>
> +#endif<br>
> +<br>
>  struct gl_context;<br>
><br>
>  extern gl_format<br>
> +_mesa_choose_cached_tex_format(struct gl_context *ctx, GLenum format, GLenum type);<br>
> +extern gl_format<br>
>  _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,<br>
>                          GLint internalFormat, GLenum format, GLenum type);<br>
><br>
>  extern GLboolean<br>
>  _mesa_tex_target_is_array(GLenum target);<br>
><br>
> +#ifdef __cplusplus<br>
> +}<br>
> +#endif<br>
> +<br>
>  #endif<br>
> --<br>
> 1.8.3.1<br>
><br>
</div></div>> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div></div>