@@ -80,25 +80,21 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, scene::I
80
80
break ;
81
81
}
82
82
83
- constexpr auto cullingOutputDescriptorCount = 1u ;
84
83
{
85
- constexpr auto cullingDescriptorCount = cullingOutputDescriptorCount+ 2u ;
84
+ constexpr auto cullingDescriptorCount = 3u ;
86
85
IGPUDescriptorSetLayout::SBinding bindings[cullingDescriptorCount];
87
86
fillIotaDescriptorBindingDeclarations (bindings,ISpecializedShader::ESS_COMPUTE,cullingDescriptorCount,asset::EDT_STORAGE_BUFFER);
88
87
bindings[2u ].count = 2u ;
89
88
m_cullDSLayout = m_driver->createGPUDescriptorSetLayout (bindings,bindings+3u );
90
- SPushConstantRange range{ISpecializedShader::ESS_COMPUTE,0u ,sizeof (CullShaderData_t)};
91
- m_cullPipelineLayout = m_driver->createGPUPipelineLayout (&range,&range+1u ,nullptr ,core::smart_refctd_ptr (m_cullDSLayout),nullptr ,nullptr );
92
- m_cullPipeline = m_driver->createGPUComputePipeline (nullptr ,core::smart_refctd_ptr (m_cullPipelineLayout),gpuSpecializedShaderFromFile (m_assetManager,m_driver," ../cull.comp" ));
93
89
}
94
90
95
91
m_visibilityBufferFillShaders[0 ] = specializedShaderFromFile (m_assetManager," ../fillVisBuffer.vert" );
96
92
m_visibilityBufferFillShaders[1 ] = specializedShaderFromFile (m_assetManager," ../fillVisBuffer.frag" );
97
93
{
98
- ICPUDescriptorSetLayout::SBinding bindings[cullingOutputDescriptorCount] ;
99
- fillIotaDescriptorBindingDeclarations (bindings ,ISpecializedShader::ESS_VERTEX,cullingOutputDescriptorCount ,asset::EDT_STORAGE_BUFFER);
94
+ ICPUDescriptorSetLayout::SBinding binding ;
95
+ fillIotaDescriptorBindingDeclarations (&binding ,ISpecializedShader::ESS_VERTEX,1u ,asset::EDT_STORAGE_BUFFER);
100
96
101
- auto dsLayout = core::make_smart_refctd_ptr<ICPUDescriptorSetLayout>(bindings,bindings+ 2u );
97
+ auto dsLayout = core::make_smart_refctd_ptr<ICPUDescriptorSetLayout>(&binding,&binding+ 1u );
102
98
m_visibilityBufferFillPipelineLayoutCPU = core::make_smart_refctd_ptr<ICPUPipelineLayout>(nullptr ,nullptr ,nullptr ,core::smart_refctd_ptr (dsLayout),nullptr ,nullptr );
103
99
104
100
// TODO: @Crisspl find a way to stop the user from such insanity as moving from the bundle's dynamic array
@@ -229,7 +225,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
229
225
{
230
226
// TODO: get rid of `getMeshBuffer` and `getMeshBufferCount`, just return a range as `getMeshBuffers`
231
227
auto cpumb = cpumesh->getMeshBuffer (i);
232
- assert (cpumesh ->getInstanceCount ()==instances.size ());
228
+ assert (cpumb ->getInstanceCount ()==instances.size ());
233
229
234
230
// set up Visibility Buffer pipelines
235
231
{
@@ -439,7 +435,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
439
435
infos[1 ].desc = m_driver->createFilledDeviceLocalGPUBufferOnDedMem (infos[1 ].buffer .size ,cullData.data ());
440
436
cullData.clear ();
441
437
442
- for (auto offset=2u ,i=offset ; i<2u ; i++)
438
+ for (auto offset=2u ,i=0u ; i<2u ; i++)
443
439
{
444
440
auto j = i+offset;
445
441
infos[j].buffer .size = mdiData.size ()*sizeof (DrawElementsIndirectCommand_t);
@@ -668,12 +664,21 @@ void Renderer::init(const SAssetBundle& meshes,
668
664
669
665
//
670
666
{
671
- SPushConstantRange raytracingCommonPCRange{ISpecializedShader::ESS_COMPUTE,0u ,sizeof (RaytraceShaderCommonData_t)};
672
- m_commonRaytracingDS = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_commonRaytracingDSLayout));
673
-
674
667
// i know what I'm doing
675
668
auto globalBackendDataDSLayout = core::smart_refctd_ptr<IGPUDescriptorSetLayout>(const_cast <IGPUDescriptorSetLayout*>(m_globalBackendDataDS->getLayout ()));
676
669
670
+
671
+ // cull
672
+ {
673
+ SPushConstantRange range{ISpecializedShader::ESS_COMPUTE,0u ,sizeof (CullShaderData_t)};
674
+ m_cullPipelineLayout = m_driver->createGPUPipelineLayout (&range,&range+1u ,core::smart_refctd_ptr (globalBackendDataDSLayout),core::smart_refctd_ptr (m_cullDSLayout),nullptr ,nullptr );
675
+ m_cullPipeline = m_driver->createGPUComputePipeline (nullptr ,core::smart_refctd_ptr (m_cullPipelineLayout),gpuSpecializedShaderFromFile (m_assetManager,m_driver," ../cull.comp" ));
676
+ }
677
+
678
+
679
+ SPushConstantRange raytracingCommonPCRange{ISpecializedShader::ESS_COMPUTE,0u ,sizeof (RaytraceShaderCommonData_t)};
680
+ m_commonRaytracingDS = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_commonRaytracingDSLayout));
681
+
677
682
// raygen
678
683
{
679
684
m_raygenPipelineLayout = m_driver->createGPUPipelineLayout (
@@ -969,8 +974,10 @@ void Renderer::deinit()
969
974
m_commonRaytracingDS = nullptr ;
970
975
m_globalBackendDataDS = nullptr ;
971
976
977
+ m_cullPipelineLayout = nullptr ;
972
978
m_raygenPipelineLayout = nullptr ;
973
979
m_resolvePipelineLayout = nullptr ;
980
+ m_cullPipeline = nullptr ;
974
981
m_raygenPipeline = nullptr ;
975
982
m_resolvePipeline = nullptr ;
976
983
@@ -1016,11 +1023,10 @@ void Renderer::render(nbl::ITimer* timer)
1016
1023
{
1017
1024
m_raytraceCommonData.framesDispatched = 0u ;
1018
1025
1019
- IGPUDescriptorSet* descriptors[3 ] = { nullptr };
1020
- descriptors[1 ] = m_cullDS.get ();
1026
+ IGPUDescriptorSet* descriptors[3 ] = { m_globalBackendDataDS.get (),m_cullDS.get (),nullptr };
1021
1027
1022
1028
m_driver->bindComputePipeline (m_cullPipeline.get ());
1023
- m_driver->bindDescriptorSets (EPBP_COMPUTE,m_cullPipelineLayout.get (),1u , 1u ,descriptors+ 1u ,nullptr );
1029
+ m_driver->bindDescriptorSets (EPBP_COMPUTE,m_cullPipelineLayout.get (),0u , 2u ,descriptors,nullptr );
1024
1030
{
1025
1031
m_cullPushConstants.viewProjMatrix = currentViewProj;
1026
1032
m_cullPushConstants.viewProjDeterminant = core::determinant (currentViewProj);
@@ -1029,6 +1035,7 @@ void Renderer::render(nbl::ITimer* timer)
1029
1035
m_driver->dispatch (m_cullWorkGroups, 1u , 1u );
1030
1036
COpenGLExtensionHandler::pGlMemoryBarrier (GL_COMMAND_BARRIER_BIT|GL_SHADER_STORAGE_BARRIER_BIT);
1031
1037
1038
+ // in the future we'll clear it differently (esp with AA)
1032
1039
m_driver->setRenderTarget (tmpTonemapBuffer);
1033
1040
{
1034
1041
uint32_t clearAccumulation[4 ] = { 0 ,0 ,0 ,0 };
@@ -1043,7 +1050,7 @@ void Renderer::render(nbl::ITimer* timer)
1043
1050
m_driver->clearColorBuffer (EFAP_COLOR_ATTACHMENT1, zero);
1044
1051
m_driver->clearColorBuffer (EFAP_COLOR_ATTACHMENT2, zero);
1045
1052
}
1046
- m_driver->bindDescriptorSets (EPBP_GRAPHICS,m_visibilityBufferFillPipelineLayoutGPU.get (),0u , 2u ,descriptors,nullptr );
1053
+ m_driver->bindDescriptorSets (EPBP_GRAPHICS,m_visibilityBufferFillPipelineLayoutGPU.get (),1u , 1u ,descriptors+ 1u ,nullptr );
1047
1054
for (auto call : m_mdiDrawCalls)
1048
1055
{
1049
1056
m_driver->bindGraphicsPipeline (call.pipeline .get ());
@@ -1074,13 +1081,13 @@ void Renderer::render(nbl::ITimer* timer)
1074
1081
}
1075
1082
}
1076
1083
1077
- // generate rays ( TODO: move the camera part)
1084
+ // generate rays
1078
1085
{
1079
1086
m_raytraceCommonData.framesDispatched ++;
1080
1087
m_raytraceCommonData.rcpFramesDispatched = 1 .f /float (m_raytraceCommonData.framesDispatched );
1081
1088
1082
- IGPUDescriptorSet* descriptorSets[] = {m_globalBackendDataDS. get (), m_commonRaytracingDS.get (),m_raygenDS.get ()};
1083
- m_driver->bindDescriptorSets (EPBP_COMPUTE, m_raygenPipelineLayout.get (), 0 , 3 , descriptorSets, nullptr );
1089
+ IGPUDescriptorSet* descriptorSets[] = {m_commonRaytracingDS.get (),m_raygenDS.get ()};
1090
+ m_driver->bindDescriptorSets (EPBP_COMPUTE, m_raygenPipelineLayout.get (), 1 , 2 , descriptorSets, nullptr );
1084
1091
m_driver->bindComputePipeline (m_raygenPipeline.get ());
1085
1092
m_driver->pushConstants (m_raygenPipelineLayout.get (),ISpecializedShader::ESS_COMPUTE,0u ,sizeof (RaytraceShaderCommonData_t),&m_raytraceCommonData);
1086
1093
m_driver->dispatch (m_raygenWorkGroups[0 ], m_raygenWorkGroups[1 ], 1 );
0 commit comments