@@ -38,69 +38,69 @@ int main()
38
38
device->setEventReceiver (&receiver);
39
39
40
40
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
+
88
88
auto cpuLumaMeasureSpecializedShader = LumaMeterClass::createShader (glslCompiler,inputColorSpace,MeterMode,minLuma,maxLuma);
89
89
auto gpuLumaMeasureShader = driver->createGPUShader (smart_refctd_ptr<const ICPUShader>(cpuLumaMeasureSpecializedShader->getUnspecialized ()));
90
90
auto gpuLumaMeasureSpecializedShader = driver->createGPUSpecializedShader (gpuLumaMeasureShader.get (), cpuLumaMeasureSpecializedShader->getSpecializationInfo ());
91
91
92
92
const float meteringMinUV[2 ] = { 0 .1f ,0 .1f };
93
93
const float meteringMaxUV[2 ] = { 0 .9f ,0 .9f };
94
94
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
+
96
99
97
- auto uniformBuffer = driver->createFilledDeviceLocalGPUBufferOnDedMem (sizeof (uniforms),&uniforms);
98
-
99
-
100
100
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 ;
104
104
105
105
auto cpuTonemappingSpecializedShader = ToneMapperClass::createShader (am->getGLSLCompiler (),
106
106
inputColorSpace,
@@ -115,30 +115,30 @@ int main()
115
115
auto parameterBuffer = driver->createDeviceLocalGPUBufferOnDedMem (ToneMapperClass::getParameterBufferSize<TMO,MeterMode>());
116
116
constexpr float Exposure = 0 .f ;
117
117
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 );
121
121
driver->updateBufferRangeViaStagingBuffer (parameterBuffer.get (),0u ,sizeof (params),¶ms);
122
122
}
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));
128
128
129
129
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);
131
131
132
132
133
133
constexpr auto dynOffsetArrayLen = usingLumaMeter ? 2u : 1u ;
134
134
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 );
136
136
lumaDynamicOffsetArray->back () = sizeof (ToneMapperClass::Params_t<TMO>);
137
137
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 ();
142
142
blitFBO->attach (video::EFAP_COLOR_ATTACHMENT0, std::move (outImgView));
143
143
144
144
uint32_t outBufferIx = 0u ;
@@ -155,21 +155,21 @@ int main()
155
155
driver->bindComputePipeline (toneMappingPipeline.get ());
156
156
driver->bindDescriptorSets (EPBP_COMPUTE,commonPipelineLayout.get (),0u ,1u ,&commonDescriptorSet.get (),&toneDynamicOffsetArray);
157
157
ToneMapperClass::dispatchHelper (driver,outImgStorage.get (),true );
158
-
158
+
159
159
driver->blitRenderTargets (blitFBO, nullptr , false , false );
160
160
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 *>(¶ms);
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 *>(¶ms);
172
+ driver->updateBufferRangeViaStagingBuffer (parameterBuffer.get (), offsetPastLumaHistory, sizeof (params)-offsetPastLumaHistory, paramPtr+offsetPastLumaHistory);
173
173
}
174
174
}
175
175
0 commit comments