Program Listing for File RawStorageFormat.h¶
↰ Return to documentation for file (Source\Core\Inc\Core\RawStorageFormat.h
)
#pragma once
#include <Types.h>
#include <tuple>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/detail/bitmask.hpp>
namespace Azura {
enum class AspectMaskBits
{
ColorBit = 1 << 0,
DepthBit = 1 << 1,
StencilBit = 1 << 2
};
BOOST_BITMASK(AspectMaskBits);
enum Bits
{
BitsUnknown = 0,
Bits1 = 1,
Bits2 = 2,
Bits3 = 3,
Bits4 = 4,
Bits5 = 5,
Bits6 = 6,
Bits7 = 7,
Bits8 = 8,
Bits16 = 16,
Bits32 = 32
};
enum FormatFeature : U32
{
Compressed = 1,
MultiBlock = 1 << 1,
};
enum class ChannelDataType
{
Float = 0,
Integer,
UNorm,
SNorm,
UScaled,
SScaled,
SRGB,
Typeless
};
enum class Channel
{
Red = 0,
Green,
Blue,
Alpha,
Depth,
Stencil,
Padding,
Unknown,
};
using ChannelDesc = std::tuple<Channel, ChannelDataType, U32>;
// Tuple Access Info
#define TUPLE_ACCESS_ENUM 0
#define TUPLE_ACCESS_ASPECT_MASK 1
#define TUPLE_ACCESS_CHANNEL_DATA 2
#define TUPLE_SIZE 3
#define CHANNEL_TUPLE_ACCESS_CHANNEL 0
#define CHANNEL_TUPLE_ACCESS_TYPE 1
#define CHANNEL_TUPLE_ACCESS_BIT_WIDTH 2
#define CHANNEL_TUPLE_SIZE 3
// Format Iterator
#define RAW_STORAGE_FORMAT_ITERATOR(FUNC) \
FUNC((UNKNOWN, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Unknown, Typeless, 0)) /* CHANNELS END */)) \
FUNC((B8G8R8A8_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Blue, SInt, 8)) ((Green, SInt, 8)) ((Red, SInt, 8)) ((Alpha, SInt, 8)) /* CHANNELS END */)) \
FUNC((B8G8R8A8_SNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Blue, SNorm, 8)) ((Green, SNorm, 8)) ((Red, SNorm, 8)) ((Alpha, SNorm, 8)) /* CHANNELS END */)) \
FUNC((B8G8R8A8_SRGB, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Blue, SRGB, 8)) ((Green, SRGB, 8)) ((Red, SRGB, 8)) ((Alpha, SRGB, 8)) /* CHANNELS END */)) \
FUNC((B8G8R8A8_SSCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Blue, SScaled, 8)) ((Green, SScaled, 8)) ((Red, SScaled, 8)) ((Alpha, SScaled, 8)) /* CHANNELS END */)) \
FUNC((B8G8R8A8_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Blue, UInt, 8)) ((Green, UInt, 8)) ((Red, UInt, 8)) ((Alpha, UInt, 8)) /* CHANNELS END */)) \
FUNC((B8G8R8A8_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Blue, UNorm, 8)) ((Green, UNorm, 8)) ((Red, UNorm, 8)) ((Alpha, UNorm, 8)) /* CHANNELS END */)) \
FUNC((B8G8R8A8_USCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Blue, UScaled, 8)) ((Green, UScaled, 8)) ((Red, UScaled, 8)) ((Alpha, UScaled, 8)) /* CHANNELS END */)) \
FUNC((D24_UNORM_S8_UINT, ( AspectMaskBits::DepthBit | AspectMaskBits::StencilBit ), /* CHANNELS START */ ((Depth, UNorm, 24)) ((Stencil, UInt, 8)) /* CHANNELS END */)) \
FUNC((D32_FLOAT, ( AspectMaskBits::DepthBit ), /* CHANNELS START */ ((Depth, Float, 32)) /* CHANNELS END */)) \
FUNC((D32_FLOAT_S8X24_UINT, ( AspectMaskBits::DepthBit | AspectMaskBits::StencilBit ), /* CHANNELS START */ ((Depth, Float, 32)) ((Stencil, UInt, 8)) ((Padding, Float, 24)) /* CHANNELS END */)) \
FUNC((R8G8B8_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UNorm, 8)) ((Green, UNorm, 8)) ((Blue, UNorm, 8)) /* CHANNELS END */)) \
FUNC((R8G8B8A8_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UNorm, 8)) ((Green, UNorm, 8)) ((Blue, UNorm, 8)) ((Alpha, UNorm, 8)) /* CHANNELS END */)) \
FUNC((R11G11B10_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 11)) ((Green, Float, 11)) ((Blue, Float, 10)) /* CHANNELS END */)) \
FUNC((R16_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 16)) /* CHANNELS END */)) \
FUNC((R16_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 16)) /* CHANNELS END */)) \
FUNC((R16_SNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SNorm, 16)) /* CHANNELS END */)) \
FUNC((R16_SSCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SScaled, 16)) /* CHANNELS END */)) \
FUNC((R16_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 16)) /* CHANNELS END */)) \
FUNC((R16_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UNorm, 16)) /* CHANNELS END */)) \
FUNC((R16_USCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UScaled, 16)) /* CHANNELS END */)) \
FUNC((R16G16_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 16)) ((Green, Float, 16)) /* CHANNELS END */)) \
FUNC((R16G16_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 16)) ((Green, SInt, 16)) /* CHANNELS END */)) \
FUNC((R16G16_SNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SNorm, 16)) ((Green, SNorm, 16)) /* CHANNELS END */)) \
FUNC((R16G16_SSCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SScaled, 16)) ((Green, SScaled, 16)) /* CHANNELS END */)) \
FUNC((R16G16_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 16)) ((Green, UInt, 16)) /* CHANNELS END */)) \
FUNC((R16G16_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UNorm, 16)) ((Green, UNorm, 16)) /* CHANNELS END */)) \
FUNC((R16G16_USCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UScaled, 16)) ((Green, UScaled, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 16)) ((Green, Float, 16)) ((Blue, Float, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 16)) ((Green, SInt, 16)) ((Blue, SInt, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16_SNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SNorm, 16)) ((Green, SNorm, 16)) ((Blue, SNorm, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16_SSCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SScaled, 16)) ((Green, SScaled, 16)) ((Blue, SScaled, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 16)) ((Green, UInt, 16)) ((Blue, UInt, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UNorm, 16)) ((Green, UNorm, 16)) ((Blue, UNorm, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16_USCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UScaled, 16)) ((Green, UScaled, 16)) ((Blue, UScaled, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16A16_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 16)) ((Green, Float, 16)) ((Blue, Float, 16)) ((Alpha, Float, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16A16_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 16)) ((Green, SInt, 16)) ((Blue, SInt, 16)) ((Alpha, SInt, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16A16_SNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SNorm, 16)) ((Green, SNorm, 16)) ((Blue, SNorm, 16)) ((Alpha, SNorm, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16A16_SSCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SScaled, 16)) ((Green, SScaled, 16)) ((Blue, SScaled, 16)) ((Alpha, SScaled, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16A16_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 16)) ((Green, UInt, 16)) ((Blue, UInt, 16)) ((Alpha, UInt, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16A16_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UNorm, 16)) ((Green, UNorm, 16)) ((Blue, UNorm, 16)) ((Alpha, UNorm, 16)) /* CHANNELS END */)) \
FUNC((R16G16B16A16_USCALED, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UScaled, 16)) ((Green, UScaled, 16)) ((Blue, UScaled, 16)) ((Alpha, UScaled, 16)) /* CHANNELS END */)) \
FUNC((R32_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 32)) /* CHANNELS END */)) \
FUNC((R32_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 32)) /* CHANNELS END */)) \
FUNC((R32_SNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SNorm, 32)) /* CHANNELS END */)) \
FUNC((R32_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 32)) /* CHANNELS END */)) \
FUNC((R32_UNORM, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UNorm, 32)) /* CHANNELS END */)) \
FUNC((R32G32_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 32)) ((Green, Float, 32)) /* CHANNELS END */)) \
FUNC((R32G32_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 32)) ((Green, SInt, 32)) /* CHANNELS END */)) \
FUNC((R32G32_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 32)) ((Green, UInt, 32)) /* CHANNELS END */)) \
FUNC((R32G32B32_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 32)) ((Green, Float, 32)) ((Blue, Float, 32)) /* CHANNELS END */)) \
FUNC((R32G32B32_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 32)) ((Green, SInt, 32)) ((Blue, SInt, 32)) /* CHANNELS END */)) \
FUNC((R32G32B32_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 32)) ((Green, UInt, 32)) ((Blue, UInt, 32)) /* CHANNELS END */)) \
FUNC((R32G32B32A32_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 32)) ((Green, Float, 32)) ((Blue, Float, 32)) ((Alpha, Float, 32)) /* CHANNELS END */)) \
FUNC((R32G32B32A32_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 32)) ((Green, UInt, 32)) ((Blue, UInt, 32)) ((Alpha, UInt, 32)) /* CHANNELS END */)) \
FUNC((R32G32B32A32_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 32)) ((Green, UInt, 32)) ((Blue, UInt, 32)) ((Alpha, UInt, 32)) /* CHANNELS END */)) \
FUNC((R64_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 64)) /* CHANNELS END */)) \
FUNC((R64_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 64)) /* CHANNELS END */)) \
FUNC((R64_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 64)) /* CHANNELS END */)) \
FUNC((R64G64_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 64)) ((Green, Float, 64)) /* CHANNELS END */)) \
FUNC((R64G64_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 64)) ((Green, SInt, 64)) /* CHANNELS END */)) \
FUNC((R64G64_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 64)) ((Green, UInt, 64)) /* CHANNELS END */)) \
FUNC((R64G64B64_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 64)) ((Green, Float, 64)) ((Blue, Float, 64)) /* CHANNELS END */)) \
FUNC((R64G64B64_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 64)) ((Green, SInt, 64)) ((Blue, SInt, 64)) /* CHANNELS END */)) \
FUNC((R64G64B64_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 64)) ((Green, UInt, 64)) ((Blue, UInt, 64)) /* CHANNELS END */)) \
FUNC((R64G64B64A64_FLOAT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, Float, 64)) ((Green, Float, 64)) ((Blue, Float, 64)) ((Alpha, Float, 64)) /* CHANNELS END */)) \
FUNC((R64G64B64A64_SINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, SInt, 64)) ((Green, SInt, 64)) ((Blue, SInt, 64)) ((Alpha, SInt, 64)) /* CHANNELS END */)) \
FUNC((R64G64B64A64_UINT, ( AspectMaskBits::ColorBit ), /* CHANNELS START */ ((Red, UInt, 64)) ((Green, UInt, 64)) ((Blue, UInt, 64)) ((Alpha, UInt, 64)) /* CHANNELS END */))
// Macros For: ENUM NAME
#define GET_FORMAT_NAME_FROM_TUPLE(ENUM_TUPLE) BOOST_PP_TUPLE_ELEM(TUPLE_SIZE, TUPLE_ACCESS_ENUM, ENUM_TUPLE)
#define GET_FORMAT_NAME_FOR_LIST_FROM_TUPLE(ENUM_TUPLE) GET_FORMAT_NAME_FROM_TUPLE(ENUM_TUPLE),
#define GET_FULL_FORMAT_NAME_FROM_TUPLE(ENUM_TUPLE) RawStorageFormat::GET_FORMAT_NAME_FROM_TUPLE(ENUM_TUPLE)
// Macros For: CHANNEL WIDTH
#define GET_CHANNEL_WIDTH(CHANNEL_TUPLE) \
BOOST_PP_TUPLE_ELEM(CHANNEL_TUPLE_SIZE, CHANNEL_TUPLE_ACCESS_BIT_WIDTH, CHANNEL_TUPLE)
#define GET_CHANNEL_WIDTH_SEQ(R, DATA, CHANNEL_TUPLE) \
BOOST_PP_TUPLE_ELEM(CHANNEL_TUPLE_SIZE, CHANNEL_TUPLE_ACCESS_BIT_WIDTH, CHANNEL_TUPLE) DATA
#define GET_FORMAT_WIDTH(CHANNEL_LIST) BOOST_PP_SEQ_FOR_EACH(GET_CHANNEL_WIDTH_SEQ, +, CHANNEL_LIST) 0
#define GET_FORMAT_WIDTH_FROM_TUPLE(ENUM_TUPLE) \
GET_FORMAT_WIDTH(BOOST_PP_TUPLE_ELEM(TUPLE_SIZE, TUPLE_ACCESS_CHANNEL_DATA, ENUM_TUPLE))
#define GET_FORMAT_WIDTH_FOR_LIST_FROM_TUPLE(ENUM_TUPLE) GET_FORMAT_WIDTH_FROM_TUPLE(ENUM_TUPLE),
#define GET_ASPECT_MASK_FROM_TUPLE(ENUM_TUPLE) \
BOOST_PP_TUPLE_ELEM(TUPLE_SIZE, TUPLE_ACCESS_ASPECT_MASK, ENUM_TUPLE)
enum class RawStorageFormat
{
RAW_STORAGE_FORMAT_ITERATOR(GET_FORMAT_NAME_FOR_LIST_FROM_TUPLE)
};
U32 GetFormatSizeBits(RawStorageFormat format);
U32 GetFormatSize(RawStorageFormat format);
bool HasDepthComponent(RawStorageFormat format);
bool HasStencilComponent(RawStorageFormat format);
bool HasDepthOrStencilComponent(RawStorageFormat format);
bool HasDepthAndStencilComponent(RawStorageFormat format);
String ToString(RawStorageFormat format);
} // namespace Azura