@@ -22,33 +22,46 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
2222 uint32_t wgCount[3 ];
2323 };
2424
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 )
2727 {
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;
3129
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))
3235 {
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;
4239 }
43-
40+ else
4441 {
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;
4846
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;
5151 }
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);
5265
5366 asset::SPushConstantRange pcRange = {};
5467 {
@@ -69,16 +82,10 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
6982 return nullptr;
7083
7184 return result;
85+ */
86+ return nullptr ;
7287 }
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
8289 inline core::smart_refctd_ptr<video::IGPUDescriptorSetLayout> getDefaultBlitDescriptorSetLayout(const asset::IBlitUtilities::E_ALPHA_SEMANTIC alphaSemantic) const
8390 {
8491 if (alphaSemantic == asset::IBlitUtilities::EAS_REFERENCE_OR_COVERAGE)
@@ -104,7 +111,7 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
104111 {
105112 return m_coverageAdjustmentPipelineLayout;
106113 }
107-
114+ # endif
108115 // @param `alphaBinCount` is only required to size the histogram present in the default nbl_glsl_blit_AlphaStatistics_t in default_compute_common.comp
109116 core::smart_refctd_ptr<video::IGPUShader> createAlphaTestSpecializedShader (const asset::IImage::E_TYPE inImageType, const uint32_t alphaBinCount = asset::IBlitUtilities::DefaultAlphaBinCount);
110117
@@ -699,54 +706,6 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
699706 }
700707 }
701708
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-
750709 private:
751710 enum E_BLIT_TYPE : uint8_t
752711 {
@@ -755,12 +714,6 @@ class NBL_API2 CComputeBlit : public core::IReferenceCounted
755714 EBT_COUNT
756715 };
757716
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-
764717 core::smart_refctd_ptr<video::IGPUComputePipeline> m_alphaTestPipelines[asset::IBlitUtilities::MaxAlphaBinCount / asset::IBlitUtilities::MinAlphaBinCount][asset::IImage::ET_COUNT] = { nullptr };
765718
766719 struct SNormalizationCacheKey
0 commit comments