[Mesa-dev] [RFC PATCH 3/4] mesa: Prefer non-swizzled formats when prefer_no_swizzle set
Chris Forbes
chrisf at ijw.co.nz
Wed Mar 12 21:38:52 PDT 2014
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.
-- 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
More information about the mesa-dev
mailing list