Skip to content

Commit 043aa92

Browse files
Merge pull request #84 from Devsh-Graphics-Programming/16k_denoiser
16k denoiser
2 parents 1243554 + 15dc4d0 commit 043aa92

File tree

8 files changed

+852
-275
lines changed

8 files changed

+852
-275
lines changed

examples_tests/23.Autoexposure/main.cpp

Lines changed: 81 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -38,69 +38,69 @@ int main()
3838
device->setEventReceiver(&receiver);
3939

4040
IVideoDriver* driver = device->getVideoDriver();
41-
42-
nbl::io::IFileSystem* filesystem = device->getFileSystem();
43-
IAssetManager* am = device->getAssetManager();
44-
45-
IAssetLoader::SAssetLoadParams lp;
46-
auto imageBundle = am->getAsset("../../media/noises/spp_benchmark_4k_512.exr", lp);
47-
48-
E_FORMAT inFormat;
49-
constexpr auto outFormat = EF_R8G8B8A8_SRGB;
50-
smart_refctd_ptr<IGPUImage> outImg;
51-
smart_refctd_ptr<IGPUImageView> imgToTonemapView,outImgView;
52-
{
53-
auto cpuImg = IAsset::castDown<ICPUImage>(imageBundle.getContents().begin()[0]);
54-
IGPUImage::SCreationParams imgInfo = cpuImg->getCreationParameters();
55-
inFormat = imgInfo.format;
56-
57-
auto gpuImages = driver->getGPUObjectsFromAssets(&cpuImg.get(),&cpuImg.get()+1);
58-
auto gpuImage = gpuImages->operator[](0u);
59-
60-
IGPUImageView::SCreationParams imgViewInfo;
61-
imgViewInfo.flags = static_cast<IGPUImageView::E_CREATE_FLAGS>(0u);
62-
imgViewInfo.image = std::move(gpuImage);
63-
imgViewInfo.viewType = IGPUImageView::ET_2D_ARRAY;
64-
imgViewInfo.format = inFormat;
65-
imgViewInfo.subresourceRange.aspectMask = static_cast<IImage::E_ASPECT_FLAGS>(0u);
66-
imgViewInfo.subresourceRange.baseMipLevel = 0;
67-
imgViewInfo.subresourceRange.levelCount = 1;
68-
imgViewInfo.subresourceRange.baseArrayLayer = 0;
69-
imgViewInfo.subresourceRange.layerCount = 1;
70-
imgToTonemapView = driver->createGPUImageView(IGPUImageView::SCreationParams(imgViewInfo));
71-
72-
imgInfo.format = outFormat;
73-
outImg = driver->createDeviceLocalGPUImageOnDedMem(std::move(imgInfo));
74-
75-
imgViewInfo.image = outImg;
76-
imgViewInfo.format = outFormat;
77-
outImgView = driver->createGPUImageView(IGPUImageView::SCreationParams(imgViewInfo));
78-
}
79-
80-
auto glslCompiler = am->getGLSLCompiler();
81-
const auto inputColorSpace = std::make_tuple(inFormat,ECP_SRGB,EOTF_IDENTITY);
82-
83-
using LumaMeterClass = ext::LumaMeter::CLumaMeter;
84-
constexpr auto MeterMode = LumaMeterClass::EMM_MEDIAN;
85-
const float minLuma = 1.f/2048.f;
86-
const float maxLuma = 65536.f;
87-
41+
42+
nbl::io::IFileSystem* filesystem = device->getFileSystem();
43+
IAssetManager* am = device->getAssetManager();
44+
45+
IAssetLoader::SAssetLoadParams lp;
46+
auto imageBundle = am->getAsset("../../media/noises/spp_benchmark_4k_512.exr", lp);
47+
48+
E_FORMAT inFormat;
49+
constexpr auto outFormat = EF_R8G8B8A8_SRGB;
50+
smart_refctd_ptr<IGPUImage> outImg;
51+
smart_refctd_ptr<IGPUImageView> imgToTonemapView,outImgView;
52+
{
53+
auto cpuImg = IAsset::castDown<ICPUImage>(imageBundle.getContents().begin()[0]);
54+
IGPUImage::SCreationParams imgInfo = cpuImg->getCreationParameters();
55+
inFormat = imgInfo.format;
56+
57+
auto gpuImages = driver->getGPUObjectsFromAssets(&cpuImg.get(),&cpuImg.get()+1);
58+
auto gpuImage = gpuImages->operator[](0u);
59+
60+
IGPUImageView::SCreationParams imgViewInfo;
61+
imgViewInfo.flags = static_cast<IGPUImageView::E_CREATE_FLAGS>(0u);
62+
imgViewInfo.image = std::move(gpuImage);
63+
imgViewInfo.viewType = IGPUImageView::ET_2D_ARRAY;
64+
imgViewInfo.format = inFormat;
65+
imgViewInfo.subresourceRange.aspectMask = static_cast<IImage::E_ASPECT_FLAGS>(0u);
66+
imgViewInfo.subresourceRange.baseMipLevel = 0;
67+
imgViewInfo.subresourceRange.levelCount = 1;
68+
imgViewInfo.subresourceRange.baseArrayLayer = 0;
69+
imgViewInfo.subresourceRange.layerCount = 1;
70+
imgToTonemapView = driver->createGPUImageView(IGPUImageView::SCreationParams(imgViewInfo));
71+
72+
imgInfo.format = outFormat;
73+
outImg = driver->createDeviceLocalGPUImageOnDedMem(std::move(imgInfo));
74+
75+
imgViewInfo.image = outImg;
76+
imgViewInfo.format = outFormat;
77+
outImgView = driver->createGPUImageView(IGPUImageView::SCreationParams(imgViewInfo));
78+
}
79+
80+
auto glslCompiler = am->getGLSLCompiler();
81+
const auto inputColorSpace = std::make_tuple(inFormat,ECP_SRGB,EOTF_IDENTITY);
82+
83+
using LumaMeterClass = ext::LumaMeter::CLumaMeter;
84+
constexpr auto MeterMode = LumaMeterClass::EMM_MEDIAN;
85+
const float minLuma = 1.f/2048.f;
86+
const float maxLuma = 65536.f;
87+
8888
auto cpuLumaMeasureSpecializedShader = LumaMeterClass::createShader(glslCompiler,inputColorSpace,MeterMode,minLuma,maxLuma);
8989
auto gpuLumaMeasureShader = driver->createGPUShader(smart_refctd_ptr<const ICPUShader>(cpuLumaMeasureSpecializedShader->getUnspecialized()));
9090
auto gpuLumaMeasureSpecializedShader = driver->createGPUSpecializedShader(gpuLumaMeasureShader.get(), cpuLumaMeasureSpecializedShader->getSpecializationInfo());
9191

