33
44#include "nbl/builtin/hlsl/format/shared_exp.hlsl"
55#include "nbl/builtin/hlsl/format/octahedral.hlsl"
6+ #include "nbl/builtin/hlsl/type_traits.hlsl"
67
78namespace nbl
89{
@@ -223,6 +224,7 @@ enum TexelBlockFormat : uint32_t
223224 TBF_COUNT = TBF_UNKNOWN
224225};
225226
227+ // TODO: apparently depth/stencil texel blocks are not compatible with anything else, so need to add
226228enum BlockViewClass : uint32_t
227229{
228230 SIZE_8_BIT,
@@ -281,24 +283,26 @@ struct view_class_traits
281283 uint32_t Alignment;
282284};
283285#define SPECIALIZE_CLASS (CLASS,RAWFMT,SIZE,ALIGNMENT) template<> \
284- struct view_class_traits<CLASS> \
286+ struct view_class_traits<BlockViewClass:: CLASS> \
285287{ \
286- NBL_CONSTEXPR_STATIC_INLINE BlockViewClass Class = CLASS; \
287- NBL_CONSTEXPR_STATIC_INLINE TexelBlockFormat RawAccessViewFormat = RAWFMT; \
288+ NBL_CONSTEXPR_STATIC_INLINE BlockViewClass Class = BlockViewClass:: CLASS; \
289+ NBL_CONSTEXPR_STATIC_INLINE TexelBlockFormat RawAccessViewFormat = TexelBlockFormat:: RAWFMT; \
288290 NBL_CONSTEXPR_STATIC_INLINE uint32_t ByteSize = SIZE; \
289291 NBL_CONSTEXPR_STATIC_INLINE uint32_t Alignment = ALIGNMENT; \
290292}
291- SPECIALIZE_CLASS (BlockViewClass:: SIZE_8_BIT,TexelBlockFormat:: R8_UINT,1 ,1 );
292- SPECIALIZE_CLASS (BlockViewClass:: SIZE_16_BIT,TexelBlockFormat:: R16_UINT,2 ,2 );
293- SPECIALIZE_CLASS (BlockViewClass:: SIZE_32_BIT,TexelBlockFormat:: R32_UINT,4 ,4 );
294- SPECIALIZE_CLASS (BlockViewClass:: SIZE_64_BIT,TexelBlockFormat:: R32G32_UINT,8 ,4 );
295- SPECIALIZE_CLASS (BlockViewClass:: SIZE_96_BIT,TexelBlockFormat:: R32G32B32_UINT,12 ,4 );
296- SPECIALIZE_CLASS (BlockViewClass:: SIZE_128_BIT,TexelBlockFormat:: R32G32B32A32_UINT,16 ,4 );
297- SPECIALIZE_CLASS (BlockViewClass:: SIZE_192_BIT,TexelBlockFormat:: R64G64B64_UINT,24 ,8 );
298- SPECIALIZE_CLASS (BlockViewClass:: SIZE_256_BIT,TexelBlockFormat:: R64G64B64A64_UINT,32 ,8 );
299- // TODO: block compressed
293+ SPECIALIZE_CLASS (SIZE_8_BIT,R8_UINT,1 ,1 );
294+ SPECIALIZE_CLASS (SIZE_16_BIT,R16_UINT,2 ,2 );
295+ SPECIALIZE_CLASS (SIZE_32_BIT,R32_UINT,4 ,4 );
296+ SPECIALIZE_CLASS (SIZE_64_BIT,R32G32_UINT,8 ,4 );
297+ SPECIALIZE_CLASS (SIZE_96_BIT,R32G32B32_UINT,12 ,4 );
298+ SPECIALIZE_CLASS (SIZE_128_BIT,R32G32B32A32_UINT,16 ,4 );
299+ SPECIALIZE_CLASS (SIZE_192_BIT,R64G64B64_UINT,24 ,8 );
300+ SPECIALIZE_CLASS (SIZE_256_BIT,R64G64B64A64_UINT,32 ,8 );
301+ // TODO: depth and block compressed
300302#undef SPECIALIZE_CLASS
301303
304+
305+ //! Block Format Traits
302306enum TexelKind
303307{
304308 Float = 0 ,
@@ -310,11 +314,12 @@ enum TexelKind
310314
311315enum TexelAttributes : uint32_t
312316{
313- HasDepthBit,
314- HasStencilBit,
315- BGRABit,
316- SignedBit,
317- CompressedBit
317+ None = 0b00000u,
318+ HasDepthBit = 0b00001u,
319+ HasStencilBit = 0b00010u,
320+ BGRABit = 0b00100u,
321+ SignedBit = 0b01000u,
322+ CompressedBit = 0b10000u
318323};
319324
320325// default is invalid/runtime dynamic
@@ -324,7 +329,7 @@ struct block_traits
324329 view_class_traits<> ClassTraits;
325330 // float int uint
326331#ifndef __HLSL_VERSION
327- std::type_info* DecodeTypeID;
332+ const std::type_info* DecodeTypeID;
328333#else
329334 uint32_t DecodeTypeID;
330335#endif
@@ -335,46 +340,62 @@ struct block_traits
335340 uint32_t BlockSizeY;
336341 uint32_t BlockSizeZ;
337342 uint32_t Channels;
338- // bits per pixel
339- // TODO: rational in HLSL
340- uint32_t BPPNum;
341- uint32_t BPPDen;
342343};
343344
344- // TODO: turn into a macro so we can fast-define this
345- template<>
346- struct block_traits<TexelBlockFormat::B8G8R8A8_SRGB>
347- {
348- NBL_CONSTEXPR_STATIC_INLINE BlockViewClass Class = BlockViewClass::SIZE_32_BIT;
349- using class_traits_t = view_class_traits<Class>;
350345#ifndef __HLSL_VERSION
351- NBL_CONSTEXPR_STATIC_INLINE std::type_info* DecodeTypeID = &typeid (float );
346+ #define SPECIALIZE_FORMAT (FORMAT,CLASS,KIND,ATTRS,W,H,D,C) template<> \
347+ struct block_traits<TexelBlockFormat::FORMAT> \
348+ { \
349+ using class_traits_t = view_class_traits<BlockViewClass::CLASS>; \
350+ NBL_CONSTEXPR_STATIC_INLINE class_traits_t ClassTraits; \
351+ NBL_CONSTEXPR_STATIC_INLINE const std::type_info* DecodeTypeID = &typeid (float ); \
352+ NBL_CONSTEXPR_STATIC_INLINE TexelKind Kind = KIND; \
353+ NBL_CONSTEXPR_STATIC_INLINE TexelAttributes Attributes = ATTRS; \
354+ NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeX = W; \
355+ NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeY = H; \
356+ NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeZ = D; \
357+ NBL_CONSTEXPR_STATIC_INLINE uint32_t Channels = C; \
358+ }
352359#else
353- NBL_CONSTEXPR_STATIC_INLINE uint32_t DecodeTypeID = impl::typeid_t<float >::value;
360+ #define SPECIALIZE_FORMAT (FORMAT,CLASS,KIND,ATTRS,W,H,D,C) template<> \
361+ struct block_traits<TexelBlockFormat::FORMAT> \
362+ { \
363+ using class_traits_t = view_class_traits<BlockViewClass::CLASS>; \
364+ NBL_CONSTEXPR_STATIC_INLINE class_traits_t ClassTraits; \
365+ NBL_CONSTEXPR_STATIC_INLINE uint32_t DecodeTypeID = impl::typeid_t<float >::value; \
366+ NBL_CONSTEXPR_STATIC_INLINE TexelKind Kind = KIND; \
367+ NBL_CONSTEXPR_STATIC_INLINE TexelAttributes Attributes = ATTRS; \
368+ NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeX = W; \
369+ NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeY = H; \
370+ NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeZ = D; \
371+ NBL_CONSTEXPR_STATIC_INLINE uint32_t Channels = C; \
372+ }
354373#endif
355- NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeX = 1 ;
356- NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeY = 1 ;
357- NBL_CONSTEXPR_STATIC_INLINE uint32_t BlockSizeZ = 1 ;
358- NBL_CONSTEXPR_STATIC_INLINE uint32_t Channels = 4 ;
374+ //SPECIALIZE_FORMAT(D16_UNORM,BVC_UNKNOWN,Normalized,HasDepthBit,1,1,1,1);
375+ // TODO: now do the rest
376+ SPECIALIZE_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
380+ #undef SPECIALIZE_FORMAT
359381
360- NBL_CONSTEXPR_STATIC_INLINE uint32_t BPPNum = 32 ;
361- NBL_CONSTEXPR_STATIC_INLINE uint32_t BPPDen = 1 ;
362- } ;
382+ // TODO: add a `rational<T,Num,Den>` to `mpl` namespace
383+ //template<TexelBlockFormat Format>
384+ //using bits_per_pixel = mpl::rational<uint32_t,(typename block_traits<Format>::class_traits_t)::Size,block_traits<Format>::W*block_traits<Format>::H*block_traits<Format>::D> ;
363385
364- /*
365386template<TexelBlockFormat Format>
366387struct texel_block
367388{
368- unsigned_of_size<traits<Format>::alignment> storage[traits<Format>::ByteSize/traits<Format>::Alignment];
389+ using class_traits_t = block_traits<Format>::class_traits_t;
390+
391+ unsigned_integer_of_size_t<class_traits_t::alignment> storage[class_traits_t::ByteSize/class_traits_t::Alignment];
369392};
370- */
371393}
372394
373395// conversion ops for constant to runtime traits
374396namespace impl
375397{
376398
377-
378399template<format::BlockViewClass ConstexprT>
379400struct _static_cast_helper<format::view_class_traits<format::BlockViewClass::BVC_UNKNOWN>,format::view_class_traits<ConstexprT> >
380401{
@@ -392,7 +413,76 @@ struct _static_cast_helper<format::view_class_traits<format::BlockViewClass::BVC
392413 }
393414};
394415
395- // TODO: specialization for the BlockTraits
416+ template<format::TexelBlockFormat ConstexprT>
417+ struct _static_cast_helper<format::block_traits<format::TexelBlockFormat::TBF_UNKNOWN>,format::block_traits<ConstexprT> >
418+ {
419+ using T = format::block_traits<format::TexelBlockFormat::TBF_UNKNOWN>;
420+ using U = format::block_traits<ConstexprT>;
421+
422+ T operator ()(U val)
423+ {
424+ T retval;
425+ retval.ClassTraits = _static_cast<format::view_class_traits<>,U::class_traits_t>();
426+ retval.DecodeTypeID = U::DecodeTypeID;
427+ retval.Kind = U::Kind;
428+ retval.Attributes = U::Attributes;
429+ retval.BlockSizeX = U::BlockSizeX;
430+ retval.BlockSizeY = U::BlockSizeY;
431+ retval.BlockSizeZ = U::BlockSizeZ;
432+ retval.Channels = U::Channels;
433+ return retval;
434+ }
435+ };
436+
437+ }
438+
439+ // back to format namespace
440+ namespace format
441+ {
442+
443+ view_class_traits<> getTraits (const BlockViewClass _class)
444+ {
445+ using dynamic_t = view_class_traits<>;
446+ dynamic_t retval;
447+ switch (_class)
448+ {
449+ #define CASE (CLASS) case BlockViewClass::CLASS: \
450+ { \
451+ const view_class_traits<BlockViewClass::CLASS> tmp; \
452+ retval = _static_cast<dynamic_t>(tmp); \
453+ break ; \
454+ }
455+ CASE (SIZE_8_BIT)
456+ CASE (SIZE_16_BIT)
457+ CASE (SIZE_32_BIT)
458+ CASE (SIZE_64_BIT)
459+ CASE (SIZE_96_BIT)
460+ CASE (SIZE_128_BIT)
461+ CASE (SIZE_192_BIT)
462+ CASE (SIZE_256_BIT)
463+ // TODO: depth and block compressed
464+ #undef CASE
465+ default :
466+ break ;
467+ }
468+ return retval;
469+ }
470+
471+ // TODO: block_traits<> getTraits(const TexelBlockFormatTraits format)
472+
473+ // TODO: move `core::rational<T>` to HLSL
474+ /*
475+ rational<uint32_t> getBitsPerPixel(const TexelBlockFormat format)
476+ {
477+ rational<uint32_t> retval;
478+ {
479+ block_traits<> traits = getTraits(format);
480+ retval.num = classTraits.ClassTraits.ByteSize;
481+ retval.den = classTraits.W*classTraits.H*classTraits.D;
482+ }
483+ return retval;
484+ }
485+ */
396486
397487}
398488}
0 commit comments