[Mesa-dev] [PATCH v2 2/2] i965/formats: Update the three-channel DXT1 mappings

Nanley Chery nanleychery at gmail.com
Fri May 12 23:02:28 UTC 2017


On Fri, May 12, 2017 at 01:33:54PM -0700, Nanley Chery wrote:
> The procedure for decompressing an opaque DXT1 OpenGL format is
> dependant on the comparison of two colors stored in the first 32 bits of
> the compressed block. Here's the specified OpenGL behavior for
> reference:
> 
>    The RGB color for a texel at location (x,y) in the block is given by:
> 
>       RGB0,              if color0 > color1 and code(x,y) == 0
>       RGB1,              if color0 > color1 and code(x,y) == 1
>       (2*RGB0+RGB1)/3,   if color0 > color1 and code(x,y) == 2
>       (RGB0+2*RGB1)/3,   if color0 > color1 and code(x,y) == 3
> 
>       RGB0,              if color0 <= color1 and code(x,y) == 0
>       RGB1,              if color0 <= color1 and code(x,y) == 1
>       (RGB0+RGB1)/2,     if color0 <= color1 and code(x,y) == 2
>       BLACK,             if color0 <= color1 and code(x,y) == 3
> 
> The sampling operation performed on an opaque DXT1 Intel format essentially
> hard-codes the comparison result of the two colors as color0 > color1.
> This means that the behavior is incompatible with OpenGL. This is stated
> in the SKL PRM, Vol 5: Memory Views:
> 
>    Opaque Textures (DXT1_RGB)
>       Texture format DXT1_RGB is identical to DXT1, with the exception that the
>       One-bit Alpha encoding is removed. Color 0 and Color 1 are not compared, and
>       the resulting texel color is derived strictly from the Opaque Color Encoding.
>       The alpha channel defaults to 1.0.
> 
>       Programming Note
>       Context: Opaque Textures (DXT1_RGB)
>       The behavior of this format is not compliant with the OGL spec.
> 
> The opaque and non-opaque DXT1 OpenGL formats are specified to be
> decoded in exactly the same way except the BLACK value must have a
> transparent alpha channel in the latter. Use the four-channel BC1 Intel
> formats with the alpha set to 1 to provide the behavior required by the
> spec. Note that the alpha is already set to 1 for RGB formats in
> brw_get_texture_swizzle().

The last sentence actually turned out to be false. I plan to send out a
v3 of this patch along with the Piglit test used to find this issue.


More information about the mesa-dev mailing list