9292
const float meteringMinUV[2] = { 0.1f,0.1f };
9393
const float meteringMaxUV[2] = { 0.9f,0.9f };
9494
LumaMeterClass::Uniforms_t<MeterMode> uniforms;
95-
auto lumaDispatchInfo = LumaMeterClass::buildParameters(uniforms, outImg->getCreationParameters().extent, meteringMinUV, meteringMaxUV);
95+
auto lumaDispatchInfo = LumaMeterClass::buildParameters(uniforms, outImg->getCreationParameters().extent, meteringMinUV, meteringMaxUV);
96+
97+
auto uniformBuffer = driver->createFilledDeviceLocalGPUBufferOnDedMem(sizeof(uniforms),&uniforms);
98+
9699

97-
auto uniformBuffer = driver->createFilledDeviceLocalGPUBufferOnDedMem(sizeof(uniforms),&uniforms);
98-
99-
100100
using ToneMapperClass = ext::ToneMapper::CToneMapper;
101-
constexpr auto TMO = ToneMapperClass::EO_ACES;
102-
constexpr bool usingLumaMeter = MeterMode<LumaMeterClass::EMM_COUNT;
103-
constexpr bool usingTemporalAdapatation = true;
101+
constexpr auto TMO = ToneMapperClass::EO_ACES;
102+
constexpr bool usingLumaMeter = MeterMode<LumaMeterClass::EMM_COUNT;
103+
constexpr bool usingTemporalAdapatation = true;
104104

105105
auto cpuTonemappingSpecializedShader = ToneMapperClass::createShader(am->getGLSLCompiler(),
106106
inputColorSpace,
@@ -115,30 +115,30 @@ int main()
115115
auto parameterBuffer = driver->createDeviceLocalGPUBufferOnDedMem(ToneMapperClass::getParameterBufferSize<TMO,MeterMode>());
116116
constexpr float Exposure = 0.f;
117117
constexpr float Key = 0.18;
118-
auto params = ToneMapperClass::Params_t<TMO>(Exposure, Key, 0.85f);
119-
{
120-
params.setAdaptationFactorFromFrameDelta(0.f);
118+
auto params = ToneMapperClass::Params_t<TMO>(Exposure, Key, 0.85f);
119+
{
120+
params.setAdaptationFactorFromFrameDelta(0.f);
121121
driver->updateBufferRangeViaStagingBuffer(parameterBuffer.get(),0u,sizeof(params),&params);
122122
}
123-
124-
auto commonPipelineLayout = ToneMapperClass::getDefaultPipelineLayout(driver,usingLumaMeter);
125-
126-
auto lumaMeteringPipeline = driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(commonPipelineLayout),std::move(gpuLumaMeasureSpecializedShader));
127-
auto toneMappingPipeline = driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(commonPipelineLayout),std::move(gpuTonemappingSpecializedShader));
123+
124+
auto commonPipelineLayout = ToneMapperClass::getDefaultPipelineLayout(driver,usingLumaMeter);
125+
126+
auto lumaMeteringPipeline = driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(commonPipelineLayout),std::move(gpuLumaMeasureSpecializedShader));
127+
auto toneMappingPipeline = driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(commonPipelineLayout),std::move(gpuTonemappingSpecializedShader));
128128

