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