From 5e8b5de4d36865c7456c45bceb778893b90d522a Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Sun, 18 Jul 2021 02:17:44 +0200 Subject: [PATCH] [#100] Fixed multiple issues but it still doesn't work Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- include/vkcv/Core.hpp | 17 ++-- .../include/vkcv/upscaling/FSRUpscaling.hpp | 6 +- .../src/vkcv/upscaling/FSRUpscaling.cpp | 87 +++++++++++-------- projects/voxelization/src/main.cpp | 8 +- src/vkcv/Core.cpp | 32 +++++-- 5 files changed, 96 insertions(+), 54 deletions(-) diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index 8141bb4b..cf36fa7a 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -287,15 +287,18 @@ namespace vkcv const RecordCommandFunction &record, const FinishCommandFunction &finish); - void submitCommandStream(const CommandStreamHandle handle); - void prepareSwapchainImageForPresent(const CommandStreamHandle handle); - void prepareImageForSampling(const CommandStreamHandle cmdStream, const ImageHandle image); - void prepareImageForStorage(const CommandStreamHandle cmdStream, const ImageHandle image); - void recordImageMemoryBarrier(const CommandStreamHandle cmdStream, const ImageHandle image); - void recordBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer); - void resolveMSAAImage(CommandStreamHandle cmdStream, ImageHandle src, ImageHandle dst); + void submitCommandStream(const CommandStreamHandle& handle); + void prepareSwapchainImageForPresent(const CommandStreamHandle& handle); + void prepareImageForSampling(const CommandStreamHandle& cmdStream, const ImageHandle& image); + void prepareImageForStorage(const CommandStreamHandle& cmdStream, const ImageHandle& image); + void recordImageMemoryBarrier(const CommandStreamHandle& cmdStream, const ImageHandle& image); + void recordBufferMemoryBarrier(const CommandStreamHandle& cmdStream, const BufferHandle& buffer); + void resolveMSAAImage(const CommandStreamHandle& cmdStream, const ImageHandle& src, const ImageHandle& dst); + [[nodiscard]] vk::ImageView getSwapchainImageView() const; + + void recordMemoryBarrier(const CommandStreamHandle& cmdStream); }; } diff --git a/modules/upscaling/include/vkcv/upscaling/FSRUpscaling.hpp b/modules/upscaling/include/vkcv/upscaling/FSRUpscaling.hpp index 6e07a097..0d9a39cc 100644 --- a/modules/upscaling/include/vkcv/upscaling/FSRUpscaling.hpp +++ b/modules/upscaling/include/vkcv/upscaling/FSRUpscaling.hpp @@ -21,7 +21,9 @@ namespace vkcv::upscaling { PipelineHandle m_easuPipeline; PipelineHandle m_rcasPipeline; - DescriptorSetHandle m_descriptorSet; + DescriptorSetHandle m_easuDescriptorSet; + DescriptorSetHandle m_rcasDescriptorSet; + Buffer<FSRConstants> m_constants; ImageHandle m_intermediateImage; SamplerHandle m_sampler; @@ -38,10 +40,12 @@ namespace vkcv::upscaling { const ImageHandle& input, const ImageHandle& output); + [[nodiscard]] bool isHdrEnabled() const; void setHdrEnabled(bool enabled); + [[nodiscard]] float getSharpness() const; void setSharpness(float sharpness); diff --git a/modules/upscaling/src/vkcv/upscaling/FSRUpscaling.cpp b/modules/upscaling/src/vkcv/upscaling/FSRUpscaling.cpp index eab6fd07..353b9ef5 100644 --- a/modules/upscaling/src/vkcv/upscaling/FSRUpscaling.cpp +++ b/modules/upscaling/src/vkcv/upscaling/FSRUpscaling.cpp @@ -18,15 +18,6 @@ namespace vkcv::upscaling { - static std::vector<DescriptorBinding> getDescriptorBindings() { - return std::vector<DescriptorBinding>({ - DescriptorBinding(0, DescriptorType::UNIFORM_BUFFER, 1, ShaderStage::COMPUTE), - DescriptorBinding(1, DescriptorType::IMAGE_SAMPLED, 1, ShaderStage::COMPUTE), - DescriptorBinding(2, DescriptorType::IMAGE_STORAGE, 1, ShaderStage::COMPUTE), - DescriptorBinding(3, DescriptorType::SAMPLER, 1, ShaderStage::COMPUTE) - }); - } - static bool writeShaderCode(const std::filesystem::path &shaderPath, const std::string& code) { std::ofstream file (shaderPath.string(), std::ios::out); @@ -76,7 +67,8 @@ namespace vkcv::upscaling { m_core(core), m_easuPipeline(), m_rcasPipeline(), - m_descriptorSet(m_core.createDescriptorSet(getDescriptorBindings())), + m_easuDescriptorSet(), + m_rcasDescriptorSet(), m_constants(m_core.createBuffer<FSRConstants>( BufferType::UNIFORM,1, BufferMemoryType::HOST_VISIBLE @@ -89,37 +81,51 @@ namespace vkcv::upscaling { SamplerAddressMode::CLAMP_TO_EDGE )), m_hdr(false), - m_sharpness(1.0f) { - const auto descriptorSetLayout = m_core.getDescriptorSet(m_descriptorSet).layout; - + m_sharpness(0.0f) { vkcv::shader::GLSLCompiler easuCompiler, rcasCompiler; - easuCompiler.setDefine("SAMPLE_BILINEAR", "0"); - easuCompiler.setDefine("SAMPLE_RCAS", "0"); + easuCompiler.setDefine("SAMPLE_SLOW_FALLBACK", "1"); easuCompiler.setDefine("SAMPLE_EASU", "1"); - rcasCompiler.setDefine("SAMPLE_BILINEAR", "0"); + rcasCompiler.setDefine("SAMPLE_SLOW_FALLBACK", "1"); rcasCompiler.setDefine("SAMPLE_RCAS", "1"); - rcasCompiler.setDefine("SAMPLE_EASU", "0"); { ShaderProgram program; - compileFSRShader(easuCompiler, [&program, &descriptorSetLayout](vkcv::ShaderStage shaderStage, + compileFSRShader(easuCompiler, [&program](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { program.addShader(shaderStage, path); }); - m_easuPipeline = m_core.createComputePipeline(program, { descriptorSetLayout }); + m_easuDescriptorSet = m_core.createDescriptorSet(program.getReflectedDescriptors()[0]); + m_easuPipeline = m_core.createComputePipeline(program, { + m_core.getDescriptorSet(m_easuDescriptorSet).layout + }); + + DescriptorWrites writes; + writes.uniformBufferWrites.emplace_back(0, m_constants.getHandle()); + writes.samplerWrites.emplace_back(3, m_sampler); + + m_core.writeDescriptorSet(m_easuDescriptorSet, writes); } { ShaderProgram program; - compileFSRShader(rcasCompiler, [&program, &descriptorSetLayout](vkcv::ShaderStage shaderStage, + compileFSRShader(rcasCompiler, [&program](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { program.addShader(shaderStage, path); }); - m_rcasPipeline = m_core.createComputePipeline(program, { descriptorSetLayout }); + m_rcasDescriptorSet = m_core.createDescriptorSet(program.getReflectedDescriptors()[0]); + m_rcasPipeline = m_core.createComputePipeline(program, { + m_core.getDescriptorSet(m_rcasDescriptorSet).layout + }); + + DescriptorWrites writes; + writes.uniformBufferWrites.emplace_back(0, m_constants.getHandle()); + writes.samplerWrites.emplace_back(3, m_sampler); + + m_core.writeDescriptorSet(m_rcasDescriptorSet, writes); } } @@ -127,10 +133,10 @@ namespace vkcv::upscaling { const ImageHandle& input, const ImageHandle& output) { const uint32_t inputWidth = m_core.getImageWidth(input); - const uint32_t inputHeight = m_core.getImageWidth(input); + const uint32_t inputHeight = m_core.getImageHeight(input); const uint32_t outputWidth = m_core.getImageWidth(output); - const uint32_t outputHeight = m_core.getImageWidth(output); + const uint32_t outputHeight = m_core.getImageHeight(output); if ((!m_intermediateImage) || (outputWidth != m_core.getImageWidth(m_intermediateImage)) || @@ -155,34 +161,35 @@ namespace vkcv::upscaling { static_cast<AF1>(outputWidth), static_cast<AF1>(outputHeight) ); - consts.Sample[0] = (((m_hdr) && (m_sharpness <= 0.0f)) ? 1 : 0); + consts.Sample[0] = (((m_hdr) && (m_sharpness <= +0.0f)) ? 1 : 0); m_constants.fill(&consts); } static const uint32_t threadGroupWorkRegionDim = 16; - const uint32_t dispatch[3] = { - (outputWidth + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim, - (outputHeight + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim, - 1 - }; + uint32_t dispatch[3]; + dispatch[0] = (outputWidth + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + dispatch[1] = (outputHeight + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + dispatch[2] = 1; - m_core.recordImageMemoryBarrier(cmdStream, input); + m_core.recordMemoryBarrier(cmdStream); - if (m_sharpness >= 0.0f) { + if (m_sharpness > +0.0f) { { DescriptorWrites writes; writes.sampledImageWrites.emplace_back(1, input); writes.storageImageWrites.emplace_back(2, m_intermediateImage); - m_core.writeDescriptorSet(m_descriptorSet, writes); + m_core.writeDescriptorSet(m_easuDescriptorSet, writes); } m_core.recordComputeDispatchToCmdStream( cmdStream, m_easuPipeline, dispatch, - {DescriptorSetUsage(0, m_core.getDescriptorSet(m_descriptorSet).vulkanHandle)}, + {DescriptorSetUsage(0, m_core.getDescriptorSet( + m_easuDescriptorSet + ).vulkanHandle)}, PushConstants(0) ); @@ -202,14 +209,16 @@ namespace vkcv::upscaling { writes.sampledImageWrites.emplace_back(1, m_intermediateImage); writes.storageImageWrites.emplace_back(2, output); - m_core.writeDescriptorSet(m_descriptorSet, writes); + m_core.writeDescriptorSet(m_rcasDescriptorSet, writes); } m_core.recordComputeDispatchToCmdStream( cmdStream, m_rcasPipeline, dispatch, - {DescriptorSetUsage(0, m_core.getDescriptorSet(m_descriptorSet).vulkanHandle)}, + {DescriptorSetUsage(0, m_core.getDescriptorSet( + m_rcasDescriptorSet + ).vulkanHandle)}, PushConstants(0) ); @@ -220,17 +229,21 @@ namespace vkcv::upscaling { writes.sampledImageWrites.emplace_back(1, input); writes.storageImageWrites.emplace_back(2, output); - m_core.writeDescriptorSet(m_descriptorSet, writes); + m_core.writeDescriptorSet(m_easuDescriptorSet, writes); } m_core.recordComputeDispatchToCmdStream( cmdStream, m_rcasPipeline, dispatch, - {DescriptorSetUsage(0, m_core.getDescriptorSet(m_descriptorSet).vulkanHandle)}, + {DescriptorSetUsage(0, m_core.getDescriptorSet( + m_easuDescriptorSet + ).vulkanHandle)}, PushConstants(0) ); } + + m_core.recordMemoryBarrier(cmdStream); } bool FSRUpscaling::isHdrEnabled() const { diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp index 2d629311..8d85dd99 100644 --- a/projects/voxelization/src/main.cpp +++ b/projects/voxelization/src/main.cpp @@ -714,7 +714,8 @@ int main(int argc, const char** argv) { } bloomFlares.execWholePipeline(cmdStream, resolvedColorBuffer, windowWidth, windowHeight, - glm::normalize(cameraManager.getActiveCamera().getFront())); + glm::normalize(cameraManager.getActiveCamera().getFront()) + ); core.prepareImageForStorage(cmdStream, swapBuffer); core.prepareImageForSampling(cmdStream, resolvedColorBuffer); @@ -729,10 +730,13 @@ int main(int argc, const char** argv) { cmdStream, tonemappingPipeline, fulsscreenDispatchCount, - { vkcv::DescriptorSetUsage(0, core.getDescriptorSet(tonemappingDescriptorSet).vulkanHandle) }, + { vkcv::DescriptorSetUsage(0, core.getDescriptorSet( + tonemappingDescriptorSet + ).vulkanHandle) }, timePushConstants ); + core.prepareImageForStorage(cmdStream, swapchainInput); core.prepareImageForSampling(cmdStream, swapBuffer); upscaling.recordUpscaling(cmdStream, swapBuffer, swapchainInput); diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index 556f6474..c9da14fb 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -476,7 +476,7 @@ namespace vkcv } } - void Core::submitCommandStream(const CommandStreamHandle handle) { + void Core::submitCommandStream(const CommandStreamHandle& handle) { std::vector<vk::Semaphore> waitSemaphores; // FIXME: add proper user controllable sync std::vector<vk::Semaphore> signalSemaphores = { m_SyncResources.renderFinished }; @@ -548,38 +548,38 @@ namespace vkcv return m_DescriptorManager->getDescriptorSet(handle); } - void Core::prepareSwapchainImageForPresent(const CommandStreamHandle cmdStream) { + void Core::prepareSwapchainImageForPresent(const CommandStreamHandle& cmdStream) { auto swapchainHandle = ImageHandle::createSwapchainImageHandle(); recordCommandsToStream(cmdStream, [swapchainHandle, this](const vk::CommandBuffer cmdBuffer) { m_ImageManager->recordImageLayoutTransition(swapchainHandle, vk::ImageLayout::ePresentSrcKHR, cmdBuffer); }, nullptr); } - void Core::prepareImageForSampling(const CommandStreamHandle cmdStream, const ImageHandle image) { + void Core::prepareImageForSampling(const CommandStreamHandle& cmdStream, const ImageHandle& image) { recordCommandsToStream(cmdStream, [image, this](const vk::CommandBuffer cmdBuffer) { m_ImageManager->recordImageLayoutTransition(image, vk::ImageLayout::eShaderReadOnlyOptimal, cmdBuffer); }, nullptr); } - void Core::prepareImageForStorage(const CommandStreamHandle cmdStream, const ImageHandle image) { + void Core::prepareImageForStorage(const CommandStreamHandle& cmdStream, const ImageHandle& image) { recordCommandsToStream(cmdStream, [image, this](const vk::CommandBuffer cmdBuffer) { m_ImageManager->recordImageLayoutTransition(image, vk::ImageLayout::eGeneral, cmdBuffer); }, nullptr); } - void Core::recordImageMemoryBarrier(const CommandStreamHandle cmdStream, const ImageHandle image) { + void Core::recordImageMemoryBarrier(const CommandStreamHandle& cmdStream, const ImageHandle& image) { recordCommandsToStream(cmdStream, [image, this](const vk::CommandBuffer cmdBuffer) { m_ImageManager->recordImageMemoryBarrier(image, cmdBuffer); }, nullptr); } - void Core::recordBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer) { + void Core::recordBufferMemoryBarrier(const CommandStreamHandle& cmdStream, const BufferHandle& buffer) { recordCommandsToStream(cmdStream, [buffer, this](const vk::CommandBuffer cmdBuffer) { m_BufferManager->recordBufferMemoryBarrier(buffer, cmdBuffer); }, nullptr); } - void Core::resolveMSAAImage(CommandStreamHandle cmdStream, ImageHandle src, ImageHandle dst) { + void Core::resolveMSAAImage(const CommandStreamHandle& cmdStream, const ImageHandle& src, const ImageHandle& dst) { recordCommandsToStream(cmdStream, [src, dst, this](const vk::CommandBuffer cmdBuffer) { m_ImageManager->recordMSAAResolve(cmdBuffer, src, dst); }, nullptr); @@ -588,5 +588,23 @@ namespace vkcv vk::ImageView Core::getSwapchainImageView() const { return m_ImageManager->getVulkanImageView(vkcv::ImageHandle::createSwapchainImageHandle()); } + + void Core::recordMemoryBarrier(const CommandStreamHandle& cmdStream) { + recordCommandsToStream(cmdStream, [](const vk::CommandBuffer cmdBuffer) { + vk::MemoryBarrier barrier ( + vk::AccessFlagBits::eMemoryWrite | vk::AccessFlagBits::eMemoryRead, + vk::AccessFlagBits::eMemoryWrite | vk::AccessFlagBits::eMemoryRead + ); + + cmdBuffer.pipelineBarrier( + vk::PipelineStageFlagBits::eAllCommands, + vk::PipelineStageFlagBits::eAllCommands, + vk::DependencyFlags(), + 1, &barrier, + 0, nullptr, + 0, nullptr + ); + }, nullptr); + } } -- GitLab