129129
auto commonDescriptorSet = driver->createGPUDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>(commonPipelineLayout->getDescriptorSetLayout(0u)));
130-
ToneMapperClass::updateDescriptorSet<TMO,MeterMode>(driver,commonDescriptorSet.get(),parameterBuffer,imgToTonemapView,outImgStorage,1u,2u,usingLumaMeter ? 3u:0u,uniformBuffer,0u,usingTemporalAdapatation);
130+
ToneMapperClass::updateDescriptorSet<TMO,MeterMode>(driver,commonDescriptorSet.get(),parameterBuffer,imgToTonemapView,outImgStorage,1u,2u,usingLumaMeter ? 3u:0u,uniformBuffer,0u,usingTemporalAdapatation);
131131

132132

133133
constexpr auto dynOffsetArrayLen = usingLumaMeter ? 2u : 1u;
134134

135-
auto lumaDynamicOffsetArray = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<uint32_t> >(dynOffsetArrayLen,0u);
135+
auto lumaDynamicOffsetArray = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<uint32_t> >(dynOffsetArrayLen,0u);
136136
lumaDynamicOffsetArray->back() = sizeof(ToneMapperClass::Params_t<TMO>);
137137

138-
auto toneDynamicOffsetArray = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<uint32_t> >(dynOffsetArrayLen,0u);
139-
140-
141-
auto blitFBO = driver->addFrameBuffer();
138+
auto toneDynamicOffsetArray = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<uint32_t> >(dynOffsetArrayLen,0u);
139+
140+
141+
auto blitFBO = driver->addFrameBuffer();
142142
blitFBO->attach(video::EFAP_COLOR_ATTACHMENT0, std::move(outImgView));
143143

144144
uint32_t outBufferIx = 0u;
@@ -155,21 +155,21 @@ int main()
155155
driver->bindComputePipeline(toneMappingPipeline.get());
156156
driver->bindDescriptorSets(EPBP_COMPUTE,commonPipelineLayout.get(),0u,1u,&commonDescriptorSet.get(),&toneDynamicOffsetArray);
157157
ToneMapperClass::dispatchHelper(driver,outImgStorage.get(),true);
158-
158+
159159
driver->blitRenderTargets(blitFBO, nullptr, false, false);
160160

161-
driver->endScene();
162-
if (usingTemporalAdapatation)
163-
{
164-
auto thisPresentStamp = std::chrono::high_resolution_clock::now();
165-
auto microsecondsElapsedBetweenPresents = std::chrono::duration_cast<std::chrono::microseconds>(thisPresentStamp-lastPresentStamp);
166-
lastPresentStamp = thisPresentStamp;
167-
168-
params.setAdaptationFactorFromFrameDelta(float(microsecondsElapsedBetweenPresents.count())/1000000.f);
169-
// dont override shader output
170-
constexpr auto offsetPastLumaHistory = offsetof(decltype(params),lastFrameExtraEVAsHalf)+sizeof(decltype(params)::lastFrameExtraEVAsHalf);
171-
auto* paramPtr = reinterpret_cast<const uint8_t*>(&params);
172-
driver->updateBufferRangeViaStagingBuffer(parameterBuffer.get(), offsetPastLumaHistory, sizeof(params)-offsetPastLumaHistory, paramPtr+offsetPastLumaHistory);
161+
driver->endScene();
162+
if (usingTemporalAdapatation)
163+
{
164+
auto thisPresentStamp = std::chrono::high_resolution_clock::now();
165+
auto microsecondsElapsedBetweenPresents = std::chrono::duration_cast<std::chrono::microseconds>(thisPresentStamp-lastPresentStamp);
166+
lastPresentStamp = thisPresentStamp;
167+
168+
params.setAdaptationFactorFromFrameDelta(float(microsecondsElapsedBetweenPresents.count())/1000000.f);
169+
// dont override shader output
170+
constexpr auto offsetPastLumaHistory = offsetof(decltype(params),lastFrameExtraEVAsHalf)+sizeof(decltype(params)::lastFrameExtraEVAsHalf);
171+
auto* paramPtr = reinterpret_cast<const uint8_t*>(&params);
172+
driver->updateBufferRangeViaStagingBuffer(parameterBuffer.get(), offsetPastLumaHistory, sizeof(params)-offsetPastLumaHistory, paramPtr+offsetPastLumaHistory);
173173
}
174174
}
175175

