3
3
4
4
#include "nbl/builtin/hlsl/format/shared_exp.hlsl"
5
5
#include "nbl/builtin/hlsl/format/octahedral.hlsl"
6
+ #include "nbl/builtin/hlsl/type_traits.hlsl"
6
7
7
8
namespace nbl
8
9
{
@@ -223,6 +224,7 @@ enum TexelBlockFormat : uint32_t
223
224
TBF_COUNT = TBF_UNKNOWN
224
225
};
225
226
227
+ // TODO: apparently depth/stencil texel blocks are not compatible with anything else, so need to add
226
228
enum BlockViewClass : uint32_t
227
229
{
228
230
SIZE_8_BIT,
@@ -281,24 +283,26 @@ struct view_class_traits
281
283
uint32_t Alignment;
282
284
};
283
285
#define SPECIALIZE_CLASS (CLASS,RAWFMT,SIZE,ALIGNMENT) template<> \
284
- struct view_class_traits<CLASS> \
286
+ struct view_class_traits<BlockViewClass:: CLASS> \
285
287
{ \
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; \
288
290
NBL_CONSTEXPR_STATIC_INLINE uint32_t ByteSize = SIZE; \
289
291
NBL_CONSTEXPR_STATIC_INLINE uint32_t Alignment = ALIGNMENT; \
290
292
}
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
300
302
#undef SPECIALIZE_CLASS
301
303
304
+
305
+ //! Block Format Traits
302
306
enum TexelKind
303
307
{
304
308
Float = 0 ,
@@ -310,11 +314,12 @@ enum TexelKind
310
314
311
315
enum TexelAttributes : uint32_t
312
316
{
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
318
323
};
319
324
320
325
// default is invalid/runtime dynamic
@@ -324,7 +329,7 @@ struct block_traits
324
329
view_class_traits<> ClassTraits;
325
330
// float int uint
326
331
#ifndef __HLSL_VERSION
327
- std::type_info* DecodeTypeID;
332
+ const std::type_info* DecodeTypeID;
328
333
#else
329
334
uint32_t DecodeTypeID;
330
335
#endif
@@ -335,46 +340,62 @@ struct block_traits
335
340
uint32_t BlockSizeY;
336
341
uint32_t BlockSizeZ;
337
342
uint32_t Channels;
338
- // bits per pixel
339
- // TODO: rational in HLSL
340
- uint32_t BPPNum;
341
- uint32_t BPPDen;
342
343
};
343
344
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>;
350
345
#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
+ }
352
359
#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
+ }
354
373
#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
359
381
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> ;
363
385
364
- /*
365
386
template<TexelBlockFormat Format>
366
387
struct texel_block
367
388
{
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];
369
392
};
370
- */
371
393
}
372
394
373
395
// conversion ops for constant to runtime traits
374
396
namespace impl
375
397
{
376
398
377
-
378
399
template<format::BlockViewClass ConstexprT>
379
400
struct _static_cast_helper<format::view_class_traits<format::BlockViewClass::BVC_UNKNOWN>,format::view_class_traits<ConstexprT> >
380
401
{
@@ -392,7 +413,76 @@ struct _static_cast_helper<format::view_class_traits<format::BlockViewClass::BVC
392
413
}
393
414
};
394
415
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
+ */
396
486
397
487
}
398
488
}
0 commit comments