Name EXT_texture_compression_s3tc_srgb Name Strings GL_EXT_texture_compression_s3tc_srgb Contributors Christophe Riccio, Unity Kai Ninomiya, Google Kenneth Russell, Google Contributors to EXT_texture_compression_s3tc Contact Christophe Riccio, (christophe 'dot' riccio 'at' unity3d 'dot' com) Status FINAL, implemented by ANGLE Version 1 October 2016 Number OpenGL ES Extension #289 Dependencies OpenGL ES 2.0 is required. OpenGL ES 3.0 or EXT_sRGB are required. EXT_texture_compression_s3tc is required. This extension is written against the OpenGL ES 3.0.4 specification with EXT_texture_compression_s3tc extension. This extension is written against the OpenGL ES 2.0.25 specification with EXT_texture_compression_s3tc extension. EXT_texture_storage affects the definition of this extension. Overview This extension adds new compressed color texture formats using S3TC with nonlinear sRGB color components. IP Status Contact S3 Incorporated (http://www.s3.com) regarding any intellectual property issues associated with implementing this extension. WARNING: Vendors able to support S3TC texture compression in Direct3D drivers do not necessarily have the right to use the same functionality in OpenGL. New Procedures and Functions None New Tokens This extension introduces new tokens: COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F In extended OpenGL ES 2.0.25 these new tokens are accepted by the parameter of TexImage2D, CompressedTexImage2D, TexStorage2DEXT, TextureStorage2DEXT and the parameter of CompressedTexSubImage2D. In extended OpenGL ES 3.0.4 these new tokens are also accepted by the parameter of TexImage2D, TexImage3D, CompressedTexImage3D, TexStorage2D, TexStorage3D, TexStorage3DEXT, TextureStorage3DEXT and the parameter of CompressedTexSubImage3D. Additions to Chapter 3 of the OpenGL ES 2.0.25 Specification Modify Section 3.7.1, Texture Image Specification: Change last paragraph on Page 67 as follows (modified by EXT_texture_compression_s3tc): Components are then selected from the resulting R, G, B, or A values to obtain a texture with the base internal format specified by , which must match except when is TEXTURE_2D and is one of the following compressed formats: COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. In this case, conversion from only RGB and RGBA formats are supported during texture image processing. values other than RGB or RGBA will result in the INVALID_OPERATION error. In all other cases where does not match , the error INVALID_OPERATION is generated. Table 3.8 summarizes the mapping of R, G, B, and A values to texture components, as a function of the base internal format of the texture image. may be one of the five internal format symbolic constants listed in table 3.8 or the four compressed formats: COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. Specifying a value for that is not one of the above values generates the error INVALID_VALUE. When a compressed is specified, a compressed texture is created and all the associated restrictions mentioned in Section 3.7.3 are imposed. Note that when encoding an RGBA image into a format using 1-bit alpha, any texels with an alpha component less than 0.5 end up with an alpha of 0.0 and any texels with an alpha component greater than or equal to 0.5 end up with an alpha of 1.0. When encoding an RGBA image into the COMPRESSED_RGBA_S3TC_DXT1_EXT or COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT format, the resulting red, green, and blue components of any texels with a final alpha of 0.0 will automatically be zero (black). If this behavior is not desired by an application, it should not use COMPRESSED_RGBA_S3TC_DXT1_EXT or COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT. Modify Section 3.7.2, Alternate Texture Image Specification Commands (modified by EXT_texture_compression_s3tc): Modify last paragraph with: When the internal format of the texture object is COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, the update region specified in TexSubImage2D must be aligned to 4x4 pixel blocks. If or are not multiples of 4 an INVALID_OPERATION error is generated. If is not a multiple of 4 and + is not equal to the width of the LOD then an INVALID_OPERATION error is generated. If is not a multiple of 4 and + is not equal to the height of the LOD then an INVALID_OPERATION error is generated. Modify Section 3.7.3, "Compressed Texture Images" Add 4 new rows to "Specific compressed texture formats" Table 3.X: Compressed Internal Format Base Internal Format ----------------------------------- -------------------- COMPRESSED_SRGB_S3TC_DXT1_EXT RGB COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT RGBA COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT RGBA COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT RGBA Replace last paragraph with: If the internal format is one of COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT the compressed texture is stored using one of several S3TC compressed texture image formats and is easily edited along 4x4 texel boundaries. In this case, CompressedTexSubImage2D will result in an INVALID_OPERATION error if one of the following conditions occurs: * is not a multiple of four, and plus is not equal to texture width; * is not a multiple of four, and plus is not equal to texture height; or * or is not a multiple of four. For any other formats, calling CompressedTexSubImage2D will result in an INVALID_OPERATION error if or is not equal to zero, or if and do not match the width and height of the texture, respectively. The contents of any texel outside the region modified by the call are undefined. These restrictions may be relaxed for other specific compressed internal formats whose images are easily modified. Additions to Chapter 3 of the OpenGL ES 3.0.4 Specification (Rasterization) Modify Section 3.8.3, "Texture Image Specification": Modify paragraph starting with "For internalformat different than " (modified by EXT_texture_compression_s3tc): For internalformat different than COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT specifying a combination of values for format, type, and internalformat that is not listed as a valid combination in tables 3.2 or 3.3 generates the error INVALID_OPERATION. For internalformat equal to COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT only RGB and RGBA formats are supported during texture image processing and for these internalformat values values other than RBA or RGBA will result in the INVALID_OPERATION error. Modify Section 3.8.6. "Compressed Texture Images": Add 4 new rows to "Compressed internal formats" Table 3.19: Compressed Internal Format Base Internal Format ----------------------------------- -------------------- COMPRESSED_SRGB_S3TC_DXT1_EXT RGB COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT RGBA COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT RGBA COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT RGBA Modify paragraph starting with "If the internal format is one of " (added by EXT_texture_compression_s3tc): If the internal format is one of COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT the compressed texture is stored using one of several S3TC compressed texture image formats and is easily edited along 4x4 texel boundaries. In this case, CompressedTexSubImage2D/CompressedTexSubImage3D will result in an INVALID_OPERATION error if one of the following conditions occurs: * is not a multiple of four, and plus is not equal to texture width; * is not a multiple of four, and plus is not equal to texture height; or * or is not a multiple of four. For any other formats, calling CompressedTexSubImage2D/CompressedTexSubImage3D will result in an INVALID_OPERATION error if or is not equal to zero, or if and do not match the width and height of the texture, respectively. The contents of any texel outside the region modified by the call are undefined. These restrictions may be relaxed for other specific compressed internal formats whose images are easily modified. Modify Section 3.8.16, "sRGB Texture Color Conversion": Change the first sentence to: If the currently bound texture's internal format is one of SRGB8, SRGB8_ALPHA8, COMPRESSED_SRGB8_ETC2, COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, the red, green, and blue components are converted from an sRGB color space to a linear color space as part of filtering described in sections 3.8.10 and 3.8.11. Dependencies on EXT_texture_storage If EXT_texture_storage is not supported, ignore all references to TexStorage2DEXT and TexStorage3DEXT functions. Errors for OpenGL ES 2.0.25 Specification INVALID_OPERATION is generated by CopyTexSubImage2D if the texture image bound to has internal format COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. INVALID_OPERATION is generated by CompressedTexSubImage2D if is COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT and any of the following apply: * is not a multiple of four, and plus is not equal to the texture width; * is not a multiple of four, and plus is not equal to the texture height; or * or is not a multiple of four. INVALID_OPERATION is generated by TexImage2D and TexSubImage2D if texture has internal format COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT and any of the following apply: * or are not multiples of 4 * is not a multiple of 4 and + is not equal to the width of the LOD * if is not a multiple of 4 and + is not equal to the height of the LOD Errors for OpenGL ES 3.0.4 Specification INVALID_OPERATION is generated by CopyTexSubImage2D / CopyTexSubImage3D if the texture image bound to has internal format COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. INVALID_OPERATION is generated by CompressedTexSubImage2D / CompressedTexSubImage3D if is COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT and any of the following apply: * is not a multiple of four, and plus is not equal to the texture width; * is not a multiple of four, and plus is not equal to the texture height; or * or is not a multiple of four. INVALID_OPERATION is generated by TexSubImage2D/TexSubImage3D if texture has internal format COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT and is not RGB or RGBA, or any of the following apply: * or are not multiples of 4 * is not a multiple of 4 and + is not equal to the width of the LOD * if is not a multiple of 4 and + is not equal to the height of the LOD New State for OpenGL ES 2.0.25 and 3.0.2 Specifications The queries for NUM_COMPRESSED_TEXTURE_FORMATS and COMPRESSED_TEXTURE_FORMATS include COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, and COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. New Implementation Dependent State None Issues (1) Should this be an extension for OpenGL too? sRGB DXT formats are already exposed through OpenGL EXT_texture_sRGB extension. RESOLVED: No (2) Can we use the new compression formats with TexImage2D/TexImage3D? EXT_texture_compression_s3tc supports DXT formats as internalformat of TexImage2D and TexImage3D hence this extension should follow this precedent. RESOLVED: Yes Revision History 2016-10-01 - criccio + Fixed missing formats in Section 3.8.3 2016-09-30 - criccio + Added issue 2 2016-09-10 - criccio + Initial draft