examples_tests/39.DenoiserTonemapper/CommonPushConstants.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@
55
#ifdef __cplusplus
66
#define int int32_t
77
#define uint uint32_t
8+
struct vec2 {float x,y;};
89
#define mat3 nbl::core::matrix3x4SIMD
910
#endif
1011
struct CommonPushConstants
1112
{
1213
uint inImageTexelPitch[3];
1314
uint imageWidth;
14-
15-
16-
// 1 if before denoise
17-
uint beforeDenoise;
15+
uint imageHeight;
16+
uint fftSizeLog2; // TODO: use this
17+
vec2 kernel_half_pixel_size;
1818

1919
// luma meter and tonemapping var but also for denoiser
2020
uint percentileRange[2];
2121
uint intensityBufferDWORDOffset;
2222
float denoiserExposureBias;
2323

24-
uint autoexposureOff;
24+
uint flags;
2525
// for the tonemapper
2626
uint tonemappingOperator;
2727
float tonemapperParams[2];

examples_tests/39.DenoiserTonemapper/ShaderCommon.glsl

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// For conditions of distribution and use, see copyright notice in nabla.h
44

55
#define COMPUTE_WG_SIZE 256
6+
#define _NBL_GLSL_WORKGROUP_SIZE_LOG2_ 8
67
layout(local_size_x=COMPUTE_WG_SIZE) in;
78

89
layout(constant_id = 1) const uint EII_COLOR = 0u;
@@ -16,6 +17,25 @@ layout(push_constant, row_major) uniform PushConstants{
1617
CommonPushConstants data;
1718
} pc;
1819
#define _NBL_GLSL_EXT_LUMA_METER_PUSH_CONSTANTS_DEFINED_
20+
#define _NBL_GLSL_EXT_FFT_PUSH_CONSTANTS_DEFINED_
21+
22+
23+
uint nbl_glsl_ext_FFT_Parameters_t_getLog2FFTSize()
24+
{
25+
return max(findMSB(pc.data.imageWidth-1u),_NBL_GLSL_WORKGROUP_SIZE_LOG2_)+1u;
26+
}
27+
uint nbl_glsl_ext_FFT_Parameters_t_getMaxChannel()
28+
{
29+
return 2u;
30+
}
31+
uint nbl_glsl_ext_FFT_Parameters_t_getPaddingType()
32+
{
33+
return 3u; // _NBL_GLSL_EXT_FFT_PAD_MIRROR_;
34+
}
35+
#define _NBL_GLSL_EXT_FFT_GET_PARAMETERS_DEFINED_
36+
37+
// kinda bad overdeclaration but oh well
38+
#define _NBL_GLSL_EXT_FFT_MAX_DIM_SIZE_ 16384
1939

2040

2141
#define SHARED_CHANNELS 3
@@ -29,7 +49,7 @@ struct f16vec3_packed
2949

3050
// luma metering stuff
3151
// those don't really influence anything but need to let the header know that we're using the same number of invocations as bins
32-
#define _NBL_GLSL_EXT_LUMA_METER_DISPATCH_SIZE_X_DEFINED_ 256
52+
#define _NBL_GLSL_EXT_LUMA_METER_DISPATCH_SIZE_X_DEFINED_ COMPUTE_WG_SIZE
3353
#define _NBL_GLSL_EXT_LUMA_METER_DISPATCH_SIZE_Y_DEFINED_ 1
3454

3555
#define _NBL_GLSL_EXT_LUMA_METER_MIN_LUMA_DEFINED_ 0x39800000
@@ -64,12 +84,12 @@ struct f16vec3_packed
6484
// need to override the offset and color provision functions
6585
int nbl_glsl_ext_LumaMeter_getNextLumaOutputOffset()
6686
{
67-
return pc.data.beforeDenoise!=0u ? 1:0;
87+
return int(pc.data.flags&0x1u);
6888
}
6989

7090
int nbl_glsl_ext_LumaMeter_getCurrentLumaOutputOffset()
7191
{
72-
return pc.data.beforeDenoise!=0u ? 0:1;
92+
return int((~pc.data.flags)&0x1u);
7393
}
7494

7595
vec3 globalPixelData;

0 commit comments

Comments
 (0)