diff --git a/samples/03_model_render/ibl_helpers.cpp b/samples/03_model_render/ibl_helpers.cpp index d00032c..db58cdc 100644 --- a/samples/03_model_render/ibl_helpers.cpp +++ b/samples/03_model_render/ibl_helpers.cpp @@ -30,7 +30,7 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 diffuseIrradianceName += name ? name : ""; StorageTextureCube skybox; - skybox.Init(pDevice, cubeSide, vk::Format::eR16G16B16A16Sfloat, true, true, skyboxName.c_str()); + skybox.Init(pDevice, cubeSide, vk::Format::eR16G16B16A16Sfloat, true, false, skyboxName.c_str()); TextureHandle skyboxHandle = resMan->CommitTexture(&skybox); StorageTextureHandle skyboxStorageHandle = resMan->CommitStorageTexture(&skybox); @@ -68,6 +68,23 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 .pImageMemoryBarriers = readyToWriteBarriers.data(), }; + vk::ImageMemoryBarrier2 skyboxWriteToReadBarrier = { + .srcStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .srcAccessMask = vk::AccessFlagBits2::eShaderStorageWrite, + .dstStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .dstAccessMask = vk::AccessFlagBits2::eShaderStorageRead, + .oldLayout = vk::ImageLayout::eGeneral, + .newLayout = vk::ImageLayout::eGeneral, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = skybox.m_Image, + .subresourceRange = cubeSubresRange, + }; + vk::DependencyInfo skyboxReadToWriteDependency = { + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &skyboxWriteToReadBarrier, + }; + vk::ImageMemoryBarrier2 skyboxToSampleBarrier = { .srcStageMask = vk::PipelineStageFlagBits2::eComputeShader, .srcAccessMask = vk::AccessFlagBits2::eShaderStorageWrite | vk::AccessFlagBits2::eShaderStorageRead, @@ -191,12 +208,11 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32 &skyboxPushConstant); cmd.dispatch(cubeSide / 16, cubeSide / 16, 6); - // Internal Barriers will ensure waiting for the next command. - GenerateMipMaps(cmd, &skybox, vk::ImageLayout::eGeneral, vk::ImageLayout::eGeneral); + cmd.pipelineBarrier2(&skyboxReadToWriteDependency); + cmd.bindPipeline(vk::PipelineBindPoint::eCompute, diffuseIrradiancePipeline); cmd.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eCompute, 0, sizeof skyboxPushConstant, &diffuseIrradiancePushConstants); - cmd.bindPipeline(vk::PipelineBindPoint::eCompute, diffuseIrradiancePipeline); cmd.dispatch(cubeSide / 16, cubeSide / 16, 6); cmd.pipelineBarrier2(&skyboxToSampleDependency);