@@ -22,33 +22,46 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
22
22
uint32_t wgCount[3 ];
23
23
};
24
24
25
- // ! Set smemSize param to ~0u to use all the shared memory available.
26
- static core::smart_refctd_ptr<CComputeBlit> create (core::smart_refctd_ptr<video::ILogicalDevice>&& logicalDevice, const uint32_t smemSize = ~ 0u )
25
+ // Coverage adjustment needs alpha to be stored in HDR with high precision
26
+ static inline asset::E_FORMAT getCoverageAdjustmentIntermediateFormat ( const asset::E_FORMAT format )
27
27
{
28
- auto result = core::smart_refctd_ptr<CComputeBlit>(new CComputeBlit (std::move (logicalDevice)), core::dont_grab);
29
-
30
- result->setAvailableSharedMemory (smemSize);
28
+ using namespace nbl ::asset;
31
29
30
+ if (getFormatChannelCount (format)<4 || isIntegerFormat (format))
31
+ return EF_UNKNOWN;
32
+
33
+ const float precision = asset::getFormatPrecision (format,3 ,0 .f );
34
+ if (isFloatingPointFormat (format))
32
35
{
33
- constexpr auto BlitDescriptorCount = 3 ;
34
- const asset::IDescriptor::E_TYPE types[BlitDescriptorCount] = { asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER, asset::IDescriptor::E_TYPE::ET_STORAGE_IMAGE, asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER }; // input image, output image, alpha statistics
35
-
36
- for (auto i = 0 ; i < static_cast <uint8_t >(EBT_COUNT); ++i)
37
- {
38
- result->m_blitDSLayout [i] = result->createDSLayout (i == static_cast <uint8_t >(EBT_COVERAGE_ADJUSTMENT) ? 3 : 2 , types, result->m_device .get ());
39
- if (!result->m_blitDSLayout [i])
40
- return nullptr ;
41
- }
36
+ if (precision<std::numeric_limits<hlsl::float16_t >::min ())
37
+ return EF_R32_SFLOAT;
38
+ return EF_R16_SFLOAT;
42
39
}
43
-
40
+ else
44
41
{
45
- constexpr auto KernelWeightsDescriptorCount = 1 ;
46
- asset::IDescriptor::E_TYPE types[KernelWeightsDescriptorCount] = { asset::IDescriptor::E_TYPE::ET_UNIFORM_TEXEL_BUFFER };
47
- result->m_kernelWeightsDSLayout = result->createDSLayout (KernelWeightsDescriptorCount, types, result->m_device .get ());
42
+ const bool sign = isSignedFormat (format);
43
+ // there's no 24 or 32 bit normalized formats
44
+ if (precision*((sign ? (0x1u <<16 ):(0x1u <<15 ))-1 )<1 .f )
45
+ return EF_R32_SFLOAT;
48
46
49
- if (!result->m_kernelWeightsDSLayout )
50
- return nullptr ;
47
+ if (precision<1 .f /255 .f )
48
+ return sign ? EF_R8_SNORM:EF_R8_UNORM;
49
+ else
50
+ return sign ? EF_R16_SNORM:EF_R16_UNORM;
51
51
}
52
+ }
53
+
54
+ static core::smart_refctd_ptr<CComputeBlit> create (core::smart_refctd_ptr<video::ILogicalDevice>&& logicalDevice)
55
+ {
56
+ if (!logicalDevice)
57
+ return nullptr ;
58
+ /*
59
+ auto result = core::smart_refctd_ptr<CComputeBlitCComputeBlit>(new CComputeBlit(std::move(logicalDevice)), core::dont_grab);
60
+
61
+ if (smemSize == ~0u)
62
+ m_availableSharedMemory = m_device->getPhysicalDevice()->getProperties().limits.maxComputeSharedMemorySize;
63
+ else
64
+ m_availableSharedMemory = core::min(core::roundUp(smemSize, static_cast<uint32_t>(sizeof(float) * 64)), m_device->getPhysicalDevice()->getLimits().maxComputeSharedMemorySize);
52
65
53
66
asset::SPushConstantRange pcRange = {};
54
67
{
@@ -69,16 +82,10 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
69
82
return nullptr;
70
83
71
84
return result;
85
+ */
86
+ return nullptr ;
72
87
}
73
-
74
- inline void setAvailableSharedMemory (const uint32_t smemSize)
75
- {
76
- if (smemSize == ~0u )
77
- m_availableSharedMemory = m_device->getPhysicalDevice ()->getProperties ().limits .maxComputeSharedMemorySize ;
78
- else
79
- m_availableSharedMemory = core::min (core::roundUp (smemSize, static_cast <uint32_t >(sizeof (float ) * 64 )), m_device->getPhysicalDevice ()->getLimits ().maxComputeSharedMemorySize );
80
- }
81
-
88
+ #if 0
82
89
inline core::smart_refctd_ptr<video::IGPUDescriptorSetLayout> getDefaultBlitDescriptorSetLayout(const asset::IBlitUtilities::E_ALPHA_SEMANTIC alphaSemantic) const
83
90
{
84
91
if (alphaSemantic == asset::IBlitUtilities::EAS_REFERENCE_OR_COVERAGE)
@@ -104,7 +111,7 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
104
111
{
105
112
return m_coverageAdjustmentPipelineLayout;
106
113
}
107
-
114
+ # endif
108
115
// @param `alphaBinCount` is only required to size the histogram present in the default nbl_glsl_blit_AlphaStatistics_t in default_compute_common.comp
109
116
core::smart_refctd_ptr<video::IGPUShader> createAlphaTestSpecializedShader (const asset::IImage::E_TYPE inImageType, const uint32_t alphaBinCount = asset::IBlitUtilities::DefaultAlphaBinCount);
110
117
@@ -699,54 +706,6 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
699
706
}
700
707
}
701
708
702
- static inline asset::E_FORMAT getCoverageAdjustmentIntermediateFormat (const asset::E_FORMAT format)
703
- {
704
- using namespace nbl ::asset;
705
-
706
- switch (format)
707
- {
708
- case EF_R32G32B32A32_SFLOAT:
709
- case EF_R16G16B16A16_SFLOAT:
710
- case EF_R16G16B16A16_UNORM:
711
- case EF_R16G16B16A16_SNORM:
712
- return EF_R32G32B32A32_SFLOAT;
713
-
714
- case EF_R32G32_SFLOAT:
715
- case EF_R16G16_SFLOAT:
716
- case EF_R16G16_UNORM:
717
- case EF_R16G16_SNORM:
718
- return EF_R32G32_SFLOAT;
719
-
720
- case EF_B10G11R11_UFLOAT_PACK32:
721
- return EF_R16G16B16A16_SFLOAT;
722
-
723
- case EF_R32_SFLOAT:
724
- case EF_R16_SFLOAT:
725
- case EF_R16_UNORM:
726
- case EF_R16_SNORM:
727
- return EF_R32_SFLOAT;
728
-
729
- case EF_A2B10G10R10_UNORM_PACK32:
730
- case EF_R8G8B8A8_UNORM:
731
- return EF_R16G16B16A16_UNORM;
732
-
733
- case EF_R8G8_UNORM:
734
- return EF_R16G16_UNORM;
735
-
736
- case EF_R8_UNORM:
737
- return EF_R16_UNORM;
738
-
739
- case EF_R8G8B8A8_SNORM:
740
- return EF_R16G16B16A16_SNORM;
741
-
742
- case EF_R8G8_SNORM:
743
- return EF_R16G16_SNORM;
744
-
745
- default :
746
- return EF_UNKNOWN;
747
- }
748
- }
749
-
750
709
private:
751
710
enum E_BLIT_TYPE : uint8_t
752
711
{
@@ -755,12 +714,6 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
755
714
EBT_COUNT
756
715
};
757
716
758
- core::smart_refctd_ptr<video::IGPUDescriptorSetLayout> m_blitDSLayout[EBT_COUNT];
759
- core::smart_refctd_ptr<video::IGPUDescriptorSetLayout> m_kernelWeightsDSLayout;
760
-
761
- core::smart_refctd_ptr<video::IGPUPipelineLayout> m_blitPipelineLayout[EBT_COUNT];
762
- core::smart_refctd_ptr<video::IGPUPipelineLayout> m_coverageAdjustmentPipelineLayout;
763
-
764
717
core::smart_refctd_ptr<video::IGPUComputePipeline> m_alphaTestPipelines[asset::IBlitUtilities::MaxAlphaBinCount / asset::IBlitUtilities::MinAlphaBinCount][asset::IImage::ET_COUNT] = { nullptr };
765
718
766
719
struct SNormalizationCacheKey
0 commit comments