44#include "nbl/builtin/hlsl/format/shared_exp.hlsl"
55#include "nbl/builtin/hlsl/format/octahedral.hlsl"
66#include "nbl/builtin/hlsl/type_traits.hlsl"
7+ #include "nbl/builtin/hlsl/cpp_compat/basic.h"
78
89namespace nbl
910{
@@ -292,7 +293,9 @@ struct view_class_traits<BlockViewClass::CLASS> \
292293}
293294SPECIALIZE_CLASS (SIZE_8_BIT,R8_UINT,1 ,1 );
294295SPECIALIZE_CLASS (SIZE_16_BIT,R16_UINT,2 ,2 );
296+ SPECIALIZE_CLASS (SIZE_24_BIT,R8G8B8_UINT,3 ,1 );
295297SPECIALIZE_CLASS (SIZE_32_BIT,R32_UINT,4 ,4 );
298+ SPECIALIZE_CLASS (SIZE_48_BIT,R16G16B16_UINT,6 ,2 );
296299SPECIALIZE_CLASS (SIZE_64_BIT,R32G32_UINT,8 ,4 );
297300SPECIALIZE_CLASS (SIZE_96_BIT,R32G32B32_UINT,12 ,4 );
298301SPECIALIZE_CLASS (SIZE_128_BIT,R32G32B32A32_UINT,16 ,4 );
@@ -347,10 +350,9 @@ struct block_traits
347350struct block_traits<TexelBlockFormat::FORMAT> \
348351{ \
349352 using class_traits_t = view_class_traits<BlockViewClass::CLASS>; \
350- NBL_CONSTEXPR_STATIC_INLINE class_traits_t ClassTraits; \
351353 NBL_CONSTEXPR_STATIC_INLINE const std::type_info* DecodeTypeID = &typeid (float ); \
352354 NBL_CONSTEXPR_STATIC_INLINE TexelKind Kind = KIND; \
353- NBL_CONSTEXPR_STATIC_INLINE TexelAttributes Attributes = ATTRS; \
355+ NBL_CONSTEXPR_STATIC_INLINE TexelAttributes Attributes = TexelAttributes ( ATTRS) ; \
354356 NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeX = W; \
355357 NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeY = H; \
356358 NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeZ = D; \
@@ -361,22 +363,141 @@ struct block_traits<TexelBlockFormat::FORMAT> \
361363struct block_traits<TexelBlockFormat::FORMAT> \
362364{ \
363365 using class_traits_t = view_class_traits<BlockViewClass::CLASS>; \
364- NBL_CONSTEXPR_STATIC_INLINE class_traits_t ClassTraits; \
365366 NBL_CONSTEXPR_STATIC_INLINE uint32_t DecodeTypeID = impl::typeid_t<float >::value; \
366367 NBL_CONSTEXPR_STATIC_INLINE TexelKind Kind = KIND; \
367- NBL_CONSTEXPR_STATIC_INLINE TexelAttributes Attributes = ATTRS; \
368+ NBL_CONSTEXPR_STATIC_INLINE TexelAttributes Attributes = TexelAttributes ( ATTRS) ; \
368369 NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeX = W; \
369370 NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeY = H; \
370371 NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeZ = D; \
371372 NBL_CONSTEXPR_STATIC_INLINE uint32_t Channels = C; \
372373}
373374#endif
374375//SPECIALIZE_FORMAT(D16_UNORM,BVC_UNKNOWN,Normalized,HasDepthBit,1,1,1,1);
375- // TODO: now do the rest
376+ // TODO: depth and stencil formats
376377SPECIALIZE_FORMAT (R4G4_UNORM_PACK8,SIZE_8_BIT,Normalized,None ,1 ,1 ,1 ,2 );
377- // TODO: now do the rest
378- SPECIALIZE_FORMAT (B8G8R8A8_SRGB,SIZE_32_BIT,SRGB,None ,1 ,1 ,1 ,4 );
379- // TODO: now do the rest
378+ SPECIALIZE_FORMAT (R4G4B4A4_UNORM_PACK16,SIZE_16_BIT,Normalized,None ,1 ,1 ,1 ,4 );
379+ SPECIALIZE_FORMAT (B4G4R4A4_UNORM_PACK16,SIZE_16_BIT,Normalized,BGRABit,1 ,1 ,1 ,4 );
380+ SPECIALIZE_FORMAT (R5G6B5_UNORM_PACK16,SIZE_16_BIT,Normalized,None ,1 ,1 ,1 ,3 );
381+ SPECIALIZE_FORMAT (B5G6R5_UNORM_PACK16,SIZE_16_BIT,Normalized,BGRABit,1 ,1 ,1 ,3 );
382+ SPECIALIZE_FORMAT (R5G5B5A1_UNORM_PACK16,SIZE_16_BIT,Normalized,None ,1 ,1 ,1 ,4 );
383+ SPECIALIZE_FORMAT (B5G5R5A1_UNORM_PACK16,SIZE_16_BIT,Normalized,BGRABit,1 ,1 ,1 ,4 );
384+ SPECIALIZE_FORMAT (A1R5G5B5_UNORM_PACK16,SIZE_16_BIT,Normalized,BGRABit,1 ,1 ,1 ,4 );
385+ SPECIALIZE_FORMAT (R8_UNORM,SIZE_8_BIT,Normalized,None ,1 ,1 ,1 ,1 );
386+ SPECIALIZE_FORMAT (R8_SNORM,SIZE_8_BIT,Normalized,SignedBit,1 ,1 ,1 ,1 );
387+ SPECIALIZE_FORMAT (R8_USCALED,SIZE_8_BIT,Scaled,None ,1 ,1 ,1 ,1 );
388+ SPECIALIZE_FORMAT (R8_SSCALED,SIZE_8_BIT,Scaled,SignedBit,1 ,1 ,1 ,1 );
389+ SPECIALIZE_FORMAT (R8_UINT,SIZE_8_BIT,Integer,None ,1 ,1 ,1 ,1 );
390+ SPECIALIZE_FORMAT (R8_SINT,SIZE_8_BIT,Integer,SignedBit,1 ,1 ,1 ,1 );
391+ SPECIALIZE_FORMAT (R8_SRGB,SIZE_8_BIT,SRGB,None ,1 ,1 ,1 ,1 );
392+ SPECIALIZE_FORMAT (R8G8_UNORM,SIZE_16_BIT,Normalized,None ,1 ,1 ,1 ,2 );
393+ SPECIALIZE_FORMAT (R8G8_SNORM,SIZE_16_BIT,Normalized,SignedBit,1 ,1 ,1 ,2 );
394+ SPECIALIZE_FORMAT (R8G8_USCALED,SIZE_16_BIT,Scaled,None ,1 ,1 ,1 ,2 );
395+ SPECIALIZE_FORMAT (R8G8_SSCALED,SIZE_16_BIT,Scaled,SignedBit,1 ,1 ,1 ,2 );
396+ SPECIALIZE_FORMAT (R8G8_UINT,SIZE_16_BIT,Integer,None ,1 ,1 ,1 ,2 );
397+ SPECIALIZE_FORMAT (R8G8_SINT,SIZE_16_BIT,Integer,SignedBit,1 ,1 ,1 ,2 );
398+ SPECIALIZE_FORMAT (R8G8_SRGB,SIZE_16_BIT,SRGB,None ,1 ,1 ,1 ,2 );
399+ SPECIALIZE_FORMAT (R8G8B8_UNORM,SIZE_24_BIT,Normalized,None ,1 ,1 ,1 ,3 );
400+ SPECIALIZE_FORMAT (R8G8B8_SNORM,SIZE_24_BIT,Normalized,SignedBit,1 ,1 ,1 ,3 );
401+ SPECIALIZE_FORMAT (R8G8B8_USCALED,SIZE_24_BIT,Scaled,None ,1 ,1 ,1 ,3 );
402+ SPECIALIZE_FORMAT (R8G8B8_SSCALED,SIZE_24_BIT,Scaled,SignedBit,1 ,1 ,1 ,3 );
403+ SPECIALIZE_FORMAT (R8G8B8_UINT,SIZE_24_BIT,Integer,None ,1 ,1 ,1 ,3 );
404+ SPECIALIZE_FORMAT (R8G8B8_SINT,SIZE_24_BIT,Integer,SignedBit,1 ,1 ,1 ,3 );
405+ SPECIALIZE_FORMAT (R8G8B8_SRGB,SIZE_24_BIT,SRGB,None ,1 ,1 ,1 ,3 );
406+ SPECIALIZE_FORMAT (B8G8R8_UNORM,SIZE_24_BIT,Normalized,BGRABit,1 ,1 ,1 ,3 );
407+ SPECIALIZE_FORMAT (B8G8R8_SNORM,SIZE_24_BIT,Normalized,SignedBit|BGRABit,1 ,1 ,1 ,3 );
408+ SPECIALIZE_FORMAT (B8G8R8_USCALED,SIZE_24_BIT,Scaled,BGRABit,1 ,1 ,1 ,3 );
409+ SPECIALIZE_FORMAT (B8G8R8_SSCALED,SIZE_24_BIT,Scaled,SignedBit|BGRABit,1 ,1 ,1 ,3 );
410+ SPECIALIZE_FORMAT (B8G8R8_UINT,SIZE_24_BIT,Integer,BGRABit,1 ,1 ,1 ,3 );
411+ SPECIALIZE_FORMAT (B8G8R8_SINT,SIZE_24_BIT,Integer,SignedBit|BGRABit,1 ,1 ,1 ,3 );
412+ SPECIALIZE_FORMAT (B8G8R8_SRGB,SIZE_24_BIT,SRGB,BGRABit,1 ,1 ,1 ,3 );
413+ SPECIALIZE_FORMAT (R8G8B8A8_UNORM,SIZE_32_BIT,Normalized,None ,1 ,1 ,1 ,4 );
414+ SPECIALIZE_FORMAT (R8G8B8A8_SNORM,SIZE_32_BIT,Normalized,SignedBit,1 ,1 ,1 ,4 );
415+ SPECIALIZE_FORMAT (R8G8B8A8_USCALED,SIZE_32_BIT,Scaled,None ,1 ,1 ,1 ,4 );
416+ SPECIALIZE_FORMAT (R8G8B8A8_SSCALED,SIZE_32_BIT,Scaled,SignedBit,1 ,1 ,1 ,4 );
417+ SPECIALIZE_FORMAT (R8G8B8A8_UINT,SIZE_32_BIT,Integer,None ,1 ,1 ,1 ,4 );
418+ SPECIALIZE_FORMAT (R8G8B8A8_SINT,SIZE_32_BIT,Integer,SignedBit,1 ,1 ,1 ,4 );
419+ SPECIALIZE_FORMAT (R8G8B8A8_SRGB,SIZE_32_BIT,SRGB,None ,1 ,1 ,1 ,4 );
420+ SPECIALIZE_FORMAT (B8G8R8A8_UNORM,SIZE_32_BIT,Normalized,BGRABit,1 ,1 ,1 ,4 );
421+ SPECIALIZE_FORMAT (B8G8R8A8_SNORM,SIZE_32_BIT,Normalized,SignedBit|BGRABit,1 ,1 ,1 ,4 );
422+ SPECIALIZE_FORMAT (B8G8R8A8_USCALED,SIZE_32_BIT,Scaled,BGRABit,1 ,1 ,1 ,4 );
423+ SPECIALIZE_FORMAT (B8G8R8A8_SSCALED,SIZE_32_BIT,Scaled,SignedBit|BGRABit,1 ,1 ,1 ,4 );
424+ SPECIALIZE_FORMAT (B8G8R8A8_UINT,SIZE_32_BIT,Integer,BGRABit,1 ,1 ,1 ,4 );
425+ SPECIALIZE_FORMAT (B8G8R8A8_SINT,SIZE_32_BIT,Integer,SignedBit|BGRABit,1 ,1 ,1 ,4 );
426+ SPECIALIZE_FORMAT (B8G8R8A8_SRGB,SIZE_32_BIT,SRGB,BGRABit,1 ,1 ,1 ,4 );
427+ SPECIALIZE_FORMAT (A8B8G8R8_UNORM_PACK32,SIZE_32_BIT,Normalized,BGRABit,1 ,1 ,1 ,4 );
428+ SPECIALIZE_FORMAT (A8B8G8R8_SNORM_PACK32,SIZE_32_BIT,Normalized,SignedBit|BGRABit,1 ,1 ,1 ,4 );
429+ SPECIALIZE_FORMAT (A8B8G8R8_USCALED_PACK32,SIZE_32_BIT,Scaled,BGRABit,1 ,1 ,1 ,4 );
430+ SPECIALIZE_FORMAT (A8B8G8R8_SSCALED_PACK32,SIZE_32_BIT,Scaled,SignedBit|BGRABit,1 ,1 ,1 ,4 );
431+ SPECIALIZE_FORMAT (A8B8G8R8_UINT_PACK32,SIZE_32_BIT,Integer,BGRABit,1 ,1 ,1 ,4 );
432+ SPECIALIZE_FORMAT (A8B8G8R8_SINT_PACK32,SIZE_32_BIT,Integer,SignedBit|BGRABit,1 ,1 ,1 ,4 );
433+ SPECIALIZE_FORMAT (A8B8G8R8_SRGB_PACK32,SIZE_32_BIT,SRGB,BGRABit,1 ,1 ,1 ,4 );
434+ SPECIALIZE_FORMAT (A2R10G10B10_UNORM_PACK32,SIZE_32_BIT,Normalized,None ,1 ,1 ,1 ,4 );
435+ SPECIALIZE_FORMAT (A2R10G10B10_SNORM_PACK32,SIZE_32_BIT,Normalized,SignedBit,1 ,1 ,1 ,4 );
436+ SPECIALIZE_FORMAT (A2R10G10B10_USCALED_PACK32,SIZE_32_BIT,Scaled,None ,1 ,1 ,1 ,4 );
437+ SPECIALIZE_FORMAT (A2R10G10B10_SSCALED_PACK32,SIZE_32_BIT,Scaled,SignedBit,1 ,1 ,1 ,4 );
438+ SPECIALIZE_FORMAT (A2R10G10B10_UINT_PACK32,SIZE_32_BIT,Integer,None ,1 ,1 ,1 ,4 );
439+ SPECIALIZE_FORMAT (A2R10G10B10_SINT_PACK32,SIZE_32_BIT,Integer,SignedBit,1 ,1 ,1 ,4 );
440+ SPECIALIZE_FORMAT (A2B10G10R10_UNORM_PACK32,SIZE_32_BIT,Normalized,BGRABit,1 ,1 ,1 ,4 );
441+ SPECIALIZE_FORMAT (A2B10G10R10_SNORM_PACK32,SIZE_32_BIT,Normalized,SignedBit|BGRABit,1 ,1 ,1 ,4 );
442+ SPECIALIZE_FORMAT (A2B10G10R10_USCALED_PACK32,SIZE_32_BIT,Scaled,BGRABit,1 ,1 ,1 ,4 );
443+ SPECIALIZE_FORMAT (A2B10G10R10_SSCALED_PACK32,SIZE_32_BIT,Scaled,SignedBit|BGRABit,1 ,1 ,1 ,4 );
444+ SPECIALIZE_FORMAT (A2B10G10R10_UINT_PACK32,SIZE_32_BIT,Integer,BGRABit,1 ,1 ,1 ,4 );
445+ SPECIALIZE_FORMAT (A2B10G10R10_SINT_PACK32,SIZE_32_BIT,Integer,SignedBit|BGRABit,1 ,1 ,1 ,4 );
446+ SPECIALIZE_FORMAT (R16_UNORM,SIZE_16_BIT,Normalized,None ,1 ,1 ,1 ,1 );
447+ SPECIALIZE_FORMAT (R16_SNORM,SIZE_16_BIT,Normalized,SignedBit,1 ,1 ,1 ,1 );
448+ SPECIALIZE_FORMAT (R16_USCALED,SIZE_16_BIT,Scaled,None ,1 ,1 ,1 ,1 );
449+ SPECIALIZE_FORMAT (R16_SSCALED,SIZE_16_BIT,Scaled,SignedBit,1 ,1 ,1 ,1 );
450+ SPECIALIZE_FORMAT (R16_UINT,SIZE_16_BIT,Integer,None ,1 ,1 ,1 ,1 );
451+ SPECIALIZE_FORMAT (R16_SINT,SIZE_16_BIT,Integer,SignedBit,1 ,1 ,1 ,1 );
452+ SPECIALIZE_FORMAT (R16_SFLOAT,SIZE_16_BIT,Float,SignedBit,1 ,1 ,1 ,1 );
453+ SPECIALIZE_FORMAT (R16G16_UNORM,SIZE_32_BIT,Normalized,None ,1 ,1 ,1 ,2 );
454+ SPECIALIZE_FORMAT (R16G16_SNORM,SIZE_32_BIT,Normalized,SignedBit,1 ,1 ,1 ,2 );
455+ SPECIALIZE_FORMAT (R16G16_USCALED,SIZE_32_BIT,Scaled,None ,1 ,1 ,1 ,2 );
456+ SPECIALIZE_FORMAT (R16G16_SSCALED,SIZE_32_BIT,Scaled,SignedBit,1 ,1 ,1 ,2 );
457+ SPECIALIZE_FORMAT (R16G16_UINT,SIZE_32_BIT,Integer,None ,1 ,1 ,1 ,2 );
458+ SPECIALIZE_FORMAT (R16G16_SINT,SIZE_32_BIT,Integer,SignedBit,1 ,1 ,1 ,2 );
459+ SPECIALIZE_FORMAT (R16G16_SFLOAT,SIZE_32_BIT,Float,SignedBit,1 ,1 ,1 ,2 );
460+ SPECIALIZE_FORMAT (R16G16B16_UNORM,SIZE_48_BIT,Normalized,None ,1 ,1 ,1 ,3 );
461+ SPECIALIZE_FORMAT (R16G16B16_SNORM,SIZE_48_BIT,Normalized,SignedBit,1 ,1 ,1 ,3 );
462+ SPECIALIZE_FORMAT (R16G16B16_USCALED,SIZE_48_BIT,Scaled,None ,1 ,1 ,1 ,3 );
463+ SPECIALIZE_FORMAT (R16G16B16_SSCALED,SIZE_48_BIT,Scaled,SignedBit,1 ,1 ,1 ,3 );
464+ SPECIALIZE_FORMAT (R16G16B16_UINT,SIZE_48_BIT,Integer,None ,1 ,1 ,1 ,3 );
465+ SPECIALIZE_FORMAT (R16G16B16_SINT,SIZE_48_BIT,Integer,SignedBit,1 ,1 ,1 ,3 );
466+ SPECIALIZE_FORMAT (R16G16B16_SFLOAT,SIZE_48_BIT,Float,SignedBit,1 ,1 ,1 ,3 );
467+ SPECIALIZE_FORMAT (R16G16B16A16_UNORM,SIZE_64_BIT,Normalized,None ,1 ,1 ,1 ,4 );
468+ SPECIALIZE_FORMAT (R16G16B16A16_SNORM,SIZE_64_BIT,Normalized,SignedBit,1 ,1 ,1 ,4 );
469+ SPECIALIZE_FORMAT (R16G16B16A16_USCALED,SIZE_64_BIT,Scaled,None ,1 ,1 ,1 ,4 );
470+ SPECIALIZE_FORMAT (R16G16B16A16_SSCALED,SIZE_64_BIT,Scaled,SignedBit,1 ,1 ,1 ,4 );
471+ SPECIALIZE_FORMAT (R16G16B16A16_UINT,SIZE_64_BIT,Integer,None ,1 ,1 ,1 ,4 );
472+ SPECIALIZE_FORMAT (R16G16B16A16_SINT,SIZE_64_BIT,Integer,SignedBit,1 ,1 ,1 ,4 );
473+ SPECIALIZE_FORMAT (R16G16B16A16_SFLOAT,SIZE_64_BIT,Float,SignedBit,1 ,1 ,1 ,4 );
474+ SPECIALIZE_FORMAT (R32_UINT,SIZE_32_BIT,Integer,None ,1 ,1 ,1 ,1 );
475+ SPECIALIZE_FORMAT (R32_SINT,SIZE_32_BIT,Integer,SignedBit,1 ,1 ,1 ,1 );
476+ SPECIALIZE_FORMAT (R32_SFLOAT,SIZE_32_BIT,Float,SignedBit,1 ,1 ,1 ,1 );
477+ SPECIALIZE_FORMAT (R32G32_UINT,SIZE_64_BIT,Integer,None ,1 ,1 ,1 ,2 );
478+ SPECIALIZE_FORMAT (R32G32_SINT,SIZE_64_BIT,Integer,SignedBit,1 ,1 ,1 ,2 );
479+ SPECIALIZE_FORMAT (R32G32_SFLOAT,SIZE_64_BIT,Float,SignedBit,1 ,1 ,1 ,2 );
480+ SPECIALIZE_FORMAT (R32G32B32_UINT,SIZE_96_BIT,Integer,None ,1 ,1 ,1 ,3 );
481+ SPECIALIZE_FORMAT (R32G32B32_SINT,SIZE_96_BIT,Integer,SignedBit,1 ,1 ,1 ,3 );
482+ SPECIALIZE_FORMAT (R32G32B32_SFLOAT,SIZE_96_BIT,Float,SignedBit,1 ,1 ,1 ,3 );
483+ SPECIALIZE_FORMAT (R32G32B32A32_UINT,SIZE_128_BIT,Integer,None ,1 ,1 ,1 ,4 );
484+ SPECIALIZE_FORMAT (R32G32B32A32_SINT,SIZE_128_BIT,Integer,SignedBit,1 ,1 ,1 ,4 );
485+ SPECIALIZE_FORMAT (R32G32B32A32_SFLOAT,SIZE_128_BIT,Float,SignedBit,1 ,1 ,1 ,4 );
486+ SPECIALIZE_FORMAT (R64_UINT,SIZE_64_BIT,Integer,None ,1 ,1 ,1 ,1 );
487+ SPECIALIZE_FORMAT (R64_SINT,SIZE_64_BIT,Integer,SignedBit,1 ,1 ,1 ,1 );
488+ SPECIALIZE_FORMAT (R64_SFLOAT,SIZE_64_BIT,Float,SignedBit,1 ,1 ,1 ,1 );
489+ SPECIALIZE_FORMAT (R64G64_UINT,SIZE_128_BIT,Integer,None ,1 ,1 ,1 ,2 );
490+ SPECIALIZE_FORMAT (R64G64_SINT,SIZE_128_BIT,Integer,SignedBit,1 ,1 ,1 ,2 );
491+ SPECIALIZE_FORMAT (R64G64_SFLOAT,SIZE_128_BIT,Float,SignedBit,1 ,1 ,1 ,2 );
492+ SPECIALIZE_FORMAT (R64G64B64_UINT,SIZE_192_BIT,Integer,None ,1 ,1 ,1 ,3 );
493+ SPECIALIZE_FORMAT (R64G64B64_SINT,SIZE_192_BIT,Integer,SignedBit,1 ,1 ,1 ,3 );
494+ SPECIALIZE_FORMAT (R64G64B64_SFLOAT,SIZE_192_BIT,Float,SignedBit,1 ,1 ,1 ,3 );
495+ SPECIALIZE_FORMAT (R64G64B64A64_UINT,SIZE_256_BIT,Integer,None ,1 ,1 ,1 ,4 );
496+ SPECIALIZE_FORMAT (R64G64B64A64_SINT,SIZE_256_BIT,Integer,SignedBit,1 ,1 ,1 ,4 );
497+ SPECIALIZE_FORMAT (R64G64B64A64_SFLOAT,SIZE_256_BIT,Float,SignedBit,1 ,1 ,1 ,4 );
498+ SPECIALIZE_FORMAT (B10G11R11_UFLOAT_PACK32,SIZE_32_BIT,Float,BGRABit,1 ,1 ,1 ,3 );
499+ SPECIALIZE_FORMAT (E5B9G9R9_UFLOAT_PACK32,SIZE_32_BIT,Float,BGRABit,1 ,1 ,1 ,3 );
500+ // TODO: now do block compression formats!
380501#undef SPECIALIZE_FORMAT
381502
382503// TODO: add a `rational<T,Num,Den>` to `mpl` namespace
@@ -402,7 +523,7 @@ struct static_cast_helper<format::view_class_traits<format::BlockViewClass::BVC_
402523 using T = format::view_class_traits<format::BlockViewClass::BVC_UNKNOWN>;
403524 using U = format::view_class_traits<ConstexprT>;
404525
405- static inline T cast (U val)
526+ static inline T cast (const U val)
406527 {
407528 T retval;
408529 retval.Class = U::Class;
@@ -419,10 +540,11 @@ struct static_cast_helper<format::block_traits<format::TexelBlockFormat::TBF_UNK
419540 using T = format::block_traits<format::TexelBlockFormat::TBF_UNKNOWN>;
420541 using U = format::block_traits<ConstexprT>;
421542
422- static inline T cast (U val)
543+ static inline T cast (const U val)
423544 {
424545 T retval;
425- retval.ClassTraits = _static_cast<format::view_class_traits<>,U::class_traits_t>();
546+ typename U::class_traits_t dummy;
547+ retval.ClassTraits = _static_cast<format::view_class_traits<> >(dummy);
426548 retval.DecodeTypeID = U::DecodeTypeID;
427549 retval.Kind = U::Kind;
428550 retval.Attributes = U::Attributes;
@@ -468,7 +590,149 @@ inline view_class_traits<> getTraits(const BlockViewClass _class)
468590 return retval;
469591}
470592
471- // TODO: block_traits<> getTraits(const TexelBlockFormatTraits format)
593+ inline block_traits<> getTraits (const TexelBlockFormat format)
594+ {
595+ using dynamic_t = block_traits<>;
596+ dynamic_t retval;
597+ switch (format)
598+ {
599+ #define CASE (FORMAT) case TexelBlockFormat::FORMAT: \
600+ { \
601+ const block_traits<TexelBlockFormat::FORMAT> tmp; \
602+ retval = _static_cast<dynamic_t>(tmp); \
603+ break ; \
604+ }
605+ // TODO: depth and stencil
606+ CASE (R4G4_UNORM_PACK8)
607+ CASE (R4G4B4A4_UNORM_PACK16)
608+ CASE (B4G4R4A4_UNORM_PACK16)
609+ CASE (R5G6B5_UNORM_PACK16)
610+ CASE (B5G6R5_UNORM_PACK16)
611+ CASE (R5G5B5A1_UNORM_PACK16)
612+ CASE (B5G5R5A1_UNORM_PACK16)
613+ CASE (A1R5G5B5_UNORM_PACK16)
614+ CASE (R8_UNORM)
615+ CASE (R8_SNORM)
616+ CASE (R8_USCALED)
617+ CASE (R8_SSCALED)
618+ CASE (R8_UINT)
619+ CASE (R8_SINT)
620+ CASE (R8_SRGB)
621+ CASE (R8G8_UNORM)
622+ CASE (R8G8_SNORM)
623+ CASE (R8G8_USCALED)
624+ CASE (R8G8_SSCALED)
625+ CASE (R8G8_UINT)
626+ CASE (R8G8_SINT)
627+ CASE (R8G8_SRGB)
628+ CASE (R8G8B8_UNORM)
629+ CASE (R8G8B8_SNORM)
630+ CASE (R8G8B8_USCALED)
631+ CASE (R8G8B8_SSCALED)
632+ CASE (R8G8B8_UINT)
633+ CASE (R8G8B8_SINT)
634+ CASE (R8G8B8_SRGB)
635+ CASE (B8G8R8_UNORM)
636+ CASE (B8G8R8_SNORM)
637+ CASE (B8G8R8_USCALED)
638+ CASE (B8G8R8_SSCALED)
639+ CASE (B8G8R8_UINT)
640+ CASE (B8G8R8_SINT)
641+ CASE (B8G8R8_SRGB)
642+ CASE (R8G8B8A8_UNORM)
643+ CASE (R8G8B8A8_SNORM)
644+ CASE (R8G8B8A8_USCALED)
645+ CASE (R8G8B8A8_SSCALED)
646+ CASE (R8G8B8A8_UINT)
647+ CASE (R8G8B8A8_SINT)
648+ CASE (R8G8B8A8_SRGB)
649+ CASE (B8G8R8A8_UNORM)
650+ CASE (B8G8R8A8_SNORM)
651+ CASE (B8G8R8A8_USCALED)
652+ CASE (B8G8R8A8_SSCALED)
653+ CASE (B8G8R8A8_UINT)
654+ CASE (B8G8R8A8_SINT)
655+ CASE (B8G8R8A8_SRGB)
656+ CASE (A8B8G8R8_UNORM_PACK32)
657+ CASE (A8B8G8R8_SNORM_PACK32)
658+ CASE (A8B8G8R8_USCALED_PACK32)
659+ CASE (A8B8G8R8_SSCALED_PACK32)
660+ CASE (A8B8G8R8_UINT_PACK32)
661+ CASE (A8B8G8R8_SINT_PACK32)
662+ CASE (A8B8G8R8_SRGB_PACK32)
663+ CASE (A2R10G10B10_UNORM_PACK32)
664+ CASE (A2R10G10B10_SNORM_PACK32)
665+ CASE (A2R10G10B10_USCALED_PACK32)
666+ CASE (A2R10G10B10_SSCALED_PACK32)
667+ CASE (A2R10G10B10_UINT_PACK32)
668+ CASE (A2R10G10B10_SINT_PACK32)
669+ CASE (A2B10G10R10_UNORM_PACK32)
670+ CASE (A2B10G10R10_SNORM_PACK32)
671+ CASE (A2B10G10R10_USCALED_PACK32)
672+ CASE (A2B10G10R10_SSCALED_PACK32)
673+ CASE (A2B10G10R10_UINT_PACK32)
674+ CASE (A2B10G10R10_SINT_PACK32)
675+ CASE (R16_UNORM)
676+ CASE (R16_SNORM)
677+ CASE (R16_USCALED)
678+ CASE (R16_SSCALED)
679+ CASE (R16_UINT)
680+ CASE (R16_SINT)
681+ CASE (R16_SFLOAT)
682+ CASE (R16G16_UNORM)
683+ CASE (R16G16_SNORM)
684+ CASE (R16G16_USCALED)
685+ CASE (R16G16_SSCALED)
686+ CASE (R16G16_UINT)
687+ CASE (R16G16_SINT)
688+ CASE (R16G16_SFLOAT)
689+ CASE (R16G16B16_UNORM)
690+ CASE (R16G16B16_SNORM)
691+ CASE (R16G16B16_USCALED)
692+ CASE (R16G16B16_SSCALED)
693+ CASE (R16G16B16_UINT)
694+ CASE (R16G16B16_SINT)
695+ CASE (R16G16B16_SFLOAT)
696+ CASE (R16G16B16A16_UNORM)
697+ CASE (R16G16B16A16_SNORM)
698+ CASE (R16G16B16A16_USCALED)
699+ CASE (R16G16B16A16_SSCALED)
700+ CASE (R16G16B16A16_UINT)
701+ CASE (R16G16B16A16_SINT)
702+ CASE (R16G16B16A16_SFLOAT)
703+ CASE (R32_UINT)
704+ CASE (R32_SINT)
705+ CASE (R32_SFLOAT)
706+ CASE (R32G32_UINT)
707+ CASE (R32G32_SINT)
708+ CASE (R32G32_SFLOAT)
709+ CASE (R32G32B32_UINT)
710+ CASE (R32G32B32_SINT)
711+ CASE (R32G32B32_SFLOAT)
712+ CASE (R32G32B32A32_UINT)
713+ CASE (R32G32B32A32_SINT)
714+ CASE (R32G32B32A32_SFLOAT)
715+ CASE (R64_UINT)
716+ CASE (R64_SINT)
717+ CASE (R64_SFLOAT)
718+ CASE (R64G64_UINT)
719+ CASE (R64G64_SINT)
720+ CASE (R64G64_SFLOAT)
721+ CASE (R64G64B64_UINT)
722+ CASE (R64G64B64_SINT)
723+ CASE (R64G64B64_SFLOAT)
724+ CASE (R64G64B64A64_UINT)
725+ CASE (R64G64B64A64_SINT)
726+ CASE (R64G64B64A64_SFLOAT)
727+ CASE (B10G11R11_UFLOAT_PACK32)
728+ CASE (E5B9G9R9_UFLOAT_PACK32)
729+ // TODO: block compressed
730+ #undef CASE
731+ default :
732+ break ;
733+ }
734+ return retval;
735+ }
472736
473737// TODO: move `core::rational<T>` to HLSL
474738/*
0 commit comments