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.
609 lines
37 KiB
C++
609 lines
37 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 : Defines the required information about image formats used
|
|
// by DXGL as well as utility functions.
|
|
|
|
#include "RenderDll_precompiled.h"
|
|
#include <AzDXGIFormat.h>
|
|
|
|
#include "GLFormat.hpp"
|
|
|
|
namespace NCryOpenGL
|
|
{
|
|
#define NA UINT_MAX
|
|
|
|
#define DXGL_DXGI_FORMAT(_FormatID) DXGI_FORMAT_ ## _FormatID
|
|
#define DXGL_UNCOMPRESSED_LAYOUT(_FormatID) g_kUncompressedLayout_ ## _FormatID
|
|
#define DXGL_TEXTURE_FORMAT(_FormatID) g_kTextureFormat_ ## _FormatID
|
|
#define DXGL_GL_INTERNAL_FORMAT(_InternalID) GL ## _InternalID
|
|
#define DXGL_GI_CHANNEL_TYPE(_Type) eGICT_ ## _Type
|
|
|
|
#define _PTR_MAP(_Type) _Type ## PtrMap
|
|
#define _PTR_MAP_DEFAULT(_Type, _Enum, _Ptr) \
|
|
template <_Enum eValue> \
|
|
struct _PTR_MAP(_Type){static const _Type* ms_pPtr; }; \
|
|
template <_Enum eValue> \
|
|
const _Type * _PTR_MAP(_Type) < eValue > ::ms_pPtr = _Ptr;
|
|
#define _PTR_MAP_VALUE(_Type, _Value, _Ptr) \
|
|
template <> \
|
|
struct _PTR_MAP(_Type) < _Value > {static const _Type* ms_pPtr; }; \
|
|
const _Type* _PTR_MAP(_Type) < _Value > ::ms_pPtr = _Ptr;
|
|
|
|
#define _UINT_MAP(_Name) S ## _Name ## UintMap
|
|
#define _UINT_MAP_DEFAULT(_Name, _Enum, _UIntVal) \
|
|
template <_Enum eValue> \
|
|
struct _UINT_MAP(_Name){enum {VALUE = _UIntVal}; };
|
|
#define _UINT_MAP_VALUE(_Name, _Value, _UIntVal) \
|
|
template <> \
|
|
struct _UINT_MAP(_Name) < _Value > {enum {VALUE = _UIntVal}; };
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Uncompressed layouts for renderable formats
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
_PTR_MAP_DEFAULT(SUncompressedLayout, EGIFormat, NULL)
|
|
|
|
#define _UNCOMPR_LAY(_FormatID, _NumR, _NumG, _NumB, _NumA, _ShiftR, _ShiftG, _ShiftB, _ShiftA, _TypeRGBA, _Depth, _TypeD, _Stencil, _TypeS, _Spare) \
|
|
static const SUncompressedLayout DXGL_UNCOMPRESSED_LAYOUT(_FormatID) = \
|
|
{ \
|
|
_NumR, _NumG, _NumB, _NumA, \
|
|
_ShiftR, _ShiftG, _ShiftB, _ShiftA, \
|
|
DXGL_GI_CHANNEL_TYPE(_TypeRGBA), \
|
|
_Depth, DXGL_GI_CHANNEL_TYPE(_TypeD), \
|
|
_Stencil, DXGL_GI_CHANNEL_TYPE(_TypeS), \
|
|
_Spare \
|
|
}; \
|
|
_PTR_MAP_VALUE(SUncompressedLayout, DXGL_GI_FORMAT(_FormatID), &DXGL_UNCOMPRESSED_LAYOUT(_FormatID))
|
|
|
|
// | FORMAT_ID | RGBA_SIZES | RGBA_SHIFTS | RGBA | DEPTH | STENCIL | - |
|
|
// | | NR NG NB NA | SR SG SB SA | TYPE | N TYPE | N TYPE | X |
|
|
_UNCOMPR_LAY(R32G32B32A32_FLOAT, 32, 32, 32, 32, 0, 32, 64, 96, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32B32A32_UINT, 32, 32, 32, 32, 0, 32, 64, 96, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32B32A32_SINT, 32, 32, 32, 32, 0, 32, 64, 96, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32B32_FLOAT, 32, 32, 32, 0, 0, 32, 64, 96, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32B32_UINT, 32, 32, 32, 0, 0, 32, 64, 96, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32B32_SINT, 32, 32, 32, 0, 0, 32, 64, 96, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16B16A16_FLOAT, 16, 16, 16, 16, 0, 16, 32, 48, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16B16A16_UNORM, 16, 16, 16, 16, 0, 16, 32, 48, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16B16A16_UINT, 16, 16, 16, 16, 0, 16, 32, 48, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16B16A16_SNORM, 16, 16, 16, 16, 0, 16, 32, 48, SNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16B16A16_SINT, 16, 16, 16, 16, 0, 16, 32, 48, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32_FLOAT, 32, 32, 0, 0, 0, 32, NA, NA, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32_UINT, 32, 32, 0, 0, 0, 32, NA, NA, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32G32_SINT, 32, 32, 0, 0, 0, 32, NA, NA, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(D32_FLOAT_S8X24_UINT, 0, 0, 0, 0, NA, NA, NA, NA, UNUSED, 32, FLOAT, 8, UINT, 24)
|
|
_UNCOMPR_LAY(R10G10B10A2_UNORM, 10, 10, 10, 2, 0, 10, 20, 30, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R10G10B10A2_UINT, 10, 10, 10, 2, 0, 10, 20, 30, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R11G11B10_FLOAT, 11, 11, 10, 0, 0, 11, 22, NA, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8B8A8_UNORM, 8, 8, 8, 8, 0, 8, 16, 24, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8B8A8_UNORM_SRGB, 8, 8, 8, 8, 0, 8, 16, 24, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8B8A8_UINT, 8, 8, 8, 8, 0, 8, 16, 24, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8B8A8_SNORM, 8, 8, 8, 8, 0, 8, 16, 24, SNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8B8A8_SINT, 8, 8, 8, 8, 0, 8, 16, 24, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16_FLOAT, 16, 16, 0, 0, 0, 16, NA, NA, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16_UNORM, 16, 16, 0, 0, 0, 16, NA, NA, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16_UINT, 16, 16, 0, 0, 0, 16, NA, NA, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16_SNORM, 16, 16, 0, 0, 0, 16, NA, NA, SNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16G16_SINT, 16, 16, 0, 0, 0, 16, NA, NA, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(D32_FLOAT, 0, 0, 0, 0, NA, NA, NA, NA, UNUSED, 32, FLOAT, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32_FLOAT, 32, 0, 0, 0, 0, NA, NA, NA, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32_UINT, 32, 0, 0, 0, 0, NA, NA, NA, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R32_SINT, 32, 0, 0, 0, 0, NA, NA, NA, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(D24_UNORM_S8_UINT, 0, 0, 0, 0, NA, NA, NA, NA, UNUSED, 24, UNORM, 8, UINT, 0)
|
|
_UNCOMPR_LAY(R24_UNORM_X8_TYPELESS, 24, 0, 0, 0, NA, NA, NA, NA, UNORM, 0, UNUSED, 0, UNUSED, 8)
|
|
_UNCOMPR_LAY(R8G8_UNORM, 8, 8, 0, 0, 0, 8, NA, NA, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8_UINT, 8, 8, 0, 0, 0, 8, NA, NA, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8_SNORM, 8, 8, 0, 0, 0, 8, NA, NA, SNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8G8_SINT, 8, 8, 0, 0, 0, 8, NA, NA, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16_FLOAT, 16, 0, 0, 0, 0, NA, NA, NA, FLOAT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(D16_UNORM, 0, 0, 0, 0, NA, NA, NA, NA, UNUSED, 16, UNORM, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16_UNORM, 16, 0, 0, 0, 0, NA, NA, NA, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16_UINT, 16, 0, 0, 0, 0, NA, NA, NA, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16_SNORM, 16, 0, 0, 0, 0, NA, NA, NA, SNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R16_SINT, 16, 0, 0, 0, 0, NA, NA, NA, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8_UNORM, 8, 0, 0, 0, 0, NA, NA, NA, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8_UINT, 8, 0, 0, 0, 0, NA, NA, NA, UINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8_SNORM, 8, 0, 0, 0, 0, NA, NA, NA, SNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(R8_SINT, 8, 0, 0, 0, 0, NA, NA, NA, SINT, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(A8_UNORM, 0, 0, 0, 8, NA, NA, NA, 0, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(B5G6R5_UNORM, 5, 6, 5, 0, 11, 5, 0, NA, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(B5G5R5A1_UNORM, 5, 5, 5, 1, 10, 5, 0, 15, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(B8G8R8A8_UNORM, 8, 8, 8, 8, 16, 8, 0, 24, UNORM, 0, UNUSED, 0, UNUSED, 0)
|
|
_UNCOMPR_LAY(B8G8R8X8_UNORM, 8, 8, 8, 0, 16, 8, 0, NA, UNORM, 0, UNUSED, 0, UNUSED, 8)
|
|
|
|
#undef _UNCOMPR_LAY
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Swizzle required to map each texture format to the corresponding DXGI format
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define DXGL_SWIZZLE_RED 0
|
|
#define DXGL_SWIZZLE_GREEN 1
|
|
#define DXGL_SWIZZLE_BLUE 2
|
|
#define DXGL_SWIZZLE_ALPHA 3
|
|
#define DXGL_SWIZZLE_ZERO 4
|
|
#define DXGL_SWIZZLE_ONE 5
|
|
#define _SWIZZLE_MASK(_Red, _Green, _Blue, _Alpha) \
|
|
DXGL_SWIZZLE_ ## _Red << 9 | \
|
|
DXGL_SWIZZLE_ ## _Green << 6 | \
|
|
DXGL_SWIZZLE_ ## _Blue << 3 | \
|
|
DXGL_SWIZZLE_ ## _Alpha
|
|
|
|
_UINT_MAP_DEFAULT(DXGITextureSwizzle, TSwizzleMask, _SWIZZLE_MASK(RED, GREEN, BLUE, ALPHA))
|
|
#define _DXGI_TEX_SWIZZLE(_FormatID, _Red, _Green, _Blue, _Alpha) _UINT_MAP_VALUE(DXGITextureSwizzle, DXGL_GI_FORMAT(_FormatID), _SWIZZLE_MASK(_Red, _Green, _Blue, _Alpha))
|
|
_DXGI_TEX_SWIZZLE(A8_UNORM, ZERO, ZERO, ZERO, RED)
|
|
#if DXGLES
|
|
_DXGI_TEX_SWIZZLE(B8G8R8A8_UNORM, BLUE, GREEN, RED, ALPHA)
|
|
_DXGI_TEX_SWIZZLE(B8G8R8X8_UNORM, BLUE, GREEN, RED, ALPHA)
|
|
_DXGI_TEX_SWIZZLE(B8G8R8A8_UNORM_SRGB, BLUE, GREEN, RED, ALPHA)
|
|
_DXGI_TEX_SWIZZLE(B8G8R8X8_UNORM_SRGB, BLUE, GREEN, RED, ALPHA)
|
|
#endif
|
|
#undef _DXGI_TEX_SWIZZLE
|
|
#undef _SWIZZLE_MASK
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Texturable formats (split between uncompressed and compressed)
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
_PTR_MAP_DEFAULT(STextureFormat, EGIFormat, NULL)
|
|
|
|
#define _TEX(_FormatID, _GLInternalFormat, _GLBaseFormat, _Compressed, _GLType, _BlockWidth, _BlockHeight, _BlockDepth, _NumBlockBytes, _SRGB) \
|
|
static const STextureFormat DXGL_TEXTURE_FORMAT(_FormatID) = \
|
|
{ \
|
|
_GLInternalFormat, \
|
|
_GLBaseFormat, \
|
|
_Compressed, \
|
|
_SRGB, \
|
|
_GLType, \
|
|
_BlockWidth, \
|
|
_BlockHeight, \
|
|
_BlockDepth, \
|
|
_NumBlockBytes \
|
|
}; \
|
|
_PTR_MAP_VALUE(STextureFormat, DXGL_GI_FORMAT(_FormatID), &DXGL_TEXTURE_FORMAT(_FormatID))
|
|
|
|
#define _UNCOMPR_TEX(_FormatID, _GLInternalFormat, _GLBaseFormat, _GLType, _SRGB, _Bytes) _TEX(_FormatID, _GLInternalFormat, _GLBaseFormat, false, _GLType, 1, 1, 1, _Bytes, _SRGB)
|
|
#define _COMPR_TEX(_FormatID, _GLInternalFormat, _GLBaseFormat, _BlockWidth, _BlockHeight, _BlockDepth, _NumBlockBytes, _SRGB) _TEX(_FormatID, _GLInternalFormat, _GLBaseFormat, true, 0, _BlockWidth, _BlockHeight, _BlockDepth, _NumBlockBytes, _SRGB)
|
|
|
|
// | FORMAT_ID | GL_INTERNAL_FORMAT | GL_FORMAT | GL_TYPE | SRGB | BYTES |
|
|
_UNCOMPR_TEX(R32G32B32A32_FLOAT, GL_RGBA32F, GL_RGBA, GL_FLOAT, false, 16)
|
|
_UNCOMPR_TEX(R32G32B32A32_UINT, GL_RGBA32UI, GL_RGBA, GL_UNSIGNED_INT, false, 16)
|
|
_UNCOMPR_TEX(R32G32B32A32_SINT, GL_RGBA32I, GL_RGBA, GL_INT, false, 16)
|
|
_UNCOMPR_TEX(R32G32B32_FLOAT, GL_RGB32F, GL_RGB, GL_FLOAT, false, 12)
|
|
_UNCOMPR_TEX(R32G32B32_UINT, GL_RGB32UI, GL_RGB, GL_UNSIGNED_INT, false, 12)
|
|
_UNCOMPR_TEX(R32G32B32_SINT, GL_RGB32I, GL_RGB, GL_INT, false, 12)
|
|
_UNCOMPR_TEX(R16G16B16A16_FLOAT, GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, false, 8)
|
|
#if DXGLES
|
|
_UNCOMPR_TEX(R16G16B16A16_UNORM, GL_RGBA16UI, GL_RGBA, GL_UNSIGNED_SHORT, false, 8)
|
|
#else
|
|
_UNCOMPR_TEX(R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA, GL_UNSIGNED_SHORT, false, 8)
|
|
#endif
|
|
_UNCOMPR_TEX(R16G16B16A16_UINT, GL_RGBA16UI, GL_RGBA, GL_UNSIGNED_SHORT, false, 8)
|
|
#if !DXGLES
|
|
_UNCOMPR_TEX(R16G16B16A16_SNORM, GL_RGBA16_SNORM, GL_RGBA, GL_SHORT, false, 8)
|
|
#else
|
|
_UNCOMPR_TEX(R16G16B16A16_SNORM, GL_NONE, GL_RGBA, GL_SHORT, false, 8)
|
|
#endif
|
|
_UNCOMPR_TEX(R16G16B16A16_SINT, GL_RGBA16I, GL_RGBA, GL_SHORT, false, 8)
|
|
_UNCOMPR_TEX(R32G32_FLOAT, GL_RG32F, GL_RG, GL_FLOAT, false, 8)
|
|
_UNCOMPR_TEX(R32G32_UINT, GL_RG32UI, GL_RG, GL_UNSIGNED_INT, false, 8)
|
|
_UNCOMPR_TEX(R32G32_SINT, GL_RG32I, GL_RG, GL_INT, false, 8)
|
|
_UNCOMPR_TEX(D32_FLOAT_S8X24_UINT, GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, false, 8)
|
|
#if DXGLES
|
|
_UNCOMPR_TEX(R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, false, 4)
|
|
_UNCOMPR_TEX(R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, false, 4)
|
|
#else
|
|
_UNCOMPR_TEX(R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_10_10_10_2, false, 4)
|
|
_UNCOMPR_TEX(R10G10B10A2_UINT, GL_RGB10_A2UI, GL_RGBA, GL_UNSIGNED_INT_10_10_10_2, false, 4)
|
|
#endif
|
|
_UNCOMPR_TEX(R11G11B10_FLOAT, GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, false, 4)
|
|
_UNCOMPR_TEX(R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false, 4)
|
|
_UNCOMPR_TEX(R8G8B8A8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, true, 4)
|
|
_UNCOMPR_TEX(R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA, GL_UNSIGNED_BYTE, false, 4)
|
|
_UNCOMPR_TEX(R8G8B8A8_SNORM, GL_RGBA8_SNORM, GL_RGBA, GL_BYTE, false, 4)
|
|
_UNCOMPR_TEX(R8G8B8A8_SINT, GL_RGBA8I, GL_RGBA, GL_BYTE, false, 4)
|
|
_UNCOMPR_TEX(R16G16_FLOAT, GL_RG16F, GL_RG, GL_HALF_FLOAT, false, 4)
|
|
#if DXGLES
|
|
// https://www.khronos.org/opengles/sdk/docs/man3/html/glRenderbufferStorage.xhtml
|
|
// GL ES Can't convert to a render target with a different internal format... Framebuffer will error to "incomplete" if so
|
|
_UNCOMPR_TEX(R16G16_UNORM, GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT, false, 4)
|
|
#else
|
|
_UNCOMPR_TEX(R16G16_UNORM, GL_RG16, GL_RG, GL_UNSIGNED_SHORT, false, 4)
|
|
#endif
|
|
_UNCOMPR_TEX(R16G16_UINT, GL_RG16UI, GL_RG, GL_UNSIGNED_SHORT, false, 4)
|
|
_UNCOMPR_TEX(R16G16_SINT, GL_RG16I, GL_RG, GL_SHORT, false, 4)
|
|
_UNCOMPR_TEX(D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, false, 4)
|
|
_UNCOMPR_TEX(R32_FLOAT, GL_R32F, GL_RED, GL_FLOAT, false, 4)
|
|
_UNCOMPR_TEX(R32_UINT, GL_R32UI, GL_RED, GL_UNSIGNED_INT, false, 4)
|
|
_UNCOMPR_TEX(R32_SINT, GL_R32I, GL_RED, GL_INT, false, 4)
|
|
_UNCOMPR_TEX(D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, false, 4)
|
|
_UNCOMPR_TEX(R8G8_UNORM, GL_RG8, GL_RG, GL_UNSIGNED_BYTE, false, 2)
|
|
_UNCOMPR_TEX(R8G8_UINT, GL_RG8UI, GL_RG, GL_UNSIGNED_BYTE, false, 2)
|
|
_UNCOMPR_TEX(R8G8_SNORM, GL_RG8_SNORM, GL_RG, GL_BYTE, false, 2)
|
|
_UNCOMPR_TEX(R8G8_SINT, GL_RG8I, GL_RG, GL_BYTE, false, 2)
|
|
_UNCOMPR_TEX(R16_FLOAT, GL_R16F, GL_RED, GL_HALF_FLOAT, false, 2)
|
|
_UNCOMPR_TEX(D16_UNORM, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, false, 2)
|
|
#if DXGLES
|
|
_UNCOMPR_TEX(R16_UNORM, GL_R16UI, GL_RED, GL_UNSIGNED_SHORT, false, 2)
|
|
#else
|
|
_UNCOMPR_TEX(R16_UNORM, GL_R16, GL_RED, GL_UNSIGNED_SHORT, false, 2)
|
|
#endif
|
|
_UNCOMPR_TEX(R16_UINT, GL_R16UI, GL_RED, GL_UNSIGNED_SHORT, false, 2)
|
|
_UNCOMPR_TEX(R16_SINT, GL_R16I, GL_RED, GL_SHORT, false, 2)
|
|
_UNCOMPR_TEX(R8_UNORM, GL_R8, GL_RED, GL_UNSIGNED_BYTE, false, 1)
|
|
_UNCOMPR_TEX(R8_UINT, GL_R8UI, GL_RED, GL_UNSIGNED_BYTE, false, 1)
|
|
_UNCOMPR_TEX(R8_SNORM, GL_R8_SNORM, GL_RED, GL_BYTE, false, 1)
|
|
_UNCOMPR_TEX(R8_SINT, GL_R8I, GL_RED, GL_BYTE, false, 1)
|
|
_UNCOMPR_TEX(A8_UNORM, GL_R8, GL_RED, GL_UNSIGNED_BYTE, false, 1)
|
|
_UNCOMPR_TEX(R9G9B9E5_SHAREDEXP, GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, false, 4)
|
|
|
|
#if DXGLES
|
|
_UNCOMPR_TEX(B8G8R8A8_UNORM, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false, 4)
|
|
_UNCOMPR_TEX(B8G8R8A8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, true, 4)
|
|
_UNCOMPR_TEX(B8G8R8X8_UNORM, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, false, 4)
|
|
_UNCOMPR_TEX(B8G8R8X8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE, true, 4)
|
|
#else
|
|
_UNCOMPR_TEX(B8G8R8A8_UNORM, GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE, false, 4)
|
|
_UNCOMPR_TEX(B8G8R8A8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE, true, 4)
|
|
_UNCOMPR_TEX(B8G8R8X8_UNORM, GL_RGBA8, GL_BGRA, GL_UNSIGNED_BYTE, false, 4)
|
|
_UNCOMPR_TEX(B8G8R8X8_UNORM_SRGB, GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE, true, 4)
|
|
#endif
|
|
|
|
#if !DXGLES
|
|
_UNCOMPR_TEX(B5G6R5_UNORM, GL_RGB565, GL_BGR, GL_UNSIGNED_SHORT_5_6_5_REV, false, 2)
|
|
_UNCOMPR_TEX(B5G5R5A1_UNORM, GL_RGB5_A1, GL_BGRA, GL_UNSIGNED_SHORT_5_5_5_1, false, 2)
|
|
_UNCOMPR_TEX(R16_SNORM, GL_R16_SNORM, GL_RED, GL_SHORT, false, 2)
|
|
_UNCOMPR_TEX(R16G16_SNORM, GL_RG16_SNORM, GL_RG, GL_SHORT, false, 4)
|
|
#endif
|
|
|
|
// | FORMAT_ID | GL_INTERNAL_FORMAT | GL_FORMAT | BLOCK | SRGB |
|
|
// | | | | X | Y | Z | BYTES | |
|
|
#if DXGL_SUPPORT_ETC2_EAC_COMPRESSION
|
|
_COMPR_TEX(EAC_R11_UNORM, GL_COMPRESSED_R11_EAC, GL_RED, 4, 4, 1, 8, false)
|
|
_COMPR_TEX(EAC_R11_SNORM, GL_COMPRESSED_SIGNED_R11_EAC, GL_RED, 4, 4, 1, 8, false)
|
|
_COMPR_TEX(EAC_RG11_UNORM, GL_COMPRESSED_RG11_EAC, GL_RG, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(EAC_RG11_SNORM, GL_COMPRESSED_SIGNED_RG11_EAC, GL_RG, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(ETC2_UNORM, GL_COMPRESSED_RGB8_ETC2, GL_RGB, 4, 4, 1, 8, false)
|
|
_COMPR_TEX(ETC2_UNORM_SRGB, GL_COMPRESSED_SRGB8_ETC2, GL_RGB, 4, 4, 1, 8, true)
|
|
_COMPR_TEX(ETC2A_UNORM, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_RGBA, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(ETC2A_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_RGBA, 4, 4, 1, 16, true)
|
|
#endif //DXGL_SUPPORT_ETC2_EAC_COMPRESSION
|
|
#if DXGL_SUPPORT_S3TC_TEXTURES
|
|
_COMPR_TEX(BC1_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_RGBA, 4, 4, 1, 8, false)
|
|
_COMPR_TEX(BC1_UNORM_SRGB, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_RGBA, 4, 4, 1, 8, true)
|
|
_COMPR_TEX(BC2_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(BC2_UNORM_SRGB, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_RGBA, 4, 4, 1, 16, true)
|
|
_COMPR_TEX(BC3_UNORM, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(BC3_UNORM_SRGB, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_RGBA, 4, 4, 1, 16, true)
|
|
#endif //DXGL_SUPPORT_S3TC_TEXTURES
|
|
#if !DXGLES
|
|
_COMPR_TEX(BC4_UNORM, GL_COMPRESSED_RED_RGTC1, GL_RED, 4, 4, 1, 8, false)
|
|
_COMPR_TEX(BC4_SNORM, GL_COMPRESSED_SIGNED_RED_RGTC1, GL_RED, 4, 4, 1, 8, false)
|
|
_COMPR_TEX(BC5_UNORM, GL_COMPRESSED_RG_RGTC2, GL_RG, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(BC5_SNORM, GL_COMPRESSED_SIGNED_RG_RGTC2, GL_RG, 4, 4, 1, 16, false)
|
|
#if DXGL_SUPPORT_BPTC
|
|
_COMPR_TEX(BC6H_UF16, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB, GL_RGB, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(BC6H_SF16, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB, GL_RGB, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(BC7_UNORM, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB, GL_RGBA, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(BC7_UNORM_SRGB, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB, GL_RGBA, 4, 4, 1, 16, true)
|
|
#endif //DXGL_SUPPORT_BPTC
|
|
#endif //!DXGLES
|
|
// | FORMAT_ID | GL_INTERNAL_FORMAT | GL_FORMAT | BLOCK | SRGB |
|
|
// | | | | X | Y | Z | BYTES | |
|
|
#if defined(ANDROID) && DXGLES
|
|
_COMPR_TEX(ASTC_4x4_UNORM, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_RGBA, 4, 4, 1, 16, false)
|
|
_COMPR_TEX(ASTC_4x4_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_RGBA, 4, 4, 1, 16, true)
|
|
_COMPR_TEX(ASTC_5x4_UNORM, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, GL_RGBA, 5, 4, 1, 16, false)
|
|
_COMPR_TEX(ASTC_5x4_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, GL_RGBA, 5, 4, 1, 16, true)
|
|
_COMPR_TEX(ASTC_5x5_UNORM, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_RGBA, 5, 5, 1, 16, false)
|
|
_COMPR_TEX(ASTC_5x5_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_RGBA, 5, 5, 1, 16, true)
|
|
_COMPR_TEX(ASTC_6x5_UNORM, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, GL_RGBA, 6, 5, 1, 16, false)
|
|
_COMPR_TEX(ASTC_6x5_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, GL_RGBA, 6, 5, 1, 16, true)
|
|
_COMPR_TEX(ASTC_6x6_UNORM, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_RGBA, 6, 6, 1, 16, false)
|
|
_COMPR_TEX(ASTC_6x6_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_RGBA, 6, 6, 1, 16, true)
|
|
_COMPR_TEX(ASTC_8x5_UNORM, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, GL_RGBA, 8, 5, 1, 16, false)
|
|
_COMPR_TEX(ASTC_8x5_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, GL_RGBA, 8, 5, 1, 16, true)
|
|
_COMPR_TEX(ASTC_8x6_UNORM, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_RGBA, 8, 6, 1, 16, false)
|
|
_COMPR_TEX(ASTC_8x6_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_RGBA, 8, 6, 1, 16, true)
|
|
_COMPR_TEX(ASTC_8x8_UNORM, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, GL_RGBA, 8, 8, 1, 16, false)
|
|
_COMPR_TEX(ASTC_8x8_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, GL_RGBA, 8, 8, 1, 16, true)
|
|
_COMPR_TEX(ASTC_10x5_UNORM, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_RGBA, 10, 5, 1, 16, false)
|
|
_COMPR_TEX(ASTC_10x5_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_RGBA, 10, 5, 1, 16, true)
|
|
_COMPR_TEX(ASTC_10x6_UNORM, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, GL_RGBA, 10, 6, 1, 16, false)
|
|
_COMPR_TEX(ASTC_10x6_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, GL_RGBA, 10, 6, 1, 16, true)
|
|
_COMPR_TEX(ASTC_10x8_UNORM, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_RGBA, 10, 8, 1, 16, false)
|
|
_COMPR_TEX(ASTC_10x8_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_RGBA, 10, 8, 1, 16, true)
|
|
_COMPR_TEX(ASTC_10x10_UNORM, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, GL_RGBA, 10, 10, 1, 16, false)
|
|
_COMPR_TEX(ASTC_10x10_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_RGBA, 10, 10, 1, 16, true)
|
|
_COMPR_TEX(ASTC_12x10_UNORM, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_RGBA, 12, 10, 1, 16, false)
|
|
_COMPR_TEX(ASTC_12x10_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_RGBA, 12, 10, 1, 16, true)
|
|
_COMPR_TEX(ASTC_12x12_UNORM, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, GL_RGBA, 12, 12, 1, 16, false)
|
|
_COMPR_TEX(ASTC_12x12_UNORM_SRGB, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_RGBA, 12, 12, 1, 16, true)
|
|
#endif
|
|
|
|
#undef _TEX
|
|
#undef _UNCOMPR_TEX
|
|
#undef _COMPR_TEX
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Default support for each format
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
_UINT_MAP_DEFAULT(DefaultSupport, EGIFormat, 0)
|
|
|
|
#define _SUPPORT(_FormatID, _Mask) _UINT_MAP_VALUE(DefaultSupport, DXGL_GI_FORMAT(_FormatID), _Mask)
|
|
|
|
DXGL_TODO("Add here hardcoded default support masks (see _SUPPORT) for each format to use when format queries are not supported and for particular features")
|
|
|
|
#undef _SUPPORT
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Typeless format mappings
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
_UINT_MAP_DEFAULT(TypelessFormat, EGIFormat, eGIF_NUM)
|
|
_UINT_MAP_DEFAULT(TypelessConversion, EGIFormat, eGIFC_UNSUPPORTED)
|
|
|
|
#define _TYPED_CONVERT(_FormatID, _TypelessID, _Conversion) \
|
|
_UINT_MAP_VALUE(TypelessFormat, DXGL_GI_FORMAT(_FormatID), DXGL_GI_FORMAT(_TypelessID)) \
|
|
_UINT_MAP_VALUE(TypelessConversion, DXGL_GI_FORMAT(_FormatID), eGIFC_ ## _Conversion)
|
|
#define _TYPED_DEFAULT(_FormatID, _TypelessID) \
|
|
_PTR_MAP_VALUE(STextureFormat, DXGL_GI_FORMAT(_TypelessID), &DXGL_TEXTURE_FORMAT(_FormatID)) \
|
|
_PTR_MAP_VALUE(SUncompressedLayout, DXGL_GI_FORMAT(_TypelessID), _PTR_MAP(SUncompressedLayout) < DXGL_GI_FORMAT(_FormatID) > ::ms_pPtr) \
|
|
_TYPED_CONVERT(_FormatID, _TypelessID, NONE)
|
|
|
|
_TYPED_DEFAULT(R32G32B32A32_FLOAT, R32G32B32A32_TYPELESS)
|
|
_TYPED_CONVERT(R32G32B32A32_UINT, R32G32B32A32_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R32G32B32A32_SINT, R32G32B32A32_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(R32G32B32_FLOAT, R32G32B32_TYPELESS)
|
|
_TYPED_CONVERT(R32G32B32_UINT, R32G32B32_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R32G32B32_SINT, R32G32B32_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(R16G16B16A16_FLOAT, R16G16B16A16_TYPELESS)
|
|
_TYPED_CONVERT(R16G16B16A16_UNORM, R16G16B16A16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R16G16B16A16_UINT, R16G16B16A16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R16G16B16A16_SNORM, R16G16B16A16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R16G16B16A16_SINT, R16G16B16A16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(R32G32_FLOAT, R32G32_TYPELESS)
|
|
_TYPED_CONVERT(R32G32_UINT, R32G32_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R32G32_SINT, R32G32_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(D32_FLOAT_S8X24_UINT, R32G8X24_TYPELESS)
|
|
_TYPED_CONVERT(R32_FLOAT_X8X24_TYPELESS, R32G8X24_TYPELESS, DEPTH_TO_RED)
|
|
_TYPED_CONVERT(X32_TYPELESS_G8X24_UINT, R32G8X24_TYPELESS, STENCIL_TO_RED)
|
|
_TYPED_DEFAULT(R10G10B10A2_UNORM, R10G10B10A2_TYPELESS)
|
|
_TYPED_CONVERT(R10G10B10A2_UINT, R10G10B10A2_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(R8G8B8A8_UNORM, R8G8B8A8_TYPELESS)
|
|
_TYPED_CONVERT(R8G8B8A8_UNORM_SRGB, R8G8B8A8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R8G8B8A8_UINT, R8G8B8A8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R8G8B8A8_SNORM, R8G8B8A8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R8G8B8A8_SINT, R8G8B8A8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(R16G16_FLOAT, R16G16_TYPELESS)
|
|
_TYPED_CONVERT(R16G16_UNORM, R16G16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R16G16_UINT, R16G16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R16G16_SNORM, R16G16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R16G16_SINT, R16G16_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(D32_FLOAT, R32_TYPELESS)
|
|
_TYPED_CONVERT(R32_FLOAT, R32_TYPELESS, DEPTH_TO_RED)
|
|
_TYPED_DEFAULT(D24_UNORM_S8_UINT, R24G8_TYPELESS)
|
|
_TYPED_CONVERT(R24_UNORM_X8_TYPELESS, R24G8_TYPELESS, DEPTH_TO_RED)
|
|
_TYPED_CONVERT(X24_TYPELESS_G8_UINT, R24G8_TYPELESS, STENCIL_TO_RED)
|
|
_TYPED_DEFAULT(R8G8_UNORM, R8G8_TYPELESS)
|
|
_TYPED_CONVERT(R8G8_UINT, R8G8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R8G8_SNORM, R8G8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R8G8_SINT, R8G8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(D16_UNORM, R16_TYPELESS)
|
|
_TYPED_CONVERT(R16_UNORM, R16_TYPELESS, DEPTH_TO_RED)
|
|
_TYPED_DEFAULT(R8_UNORM, R8_TYPELESS)
|
|
_TYPED_CONVERT(R8_UINT, R8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R8_SNORM, R8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_CONVERT(R8_SINT, R8_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(B8G8R8A8_UNORM, B8G8R8A8_TYPELESS)
|
|
_TYPED_CONVERT(B8G8R8A8_UNORM_SRGB, B8G8R8A8_TYPELESS, TEXTURE_VIEW)
|
|
#if DXGL_SUPPORT_ETC2_EAC_COMPRESSION
|
|
_TYPED_DEFAULT(EAC_R11_UNORM, EAC_R11_TYPELESS)
|
|
_TYPED_CONVERT(EAC_R11_SNORM, EAC_R11_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(EAC_RG11_UNORM, EAC_RG11_TYPELESS)
|
|
_TYPED_CONVERT(EAC_RG11_SNORM, EAC_RG11_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(ETC2_UNORM, ETC2_TYPELESS)
|
|
_TYPED_CONVERT(ETC2_UNORM_SRGB, ETC2_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(ETC2A_UNORM, ETC2A_TYPELESS)
|
|
_TYPED_CONVERT(ETC2A_UNORM_SRGB, ETC2A_TYPELESS, TEXTURE_VIEW)
|
|
#endif
|
|
_TYPED_DEFAULT(B8G8R8X8_UNORM, B8G8R8X8_TYPELESS)
|
|
_TYPED_CONVERT(B8G8R8X8_UNORM_SRGB, B8G8R8X8_TYPELESS, TEXTURE_VIEW)
|
|
#if DXGL_SUPPORT_S3TC_TEXTURES
|
|
_TYPED_DEFAULT(BC1_UNORM, BC1_TYPELESS)
|
|
_TYPED_CONVERT(BC1_UNORM_SRGB, BC1_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(BC2_UNORM, BC2_TYPELESS)
|
|
_TYPED_CONVERT(BC2_UNORM_SRGB, BC2_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(BC3_UNORM, BC3_TYPELESS)
|
|
_TYPED_CONVERT(BC3_UNORM_SRGB, BC3_TYPELESS, TEXTURE_VIEW)
|
|
#endif //DXGL_SUPPORT_S3TC_TEXTURES
|
|
#if !DXGLES
|
|
_TYPED_DEFAULT(BC4_UNORM, BC4_TYPELESS)
|
|
_TYPED_CONVERT(BC4_SNORM, BC4_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(BC5_UNORM, BC5_TYPELESS)
|
|
_TYPED_CONVERT(BC5_SNORM, BC5_TYPELESS, TEXTURE_VIEW)
|
|
#if DXGL_SUPPORT_BPTC
|
|
_TYPED_DEFAULT(BC6H_UF16, BC6H_TYPELESS)
|
|
_TYPED_CONVERT(BC6H_SF16, BC6H_TYPELESS, TEXTURE_VIEW)
|
|
_TYPED_DEFAULT(BC7_UNORM, BC7_TYPELESS)
|
|
_TYPED_CONVERT(BC7_UNORM_SRGB, BC7_TYPELESS, TEXTURE_VIEW)
|
|
#endif //DXGL_SUPPORT_BPTC
|
|
#endif //!DXGLES
|
|
|
|
#undef _TYPED_DEFAULT
|
|
#undef _TYPED_CONVERT
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Format information accessors
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static SGIFormatInfo g_akFormatInfo[] =
|
|
{
|
|
#define _FORMAT_INFO(_FormatID) \
|
|
{ \
|
|
DXGL_DXGI_FORMAT(_FormatID), \
|
|
_UINT_MAP(DefaultSupport) < DXGL_GI_FORMAT(_FormatID) > ::VALUE, \
|
|
_PTR_MAP(STextureFormat) < DXGL_GI_FORMAT(_FormatID) > ::ms_pPtr, \
|
|
_PTR_MAP(SUncompressedLayout) < DXGL_GI_FORMAT(_FormatID) > ::ms_pPtr, \
|
|
static_cast<EGIFormat>(_UINT_MAP(TypelessFormat) < DXGL_GI_FORMAT(_FormatID) > ::VALUE), \
|
|
static_cast<EGIFormatConversion>(_UINT_MAP(TypelessConversion) < DXGL_GI_FORMAT(_FormatID) > ::VALUE), \
|
|
_UINT_MAP(DXGITextureSwizzle) < DXGL_GI_FORMAT(_FormatID) > ::VALUE, \
|
|
},
|
|
|
|
DXGL_GI_FORMATS(_FORMAT_INFO)
|
|
|
|
#undef _FORMAT_INFO
|
|
};
|
|
|
|
const SGIFormatInfo* GetGIFormatInfo(EGIFormat eGIFormat)
|
|
{
|
|
assert(eGIFormat < eGIF_NUM);
|
|
return &g_akFormatInfo[eGIFormat];
|
|
}
|
|
|
|
DXGI_FORMAT GetDXGIFormat(EGIFormat eGIFormat)
|
|
{
|
|
const SGIFormatInfo* pFormatInfo(GetGIFormatInfo(eGIFormat));
|
|
return (pFormatInfo == NULL) ? DXGI_FORMAT_INVALID : pFormatInfo->m_eDXGIFormat;
|
|
}
|
|
|
|
EGIFormat GetGIFormat(DXGI_FORMAT eDXGIFormat)
|
|
{
|
|
switch (eDXGIFormat)
|
|
{
|
|
#define _FORMAT_CASE(_FormatID, ...) \
|
|
case DXGL_DXGI_FORMAT(_FormatID): \
|
|
return DXGL_GI_FORMAT(_FormatID);
|
|
|
|
DXGL_GI_FORMATS(_FORMAT_CASE)
|
|
#undef _FORMAT_CASE
|
|
|
|
default:
|
|
return eGIF_NUM;
|
|
}
|
|
}
|
|
|
|
#undef _PTR_MAP_VALUE
|
|
#undef _PTR_MAP_DEFAULT
|
|
#undef _PTR_MAP
|
|
#undef _UINT_MAP_VALUE
|
|
#undef _UINT_MAP_DEFAULT
|
|
#undef _UINT_MAP
|
|
|
|
#undef DXGL_DXGI_FORMAT
|
|
#undef DXGL_UNCOMPRESSED_LAYOUT
|
|
#undef DXGL_TEXTURE_FORMAT
|
|
#undef DXGL_GL_INTERNAL_FORMAT
|
|
#undef DXGL_GI_CHANNEL_TYPE
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Texture swizzle encoding
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void SwizzleMaskToRGBA(TSwizzleMask uMask, GLint aiRGBA[4])
|
|
{
|
|
uint32 uChannel(4);
|
|
while (uChannel--)
|
|
{
|
|
switch (uMask & 7)
|
|
{
|
|
case DXGL_SWIZZLE_RED:
|
|
aiRGBA[uChannel] = GL_RED;
|
|
break;
|
|
case DXGL_SWIZZLE_GREEN:
|
|
aiRGBA[uChannel] = GL_GREEN;
|
|
break;
|
|
case DXGL_SWIZZLE_BLUE:
|
|
aiRGBA[uChannel] = GL_BLUE;
|
|
break;
|
|
case DXGL_SWIZZLE_ALPHA:
|
|
aiRGBA[uChannel] = GL_ALPHA;
|
|
break;
|
|
case DXGL_SWIZZLE_ZERO:
|
|
aiRGBA[uChannel] = GL_ZERO;
|
|
break;
|
|
case DXGL_SWIZZLE_ONE:
|
|
aiRGBA[uChannel] = GL_ONE;
|
|
break;
|
|
default:
|
|
assert(false);
|
|
}
|
|
uMask >>= 3;
|
|
}
|
|
}
|
|
|
|
bool RGBAToSwizzleMask(const GLint aiRGBA[4], TSwizzleMask& uMask)
|
|
{
|
|
uMask = 0;
|
|
uint32 uChannel;
|
|
for (uChannel = 0; uChannel < 4; ++uChannel, uMask <<= 3)
|
|
{
|
|
switch (aiRGBA[uChannel])
|
|
{
|
|
case GL_RED:
|
|
uMask |= DXGL_SWIZZLE_RED;
|
|
break;
|
|
case GL_GREEN:
|
|
uMask |= DXGL_SWIZZLE_GREEN;
|
|
break;
|
|
case GL_BLUE:
|
|
uMask |= DXGL_SWIZZLE_BLUE;
|
|
break;
|
|
case GL_ALPHA:
|
|
uMask |= DXGL_SWIZZLE_ALPHA;
|
|
break;
|
|
case GL_ZERO:
|
|
uMask |= DXGL_SWIZZLE_ZERO;
|
|
break;
|
|
case GL_ONE:
|
|
uMask |= DXGL_SWIZZLE_ONE;
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#undef DXGL_SWIZZLE_RED
|
|
#undef DXGL_SWIZZLE_GREEN
|
|
#undef DXGL_SWIZZLE_BLUE
|
|
#undef DXGL_SWIZZLE_ALPHA
|
|
#undef DXGL_SWIZZLE_ZERO
|
|
#undef DXGL_SWIZZLE_ONE
|
|
|
|
bool GetImageFormat(EGIFormat eGIFormat, GLenum* peImageFormat)
|
|
{
|
|
const SGIFormatInfo* pFormatInfo;
|
|
DXGL_TODO("If possible add a specific list of valid image formats rather than re-using texture formats and checking that it's not compressed")
|
|
if (eGIFormat == eGIF_NUM ||
|
|
(pFormatInfo = GetGIFormatInfo(eGIFormat)) == NULL ||
|
|
pFormatInfo->m_pTexture == NULL ||
|
|
pFormatInfo->m_pTexture->m_bCompressed)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
*peImageFormat = (GLenum)pFormatInfo->m_pTexture->m_iInternalFormat;
|
|
return true;
|
|
}
|
|
}
|