@@ -754,13 +754,18 @@ class HLSLComputePathtracer final : public examples::SimpleWindowedApplication,
754754 imgViewInfo.subresourceRange .aspectMask = IImage::E_ASPECT_FLAGS::EAF_COLOR_BIT;
755755 imgViewInfo.subresourceRange .baseArrayLayer = 0u ;
756756 imgViewInfo.subresourceRange .baseMipLevel = 0u ;
757- imgViewInfo.subresourceRange .layerCount = 1u ;
758757 imgViewInfo.subresourceRange .levelCount = 1u ;
759758
760- if (!useCascadeCreationParameters)
759+ if (!useCascadeCreationParameters)
760+ {
761+ imgViewInfo.subresourceRange .layerCount = 1u ;
761762 imgViewInfo.viewType = IGPUImageView::ET_2D;
763+ }
762764 else
765+ {
766+ imgViewInfo.subresourceRange .layerCount = CascadeSize;
763767 imgViewInfo.viewType = IGPUImageView::ET_2D_ARRAY;
768+ }
764769
765770 return m_device->createImageView (std::move (imgViewInfo));
766771 };
@@ -1117,6 +1122,9 @@ class HLSLComputePathtracer final : public examples::SimpleWindowedApplication,
11171122 return m_device->updateDescriptorSets (writes, {});
11181123 }
11191124
1125+ // TODO: DON'T DO THAT! tansition layout once at the initialization stage
1126+ bool cascadeLayoutTransitioned = false ;
1127+
11201128 inline void workLoopBody () override
11211129 {
11221130 // framesInFlight: ensuring safe execution of command buffers and acquires, `framesInFlight` only affect semaphore waits, don't use this to index your resources because it can change with swapchain recreation.
@@ -1191,6 +1199,36 @@ class HLSLComputePathtracer final : public examples::SimpleWindowedApplication,
11911199 cmdbuf->pipelineBarrier (E_DEPENDENCY_FLAGS::EDF_NONE, { .imgBarriers = imgBarriers });
11921200 }
11931201
1202+ // TODO: remove! we want to transition cascade layout only once right after its creation
1203+ if (!cascadeLayoutTransitioned)
1204+ {
1205+ cascadeLayoutTransitioned = true ;
1206+
1207+ const IGPUCommandBuffer::SImageMemoryBarrier<IGPUCommandBuffer::SOwnershipTransferBarrier> cascadeBarrier[] = {
1208+ {
1209+ .barrier = {
1210+ .dep = {
1211+ .srcStageMask = PIPELINE_STAGE_FLAGS::NONE,
1212+ .srcAccessMask = ACCESS_FLAGS::NONE,
1213+ .dstStageMask = PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT,
1214+ .dstAccessMask = ACCESS_FLAGS::SHADER_WRITE_BITS
1215+ }
1216+ },
1217+ .image = m_cascadeView->getCreationParameters ().image .get (),
1218+ .subresourceRange = {
1219+ .aspectMask = IImage::EAF_COLOR_BIT,
1220+ .baseMipLevel = 0u ,
1221+ .levelCount = 1u ,
1222+ .baseArrayLayer = 0u ,
1223+ .layerCount = 6u
1224+ },
1225+ .oldLayout = IImage::LAYOUT::UNDEFINED,
1226+ .newLayout = IImage::LAYOUT::GENERAL
1227+ }
1228+ };
1229+ cmdbuf->pipelineBarrier (E_DEPENDENCY_FLAGS::EDF_NONE, { .imgBarriers = cascadeBarrier });
1230+ }
1231+
11941232 // cube envmap handle
11951233 {
11961234 IGPUComputePipeline* pipeline;
@@ -1211,31 +1249,33 @@ class HLSLComputePathtracer final : public examples::SimpleWindowedApplication,
12111249 cmdbuf->dispatch (1 + (WindowDimensions.x * WindowDimensions.y - 1 ) / DefaultWorkGroupSize, 1u , 1u );
12121250 }
12131251
1214- // TODO: create it once outside of the loop?
1215- const IGPUCommandBuffer::SImageMemoryBarrier<IGPUCommandBuffer::SOwnershipTransferBarrier> cascadeBarrier[] = {
1216- {
1217- .barrier = {
1218- .dep = {
1219- .srcStageMask = PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT,
1220- .srcAccessMask = ACCESS_FLAGS::SHADER_WRITE_BITS,
1221- .dstStageMask = PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT,
1222- .dstAccessMask = ACCESS_FLAGS::SHADER_READ_BITS
1223- }
1224- },
1225- .image = m_cascadeView->getCreationParameters ().image .get (),
1226- .subresourceRange = {
1227- .aspectMask = IImage::EAF_COLOR_BIT,
1228- .baseMipLevel = 0u ,
1229- .levelCount = 1u ,
1230- .baseArrayLayer = 0u ,
1231- .layerCount = 6u
1232- },
1233- .oldLayout = IImage::LAYOUT::GENERAL,
1234- .newLayout = IImage::LAYOUT::GENERAL
1235- }
1236- };
1237-
1238- cmdbuf->pipelineBarrier (E_DEPENDENCY_FLAGS::EDF_NONE, { .imgBarriers = cascadeBarrier });
1252+ // m_cascadeView synchronization - wait for previous compute shader to write into the cascade
1253+ // TODO: create this and every other barrier once outside of the loop?
1254+ {
1255+ const IGPUCommandBuffer::SImageMemoryBarrier<IGPUCommandBuffer::SOwnershipTransferBarrier> cascadeBarrier[] = {
1256+ {
1257+ .barrier = {
1258+ .dep = {
1259+ .srcStageMask = PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT,
1260+ .srcAccessMask = ACCESS_FLAGS::SHADER_WRITE_BITS,
1261+ .dstStageMask = PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT,
1262+ .dstAccessMask = ACCESS_FLAGS::SHADER_READ_BITS
1263+ }
1264+ },
1265+ .image = m_cascadeView->getCreationParameters ().image .get (),
1266+ .subresourceRange = {
1267+ .aspectMask = IImage::EAF_COLOR_BIT,
1268+ .baseMipLevel = 0u ,
1269+ .levelCount = 1u ,
1270+ .baseArrayLayer = 0u ,
1271+ .layerCount = 6u
1272+ },
1273+ .oldLayout = IImage::LAYOUT::GENERAL,
1274+ .newLayout = IImage::LAYOUT::GENERAL
1275+ }
1276+ };
1277+ cmdbuf->pipelineBarrier (E_DEPENDENCY_FLAGS::EDF_NONE, { .imgBarriers = cascadeBarrier });
1278+ }
12391279
12401280 // reweighting
12411281 {
@@ -1283,6 +1323,34 @@ class HLSLComputePathtracer final : public examples::SimpleWindowedApplication,
12831323 cmdbuf->pipelineBarrier (E_DEPENDENCY_FLAGS::EDF_NONE, { .imgBarriers = imgBarriers });
12841324 }
12851325
1326+ // m_cascadeView synchronization - wait for previous compute shader to zero-out the cascade
1327+ // TODO: create this and every other barrier once outside of the loop?
1328+ {
1329+ const IGPUCommandBuffer::SImageMemoryBarrier<IGPUCommandBuffer::SOwnershipTransferBarrier> cascadeBarrier[] = {
1330+ {
1331+ .barrier = {
1332+ .dep = {
1333+ .srcStageMask = PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT,
1334+ .srcAccessMask = ACCESS_FLAGS::SHADER_WRITE_BITS,
1335+ .dstStageMask = PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT,
1336+ .dstAccessMask = ACCESS_FLAGS::SHADER_WRITE_BITS
1337+ }
1338+ },
1339+ .image = m_cascadeView->getCreationParameters ().image .get (),
1340+ .subresourceRange = {
1341+ .aspectMask = IImage::EAF_COLOR_BIT,
1342+ .baseMipLevel = 0u ,
1343+ .levelCount = 1u ,
1344+ .baseArrayLayer = 0u ,
1345+ .layerCount = 6u
1346+ },
1347+ .oldLayout = IImage::LAYOUT::GENERAL,
1348+ .newLayout = IImage::LAYOUT::GENERAL
1349+ }
1350+ };
1351+ cmdbuf->pipelineBarrier (E_DEPENDENCY_FLAGS::EDF_NONE, { .imgBarriers = cascadeBarrier });
1352+ }
1353+
12861354 // TODO: tone mapping and stuff
12871355 }
12881356
0 commit comments