You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLFormat.hpp

356 lines
14 KiB
C++

/*
* 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"
// 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(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 NCryOpenGL
{
// 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());
assert(uPixelBits % 8 == 0);
return uPixelBits >> 3;
}
};
// Identifies a set of swizzle modes for each color channel
typedef uint16 TSwizzleMask;
struct STextureFormat
{
// The OpenGL image format used to store textures internally
GLint m_iInternalFormat;
// The OpenGL image format used at application level for pixel data
GLenum m_eBaseFormat;
// Tells if the image data is compressed
bool m_bCompressed;
// Tells if the the format assumes data in sRGB space
bool m_bSRGB;
// Native OpenGL pixel data type (not meaningful if m_bCompressed is true)
GLenum m_eDataType;
// 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;
};
// 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);
// Converts a TSwizzleMask to red, green, blue and alpha texture swizzle modes
void SwizzleMaskToRGBA(TSwizzleMask uMask, GLint aiRGBA[4]);
// Converts a combination of red, green, blue and alpha texture swizzle modes to a TSwizzleMask
bool RGBAToSwizzleMask(const GLint aRGBA[4], TSwizzleMask& uMask);
// Tries to match a valid image format for a given EGIFormat value and returns true on success
bool GetImageFormat(EGIFormat eGIFormat, GLenum* peImageFormat);
};
#endif //__GLFORMAT__