[Mesa-dev] [RFC PATCH 3/4] mesa: Prefer non-swizzled formats when prefer_no_swizzle set

Francisco Jerez currojerez at riseup.net
Thu Mar 13 03:07:37 PDT 2014


Chris Forbes <chrisf at ijw.co.nz> writes:

> Actually, after poking around a bit more, I think this is correct...
>
> As of Brian's commit 657436da7ee, the packed formats are described as
> being laid out from the LSB. This is consistent with this patch, with
> the pack/unpack code, and the hardware documentation:
>
>     mesa: update packed format layout comments
>
>     Update the comments for the packed formats to accurately reflect the
>     layout of the bits in the pixel.  For example, for the packed format
>     MESA_FORMAT_R8G8B8A8, R is in the least significant position while A
>     is in the most-significant position of the 32-bit word.
>
> Unfortunately the example higher up of how a type-P format is laid out
> is still backwards, which adds to the confusion.
>

Oh...  That's right...  But doesn't that mean that your choice is
backwards on BE machines?

> -- Chris
>
> On Wed, Mar 12, 2014 at 12:36 PM, Chris Forbes <chrisf at ijw.co.nz> wrote:
>> Yeah, you're right -- that looks bogus. There's been piles of
>> confusion recently in formats.h about which end things are laid out
>> from; the truth though is obviously in the pack/unpack code and the
>> hardware format documentation.
>>
>> On Wed, Mar 12, 2014 at 9:12 AM, Francisco Jerez <currojerez at riseup.net> wrote:
>>> Chris Forbes <chrisf at ijw.co.nz> writes:
>>>
>>>> If prefer_no_swizzle is set, try:
>>>> - The exact matching format
>>>> - Formats with the required components in the correct order, plus a junk
>>>>   component
>>>> - finally, swizzled formats (BGRA etc)
>>>>
>>>> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
>>>> ---
>>>>  src/mesa/main/texformat.c | 35 +++++++++++++++++++++++++++++++----
>>>>  1 file changed, 31 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c
>>>> index 33725dc..7cb42bc 100644
>>>> --- a/src/mesa/main/texformat.c
>>>> +++ b/src/mesa/main/texformat.c
>>>> @@ -79,11 +79,13 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
>>>>        } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
>>>>           RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
>>>>        }
>>>> -      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
>>>> -      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
>>>> -      break;
>>>> +      /* fallthrough */
>>>>
>>>>     case GL_RGBA8:
>>>> +      if (prefer_no_swizzle) {
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM);
>>>> +         break;
>>>> +      }
>>>
>>> Are you sure this is correct on little endian machines?  According to
>>> the docs, MESA_FORMAT_R8G8B8A8_UNORM would end up with the R component
>>> in the most significant byte (highest array index) and the A component
>>> in the least significant byte (lowest array index), which seems like the
>>> opposite of what GL_RGBA8 is specified to be by
>>> ARB_shader_image_load_store.
>>>
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
>>>>        break;
>>>> @@ -100,6 +102,9 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
>>>>
>>>>     /* deep RGBA formats */
>>>>     case GL_RGB10_A2:
>>>> +      if (prefer_no_swizzle) {
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UNORM);
>>>> +      }
>>>
>>> This looks correct for any endianness.
>>>
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
>>>>        break;
>>>> @@ -119,6 +124,11 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
>>>>        }
>>>>        /* fallthrough */
>>>>     case GL_RGB8:
>>>> +      if (prefer_no_swizzle) {
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UNORM8);
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_UNORM);
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM);
>>>
>>> The last two seem wrong for LE too.
>>>
>>>> +      }
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8);
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
>>>> @@ -454,10 +464,19 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
>>>>        break;
>>>>     case GL_RGB_SNORM:
>>>>     case GL_RGB8_SNORM:
>>>> +      if (prefer_no_swizzle) {
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SNORM);
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
>>>> +      }
>>>
>>> Same here.
>>>
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM);
>>>> -      /* FALLTHROUGH */
>>>> +      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
>>>> +      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
>>>> +      break;
>>>>     case GL_RGBA_SNORM:
>>>>     case GL_RGBA8_SNORM:
>>>> +      if (prefer_no_swizzle) {
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
>>>> +      }
>>>
>>> And here.
>>>
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
>>>>        break;
>>>> @@ -525,11 +544,19 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
>>>>
>>>>     case GL_SRGB_EXT:
>>>>     case GL_SRGB8_EXT:
>>>> +      if (prefer_no_swizzle) {
>>>> +         /* there is no MESA_FORMAT_RGB_SRGB8 */
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SRGB);
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB);
>>>
>>> And here.
>>>
>>>> +      }
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8);
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
>>>>        break;
>>>>     case GL_SRGB_ALPHA_EXT:
>>>>     case GL_SRGB8_ALPHA8_EXT:
>>>> +      if (prefer_no_swizzle) {
>>>> +         RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB);
>>>> +      }
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB);
>>>>        RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
>>>>        break;
>>>> --
>>>> 1.9.0
>>>>
>>>> _______________________________________________
>>>> mesa-dev mailing list
>>>> mesa-dev at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140313/40bd774f/attachment.pgp>


More information about the mesa-dev mailing list