Skip to content

Commit ea99876

Browse files
author
devsh
committed
draft
1 parent 1dcf842 commit ea99876

File tree

2 files changed

+37
-85
lines changed

2 files changed

+37
-85
lines changed

include/nbl/builtin/hlsl/blit/parameters.hlsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ namespace blit
1414

1515
struct parameters_t
1616
{
17-
1817
float32_t3 fScale;
1918
float32_t3 negativeSupport;
2019
float32_t referenceAlpha;

include/nbl/video/utilities/CComputeBlit.h

Lines changed: 37 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)