|
|
|
@ -133,13 +133,13 @@ constexpr std::array<f32, 256> RGB_TO_SRGB_LUT = {
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
struct R32B32G32A32_FLOATTraits {
|
|
|
|
|
struct R32G32B32A32_FLOATTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::R, Swizzle::B, Swizzle::G, Swizzle::A};
|
|
|
|
|
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct R32G32B32A32_SINTTraits {
|
|
|
|
@ -160,6 +160,33 @@ struct R32G32B32A32_UINTTraits {
|
|
|
|
|
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::A};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct R32G32B32X32_FLOATTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT, ComponentType::FLOAT};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct R32G32B32X32_SINTTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::SINT, ComponentType::SINT, ComponentType::SINT, ComponentType::SINT};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct R32G32B32X32_UINTTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::UINT, ComponentType::UINT, ComponentType::UINT, ComponentType::UINT};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {32, 32, 32, 32};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::R, Swizzle::G, Swizzle::B, Swizzle::None};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct R16G16B16A16_UNORMTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
@ -277,6 +304,15 @@ struct A2B10G10R10_UINTTraits {
|
|
|
|
|
Swizzle::A, Swizzle::B, Swizzle::G, Swizzle::R};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct A2R10G10B10_UNORMTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {2, 10, 10, 10};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::A, Swizzle::R, Swizzle::G, Swizzle::B};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct A8B8G8R8_UNORMTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
@ -544,6 +580,33 @@ struct R8_UINTTraits {
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {Swizzle::R};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct X1R5G5B5_UNORMTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {1, 5, 5, 5};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::None, Swizzle::R, Swizzle::G, Swizzle::B};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct X8B8G8R8_UNORMTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM, ComponentType::UNORM};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {8, 8, 8, 8};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::None, Swizzle::B, Swizzle::G, Swizzle::R};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct X8B8G8R8_SRGBTraits {
|
|
|
|
|
static constexpr size_t num_components = 4;
|
|
|
|
|
static constexpr std::array<ComponentType, num_components> component_types = {
|
|
|
|
|
ComponentType::SRGB, ComponentType::SRGB, ComponentType::SRGB, ComponentType::SRGB};
|
|
|
|
|
static constexpr std::array<size_t, num_components> component_sizes = {8, 8, 8, 8};
|
|
|
|
|
static constexpr std::array<Swizzle, num_components> component_swizzle = {
|
|
|
|
|
Swizzle::None, Swizzle::B, Swizzle::G, Swizzle::R};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <class ConverterTraits>
|
|
|
|
|
class ConverterImpl : public Converter {
|
|
|
|
|
private:
|
|
|
|
@ -884,9 +947,9 @@ public:
|
|
|
|
|
|
|
|
|
|
Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
|
|
|
|
|
switch (format) {
|
|
|
|
|
case RenderTargetFormat::R32B32G32A32_FLOAT:
|
|
|
|
|
case RenderTargetFormat::R32G32B32A32_FLOAT:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R32B32G32A32_FLOATTraits>>())
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_FLOATTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::R32G32B32A32_SINT:
|
|
|
|
@ -899,6 +962,21 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R32G32B32A32_UINTTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::R32G32B32X32_FLOAT:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_FLOATTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::R32G32B32X32_SINT:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_SINTTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::R32G32B32X32_UINT:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R32G32B32X32_UINTTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::R16G16B16A16_UNORM:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R16G16B16A16_UNORMTraits>>())
|
|
|
|
@ -964,6 +1042,11 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<A2B10G10R10_UINTTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::A2R10G10B10_UNORM:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<A2R10G10B10_UNORMTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::A8B8G8R8_UNORM:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<A8B8G8R8_UNORMTraits>>())
|
|
|
|
@ -1119,6 +1202,21 @@ Converter* ConverterFactory::BuildConverter(RenderTargetFormat format) {
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<R8_UINTTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::X1R5G5B5_UNORM:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<X1R5G5B5_UNORMTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::X8B8G8R8_UNORM:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<X8B8G8R8_UNORMTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
case RenderTargetFormat::X8B8G8R8_SRGB:
|
|
|
|
|
return impl->converters_cache
|
|
|
|
|
.emplace(format, std::make_unique<ConverterImpl<X8B8G8R8_SRGBTraits>>())
|
|
|
|
|
.first->second.get();
|
|
|
|
|
break;
|
|
|
|
|
default: {
|
|
|
|
|
UNIMPLEMENTED_MSG("This format {} converter is not implemented", format);
|
|
|
|
|
return impl->converters_cache.emplace(format, std::make_unique<NullConverter>())
|
|
|
|
|