[Mesa-dev] [PATCH v3 1/2] anv/formats: Update the three-channel BC1 mappings

Nanley Chery nanleychery at gmail.com
Thu May 18 20:43:53 UTC 2017


+Ken

On Tue, May 16, 2017 at 10:17:11AM -0700, Nanley Chery wrote:
> The procedure for decompressing an opaque BC1 Vulkan format is dependant on the
> comparison of two colors stored in the first 32 bits of the compressed block.
> Here's the specified OpenGL (and Vulkan) 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 and Vulkan. 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 BC1 Vulkan 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.
> 
> v2 (Kenneth Graunke):
> - Provide a more detailed commit message.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100925
> Cc: <mesa-stable at lists.freedesktop.org>
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org> (v1)
> Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
> ---
>  src/intel/vulkan/anv_formats.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c
> index c39cec3800..25801e8b06 100644
> --- a/src/intel/vulkan/anv_formats.c
> +++ b/src/intel/vulkan/anv_formats.c
> @@ -179,8 +179,8 @@ static const struct anv_format anv_formats[] = {
>     fmt(VK_FORMAT_D24_UNORM_S8_UINT,       ISL_FORMAT_R24_UNORM_X8_TYPELESS),
>     fmt(VK_FORMAT_D32_SFLOAT_S8_UINT,      ISL_FORMAT_R32_FLOAT),
>  
> -   fmt(VK_FORMAT_BC1_RGB_UNORM_BLOCK,     ISL_FORMAT_DXT1_RGB),
> -   fmt(VK_FORMAT_BC1_RGB_SRGB_BLOCK,      ISL_FORMAT_DXT1_RGB_SRGB),
> +   swiz_fmt(VK_FORMAT_BC1_RGB_UNORM_BLOCK,     ISL_FORMAT_BC1_UNORM, RGB1),
> +   swiz_fmt(VK_FORMAT_BC1_RGB_SRGB_BLOCK,      ISL_FORMAT_BC1_UNORM_SRGB, RGB1),
>     fmt(VK_FORMAT_BC1_RGBA_UNORM_BLOCK,    ISL_FORMAT_BC1_UNORM),
>     fmt(VK_FORMAT_BC1_RGBA_SRGB_BLOCK,     ISL_FORMAT_BC1_UNORM_SRGB),
>     fmt(VK_FORMAT_BC2_UNORM_BLOCK,         ISL_FORMAT_BC2_UNORM),
> -- 
> 2.12.2
> 


More information about the mesa-dev mailing list