/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ // Original file Copyright Crytek GMBH or its affiliates, used under license. // Description : Declares the image formats used by DXGL and the utility // methods for converting to and from DXGI formats #ifndef __GLFORMAT__ #define __GLFORMAT__ #include "GLCommon.hpp" // Confetti BEGIN: Igor Lobanchikov #import #import #import #import // Confetti END: Igor Lobanchikov // Enumeration of the IDs of all the supported GI format (each ID must match one // DXGI_FORMAT enumeration value - excluding the DXGI_FORMAT prefix). #define DXGL_UNCOMPRESSED_GI_FORMATS(_Func) \ _Func(R32G32B32A32_TYPELESS) \ _Func(R32G32B32A32_FLOAT) \ _Func(R32G32B32A32_UINT) \ _Func(R32G32B32A32_SINT) \ _Func(R32G32B32_TYPELESS) \ _Func(R32G32B32_FLOAT) \ _Func(R32G32B32_UINT) \ _Func(R32G32B32_SINT) \ _Func(R16G16B16A16_TYPELESS) \ _Func(R16G16B16A16_FLOAT) \ _Func(R16G16B16A16_UNORM) \ _Func(R16G16B16A16_UINT) \ _Func(R16G16B16A16_SNORM) \ _Func(R16G16B16A16_SINT) \ _Func(R32G32_TYPELESS) \ _Func(R32G32_FLOAT) \ _Func(R32G32_UINT) \ _Func(R32G32_SINT) \ _Func(R32G8X24_TYPELESS) \ _Func(D32_FLOAT_S8X24_UINT) \ _Func(R32_FLOAT_X8X24_TYPELESS) \ _Func(X32_TYPELESS_G8X24_UINT) \ _Func(R10G10B10A2_TYPELESS) \ _Func(R10G10B10A2_UNORM) \ _Func(R10G10B10A2_UINT) \ _Func(R11G11B10_FLOAT) \ _Func(R8G8B8A8_TYPELESS) \ _Func(R8G8B8A8_UNORM) \ _Func(R8G8B8A8_UNORM_SRGB) \ _Func(R8G8B8A8_UINT) \ _Func(R8G8B8A8_SNORM) \ _Func(R8G8B8A8_SINT) \ _Func(R16G16_TYPELESS) \ _Func(R16G16_FLOAT) \ _Func(R16G16_UNORM) \ _Func(R16G16_UINT) \ _Func(R16G16_SNORM) \ _Func(R16G16_SINT) \ _Func(R32_TYPELESS) \ _Func(D32_FLOAT) \ _Func(R32_FLOAT) \ _Func(R32_UINT) \ _Func(R32_SINT) \ _Func(R24G8_TYPELESS) \ _Func(D24_UNORM_S8_UINT) \ _Func(R24_UNORM_X8_TYPELESS) \ _Func(X24_TYPELESS_G8_UINT) \ _Func(R8G8_TYPELESS) \ _Func(R8G8_UNORM) \ _Func(R8G8_UINT) \ _Func(R8G8_SNORM) \ _Func(R8G8_SINT) \ _Func(R16_TYPELESS) \ _Func(R16_FLOAT) \ _Func(D16_UNORM) \ _Func(R16_UNORM) \ _Func(R16_UINT) \ _Func(R16_SNORM) \ _Func(R16_SINT) \ _Func(R8_TYPELESS) \ _Func(R8_UNORM) \ _Func(R8_UINT) \ _Func(R8_SNORM) \ _Func(R8_SINT) \ _Func(A8_UNORM) \ _Func(R9G9B9E5_SHAREDEXP) \ _Func(B5G6R5_UNORM) \ _Func(B5G5R5A1_UNORM) \ _Func(B8G8R8A8_TYPELESS) \ _Func(B8G8R8A8_UNORM) \ _Func(B8G8R8A8_UNORM_SRGB) \ _Func(B8G8R8X8_TYPELESS) \ _Func(B8G8R8X8_UNORM) \ _Func(B8G8R8X8_UNORM_SRGB) #define DXGL_COMPRESSED_GI_FORMATS(_Func) \ _Func(BC1_TYPELESS) \ _Func(BC1_UNORM) \ _Func(BC1_UNORM_SRGB) \ _Func(BC2_TYPELESS) \ _Func(BC2_UNORM) \ _Func(BC2_UNORM_SRGB) \ _Func(BC3_TYPELESS) \ _Func(BC3_UNORM) \ _Func(BC3_UNORM_SRGB) \ _Func(BC4_TYPELESS) \ _Func(BC4_UNORM) \ _Func(BC4_SNORM) \ _Func(BC5_TYPELESS) \ _Func(BC5_UNORM) \ _Func(BC5_SNORM) \ _Func(BC6H_TYPELESS) \ _Func(BC6H_UF16) \ _Func(BC6H_SF16) \ _Func(BC7_TYPELESS) \ _Func(BC7_UNORM) \ _Func(BC7_UNORM_SRGB) \ _Func(EAC_R11_TYPELESS) \ _Func(EAC_R11_UNORM) \ _Func(EAC_R11_SNORM) \ _Func(EAC_RG11_TYPELESS) \ _Func(EAC_RG11_UNORM) \ _Func(EAC_RG11_SNORM) \ _Func(ETC2_TYPELESS) \ _Func(ETC2_UNORM) \ _Func(ETC2_UNORM_SRGB) \ _Func(ETC2A_TYPELESS) \ _Func(ETC2A_UNORM) \ _Func(ETC2A_UNORM_SRGB) \ _Func(PVRTC2_TYPELESS) \ _Func(PVRTC2_UNORM) \ _Func(PVRTC2_UNORM_SRGB) \ _Func(PVRTC4_TYPELESS) \ _Func(PVRTC4_UNORM) \ _Func(PVRTC4_UNORM_SRGB) \ _Func(ASTC_4x4_TYPELESS) \ _Func(ASTC_4x4_UNORM) \ _Func(ASTC_4x4_UNORM_SRGB) \ _Func(ASTC_5x4_TYPELESS) \ _Func(ASTC_5x4_UNORM) \ _Func(ASTC_5x4_UNORM_SRGB) \ _Func(ASTC_5x5_TYPELESS) \ _Func(ASTC_5x5_UNORM) \ _Func(ASTC_5x5_UNORM_SRGB) \ _Func(ASTC_6x5_TYPELESS) \ _Func(ASTC_6x5_UNORM) \ _Func(ASTC_6x5_UNORM_SRGB) \ _Func(ASTC_6x6_TYPELESS) \ _Func(ASTC_6x6_UNORM) \ _Func(ASTC_6x6_UNORM_SRGB) \ _Func(ASTC_8x5_TYPELESS) \ _Func(ASTC_8x5_UNORM) \ _Func(ASTC_8x5_UNORM_SRGB) \ _Func(ASTC_8x6_TYPELESS) \ _Func(ASTC_8x6_UNORM) \ _Func(ASTC_8x6_UNORM_SRGB) \ _Func(ASTC_8x8_TYPELESS) \ _Func(ASTC_8x8_UNORM) \ _Func(ASTC_8x8_UNORM_SRGB) \ _Func(ASTC_10x5_TYPELESS) \ _Func(ASTC_10x5_UNORM) \ _Func(ASTC_10x5_UNORM_SRGB) \ _Func(ASTC_10x6_TYPELESS) \ _Func(ASTC_10x6_UNORM) \ _Func(ASTC_10x6_UNORM_SRGB) \ _Func(ASTC_10x8_TYPELESS) \ _Func(ASTC_10x8_UNORM) \ _Func(ASTC_10x8_UNORM_SRGB) \ _Func(ASTC_10x10_TYPELESS) \ _Func(ASTC_10x10_UNORM) \ _Func(ASTC_10x10_UNORM_SRGB) \ _Func(ASTC_12x10_TYPELESS) \ _Func(ASTC_12x10_UNORM) \ _Func(ASTC_12x10_UNORM_SRGB) \ _Func(ASTC_12x12_TYPELESS) \ _Func(ASTC_12x12_UNORM) \ _Func(ASTC_12x12_UNORM_SRGB) #define DXGL_GI_FORMATS(_Func) \ DXGL_UNCOMPRESSED_GI_FORMATS(_Func) \ DXGL_COMPRESSED_GI_FORMATS(_Func) namespace NCryMetal { // Supported DXGI format identifiers enum EGIFormat { #define DXGL_GI_FORMAT(_FormatID) eGIF_ ## _FormatID #define _GI_FORMAT_ENUM_FUNC(_FormatID, ...) DXGL_GI_FORMAT(_FormatID), DXGL_GI_FORMATS(_GI_FORMAT_ENUM_FUNC) #undef _GI_FORMAT_ENUM_FUNC DXGL_GI_FORMAT(NUM) }; // Data types supported for DXGI format channels enum EGIChannelType { eGICT_UNUSED, // Not used by the format eGICT_UNORM, // Unsigned normalized integer (range linearly mapped to [0, 1]) eGICT_UINT, // Unsigned integer eGICT_FLOAT, // Floating point value eGICT_SNORM, // Signed normalized integer (range linearly mapped to [-1, 1]) eGICT_SINT, // Signed integer }; // Utility information about an uncompressed pixel format struct SUncompressedLayout { // Number of bits per pixel for the red, green, blue and alpha channels uint32 m_uRedBits; uint32 m_uGreenBits; uint32 m_uBlueBits; uint32 m_uAlphaBits; // Position for the red, green, blue and alpha channels within each pixel uint32 m_uRedShift; uint32 m_uGreenShift; uint32 m_uBlueShift; uint32 m_uAlphaShift; // The data type for the red, green, blue and alpha channels EGIChannelType m_eColorType; // Number of bits of the depth channel uint32 m_uDepthBits; // The data type for the depth channel EGIChannelType m_eDepthType; // Number of bits of the stencil channel uint32 m_uStencilBits; // The data type for the stencil channel EGIChannelType m_eStencilType; // Number of spare bits not used by the format layout uint32 m_uSpareBits; inline uint32 GetColorBits() const { return m_uRedBits + m_uGreenBits + m_uBlueBits + m_uAlphaBits; } inline uint32 GetDepthStencilBits() const { return m_uDepthBits + m_uStencilBits; } inline uint32 GetPixelBits() const { return GetColorBits() + GetDepthStencilBits() + m_uSpareBits; } inline uint32 GetPixelBytes() const { uint32 uPixelBits(GetPixelBits()); CRY_ASSERT(uPixelBits % 8 == 0); return uPixelBits >> 3; } }; // Identifies a set of swizzle modes for each color channel typedef uint16 TSwizzleMask; struct STextureFormat { // Tells if the image data is compressed bool m_bCompressed; // Tells if the the format assumes data in sRGB space bool m_bSRGB; // The size in pixels of a texture block (compression block if m_bCompressed is true, otherwise one pixel). uint32 m_uBlockWidth; uint32 m_uBlockHeight; uint32 m_uBlockDepth; // The size in bytes of a texture block (compression block if m_bCompressed is true, otherwise one pixel). uint32 m_uNumBlockBytes; // Confetti BEGIN: Igor Lobanchikov MTLPixelFormat m_eMetalFormat; MTLVertexFormat m_eMetalVertexFormat; // Confetti End: Igor Lobanchikov }; // Identifies the possible format conversion procedures available enum EGIFormatConversion { // A texture view is required to reinterpret the source format as the destination format eGIFC_TEXTURE_VIEW, // The depth channel of the source is mapped to the red channel of the destination eGIFC_DEPTH_TO_RED, // The stencil channel of the source is mapped to the red channel of the destination eGIFC_STENCIL_TO_RED, // The source format cannot be converted to the destination format eGIFC_UNSUPPORTED, // The source format can be used in place of the destination format without conversion eGIFC_NONE }; struct SGIFormatInfo { // Equivalent DXGI format DXGI_FORMAT m_eDXGIFormat; // Default supported usage mask for features/GL versions where support detection is not possible (union of D3D11_FORMAT_SUPPORT flags) uint32 m_uDefaultSupport; // Pointer to the texture information, or NULL if not a valid texture format const STextureFormat* m_pTexture; // Pointer to the uncompressed layout information, or NULL if compressed const SUncompressedLayout* m_pUncompressed; // Identifies the the compatible typeless format, or eGIF_NUM if no such format exists EGIFormat m_eTypelessFormat; // Describes how to convert to the compatible typeless format EGIFormatConversion m_eTypelessConversion; // The color channel swizzle modes required to map this format to the associated DXGI format TSwizzleMask m_uDXGISwizzleMask; }; extern const DXGI_FORMAT DXGI_FORMAT_INVALID; // Finds the DXGI format corresponding to the given EGIFormat value. // Returns DXGI_FORMAT_INVALID if the format was not found. DXGI_FORMAT GetDXGIFormat(EGIFormat eGIFormat); // Finds the DXGL EGIFormat value corresponding to the given DXGI_FORMAT. // Returns eGIF_NUM if the given format is not supported. EGIFormat GetGIFormat(DXGI_FORMAT eDXGIFormat); // Gets the global format information for the given EGIFormat const SGIFormatInfo* GetGIFormatInfo(EGIFormat eGIFormat); DXMETAL_TODO("Consider removing swizzling data from the texture format structure."); // Igor: Motivation: texture swizzling is not supported by Metal. However, some texture formats swizzling is differnet from // DX11 ones. It is possible swizzling control will be added to Metal in future. void SwizzleMaskToRGBA(TSwizzleMask uMask, int aiRGBA[4]); // Converts a combination of red, green, blue and alpha texture swizzle modes to a TSwizzleMask bool RGBAToSwizzleMask(const int aRGBA[4], TSwizzleMask& uMask); }; #endif //__GLFORMAT__