From f0b745a3a545c636c37049669e9a9380a2c283ee Mon Sep 17 00:00:00 2001
From: Lars Hoerttrich <larshoerttrich@uni-koblenz.de>
Date: Mon, 13 Sep 2021 13:00:42 +0200
Subject: [PATCH] [92] Bugfixes

---
 modules/rtx/src/vkcv/rtx/RTX.cpp              | 37 ++++++++++++-------
 projects/rtx/resources/shaders/raytrace.rmiss |  3 ++
 projects/rtx/src/main.cpp                     | 23 +++++++-----
 projects/voxelization/src/main.cpp            | 15 +++++++-
 src/vkcv/Context.cpp                          | 15 --------
 5 files changed, 53 insertions(+), 40 deletions(-)

diff --git a/modules/rtx/src/vkcv/rtx/RTX.cpp b/modules/rtx/src/vkcv/rtx/RTX.cpp
index 918e595b..4fd53fd6 100644
--- a/modules/rtx/src/vkcv/rtx/RTX.cpp
+++ b/modules/rtx/src/vkcv/rtx/RTX.cpp
@@ -144,6 +144,15 @@ namespace vkcv::rtx {
         tlasWrite.setDescriptorType(vk::DescriptorType::eAccelerationStructureKHR);
         core->getContext().getDevice().updateDescriptorSets(tlasWrite, nullptr);
 
+        vk::WriteDescriptorSet tlasWrite2;
+        tlasWrite2.setPNext(&AccelerationDescriptor);
+        tlasWrite2.setDstSet(core->getDescriptorSet(descriptorSetHandles[2]).vulkanHandle);
+        tlasWrite2.setDstBinding(1);
+        tlasWrite2.setDstArrayElement(0);
+        tlasWrite2.setDescriptorCount(1);
+        tlasWrite2.setDescriptorType(vk::DescriptorType::eAccelerationStructureKHR);
+        core->getContext().getDevice().updateDescriptorSets(tlasWrite2, nullptr);
+
         //INDEX & VERTEX BUFFER
         BottomLevelAccelerationStructure blas = asManager->getBLAS(0);//HARD CODED
 
@@ -183,35 +192,37 @@ namespace vkcv::rtx {
         // TODO: maybe all of this must be moved to the vkcv::PipelineManager? If we use scene.recordDrawcalls(), this requires a vkcv::PipelineHandle and not a vk::Pipeline
 
         // -- process vkcv::ShaderProgram into vk::ShaderModule
-        std::vector<char> rayGenShaderCodeTemp = rayGenShader.getShader(ShaderStage::RAY_GEN).shaderCode;
-        std::vector<uint32_t> rayGenShaderCode(rayGenShaderCodeTemp.begin(), rayGenShaderCodeTemp.end());
+        std::vector<char> rayGenShaderCode = rayGenShader.getShader(ShaderStage::RAY_GEN).shaderCode;
+
         vk::ShaderModuleCreateInfo rayGenShaderModuleInfo(
             vk::ShaderModuleCreateFlags(), // vk::ShaderModuleCreateFlags flags_,
-            rayGenShaderCode // vk::ArrayProxyNoTemporaries<const uint32_t> const & code_
+            rayGenShaderCode.size(), // size_t codeSize
+            (const uint32_t*)rayGenShaderCode.data() // const uint32_t* pCode
         );
-        vk::ShaderModule rayGenShaderModule = m_core->getContext().getDevice().createShaderModule(rayGenShaderModuleInfo, nullptr, m_asManager->getDispatcher());
+        vk::ShaderModule rayGenShaderModule = m_core->getContext().getDevice().createShaderModule(rayGenShaderModuleInfo);
         if (!rayGenShaderModule) {
             vkcv_log(LogLevel::ERROR, "The Ray Generation Shader Module could not be created!");
         }
 
-        std::vector<char> rayMissShaderCodeTemp = rayMissShader.getShader(ShaderStage::RAY_MISS).shaderCode;
-        std::vector<uint32_t> rayMissShaderCode(rayMissShaderCodeTemp.begin(), rayMissShaderCodeTemp.end());
+        std::vector<char> rayMissShaderCode = rayMissShader.getShader(ShaderStage::RAY_MISS).shaderCode;
         vk::ShaderModuleCreateInfo rayMissShaderModuleInfo(
             vk::ShaderModuleCreateFlags(), // vk::ShaderModuleCreateFlags flags_,
-            rayMissShaderCode // vk::ArrayProxyNoTemporaries<const uint32_t> const & code_
+            rayMissShaderCode.size(), //size_t codeSize
+            (const uint32_t*)rayMissShaderCode.data() // const uint32_t* pCode
         );
-        vk::ShaderModule rayMissShaderModule = m_core->getContext().getDevice().createShaderModule(rayMissShaderModuleInfo, nullptr, m_asManager->getDispatcher());
+
+        vk::ShaderModule rayMissShaderModule = m_core->getContext().getDevice().createShaderModule(rayMissShaderModuleInfo);
         if (!rayMissShaderModule) {
             vkcv_log(LogLevel::ERROR, "The Ray Miss Shader Module could not be created!");
         }
 
-        std::vector<char> rayClosestHitShaderTemp = rayClosestHitShader.getShader(ShaderStage::RAY_CLOSEST_HIT).shaderCode;
-        std::vector<uint32_t> rayClosestHitShaderCode(rayClosestHitShaderTemp.begin(), rayClosestHitShaderTemp.end());
+        std::vector<char> rayClosestHitShaderCode = rayClosestHitShader.getShader(ShaderStage::RAY_CLOSEST_HIT).shaderCode;
         vk::ShaderModuleCreateInfo rayClosestHitShaderModuleInfo(
             vk::ShaderModuleCreateFlags(), // vk::ShaderModuleCreateFlags flags_,
-            rayClosestHitShaderCode // vk::ArrayProxyNoTemporaries<const uint32_t> const & code_
+            rayClosestHitShaderCode.size(), //size_t codeSize
+            (const uint32_t*)rayClosestHitShaderCode.data() // const uint32_t* pCode_
         );
-        vk::ShaderModule rayClosestHitShaderModule = m_core->getContext().getDevice().createShaderModule(rayClosestHitShaderModuleInfo, nullptr, m_asManager->getDispatcher());
+        vk::ShaderModule rayClosestHitShaderModule = m_core->getContext().getDevice().createShaderModule(rayClosestHitShaderModuleInfo);
         if (!rayClosestHitShaderModule) {
             vkcv_log(LogLevel::ERROR, "The Ray Closest Hit Shader Module could not be created!");
         }
@@ -287,7 +298,7 @@ namespace vkcv::rtx {
             nullptr // const vk::PushConstantRange* pPushConstantRanges_ = {}
         );
 
-        vk::PipelineLayout rtxPipelineLayout = m_core->getContext().getDevice().createPipelineLayout(rtxPipelineLayoutCreateInfo, nullptr, m_asManager->getDispatcher());
+        vk::PipelineLayout rtxPipelineLayout = m_core->getContext().getDevice().createPipelineLayout(rtxPipelineLayoutCreateInfo);
         if (!rtxPipelineLayout) {
             vkcv_log(LogLevel::ERROR, "The RTX Pipeline Layout could not be created!");
         }
diff --git a/projects/rtx/resources/shaders/raytrace.rmiss b/projects/rtx/resources/shaders/raytrace.rmiss
index 32e919a1..02bffd44 100644
--- a/projects/rtx/resources/shaders/raytrace.rmiss
+++ b/projects/rtx/resources/shaders/raytrace.rmiss
@@ -1,6 +1,9 @@
 #version 460
 #extension GL_EXT_ray_tracing : require
 
+layout(binding = 1, set = 0) uniform accelerationStructureEXT tlas; 
+
 void main() {
+    int c = 42;
 
 }
diff --git a/projects/rtx/src/main.cpp b/projects/rtx/src/main.cpp
index 236fc80e..9174cf87 100644
--- a/projects/rtx/src/main.cpp
+++ b/projects/rtx/src/main.cpp
@@ -127,11 +127,11 @@ int main(int argc, const char** argv) {
 			rayClosestHitShaderProgram.addShader(shaderStage, path);
 		});
 	
-//	vkcv::ShaderProgram rayMissShaderProgram;
-//	compiler.compile(vkcv::ShaderStage::RAY_MISS, std::filesystem::path("resources/shaders/raytrace.rmiss"),
-//		[&rayMissShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
-//			rayMissShaderProgram.addShader(shaderStage, path);
-//		});
+	vkcv::ShaderProgram rayMissShaderProgram;
+	compiler.compile(vkcv::ShaderStage::RAY_MISS, std::filesystem::path("resources/shaders/raytrace.rmiss"),
+		[&rayMissShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
+			rayMissShaderProgram.addShader(shaderStage, path);
+		});
 
 	std::vector<vkcv::DescriptorSetHandle> descriptorSetHandles;
 	std::vector<vkcv::DescriptorSetLayoutHandle> descriptorSetLayoutHandles;
@@ -147,14 +147,14 @@ int main(int argc, const char** argv) {
 	descriptorSetHandles.push_back(rayCHITShaderDescriptorSet);
 	descriptorSetLayoutHandles.push_back(rayClosestHitShaderDescriptorSetLayout);
 
-//	vkcv::DescriptorSetLayoutHandle rayMissShaderDescriptorSetLayout = core.createDescriptorSetLayout(rayMissShaderProgram.getReflectedDescriptors().at(0));
-//	vkcv::DescriptorSetHandle rayMissShaderDescriptorSet = core.createDescriptorSet(rayMissShaderDescriptorSetLayout);
-//	descriptorSetHandles.push_back(rayMissShaderDescriptorSet);
-//	descriptorSetLayoutHandles.push_back(rayMissShaderDescriptorSetLayout);
+	vkcv::DescriptorSetLayoutHandle rayMissShaderDescriptorSetLayout = core.createDescriptorSetLayout(rayMissShaderProgram.getReflectedDescriptors().at(0));
+	vkcv::DescriptorSetHandle rayMissShaderDescriptorSet = core.createDescriptorSet(rayMissShaderDescriptorSetLayout);
+	descriptorSetHandles.push_back(rayMissShaderDescriptorSet);
+	descriptorSetLayoutHandles.push_back(rayMissShaderDescriptorSetLayout);
 
 	// init RTXModule
 	rtxModule.init(&core, vertices, indices,descriptorSetHandles);
-//	vk::Pipeline rtxPipeline = rtxModule.createRTXPipeline(descriptorSetLayoutHandles, rayGenShaderProgram, rayMissShaderProgram, rayClosestHitShaderProgram);
+	vk::Pipeline rtxPipeline = rtxModule.createRTXPipeline(descriptorSetLayoutHandles, rayGenShaderProgram, rayMissShaderProgram, rayClosestHitShaderProgram);
 
 	const vkcv::GraphicsPipelineConfig scenePipelineDefinition{
 		sceneShaderProgram,
@@ -242,6 +242,9 @@ int main(int argc, const char** argv) {
 							 vkcv::DrawcallInfo& drawcallInfo) {
 			pushConstants.appendDrawcall(MVP);
 		};
+		//vk::CommandBuffer test;
+		//test.traceRaysKHR();
+	
 
 		scene.recordDrawcalls(cmdStream,
 							  cameraManager.getActiveCamera(),
diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index 83428cd0..1c2b92a1 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -20,8 +20,19 @@ int main(int argc, const char** argv) {
 
 	vkcv::Features features;
 	features.requireExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
-	features.requireExtension(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);
-	features.requireExtension(VK_KHR_16BIT_STORAGE_EXTENSION_NAME);
+	features.tryExtensionFeature<vk::PhysicalDevice16BitStorageFeatures>(
+		VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME,
+		[](vk::PhysicalDevice16BitStorageFeatures& features) {
+			features.setStorageBuffer16BitAccess(true);
+		}
+	);
+
+	features.tryExtensionFeature<vk::PhysicalDeviceShaderFloat16Int8Features>(
+		VK_KHR_16BIT_STORAGE_EXTENSION_NAME,
+		[](vk::PhysicalDeviceShaderFloat16Int8Features& features) {
+			features.setShaderFloat16(true);
+		}
+	);
 
 	const uint32_t windowWidth = 1280;
 	const uint32_t windowHeight = 720;
diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp
index 621c784e..de960373 100644
--- a/src/vkcv/Context.cpp
+++ b/src/vkcv/Context.cpp
@@ -273,21 +273,6 @@ namespace vkcv
 #ifdef __APPLE__
 		featureManager.useExtension("VK_KHR_portability_subset", true);
 #endif
-		
-		if (featureManager.useExtension(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false)) {
-			featureManager.useFeatures<vk::PhysicalDeviceShaderFloat16Int8Features>(
-					[](vk::PhysicalDeviceShaderFloat16Int8Features& features) {
-				features.setShaderFloat16(true);
-			}, false);
-		}
-		
-		if (featureManager.useExtension(VK_KHR_16BIT_STORAGE_EXTENSION_NAME, false)) {
-			featureManager.useFeatures<vk::PhysicalDevice16BitStorageFeatures>(
-					[](vk::PhysicalDevice16BitStorageFeatures& features) {
-				features.setStorageBuffer16BitAccess(true);
-			}, false);
-		}
-		
 		featureManager.useFeatures([](vk::PhysicalDeviceFeatures& features) {
 			features.setFragmentStoresAndAtomics(true);
 			features.setGeometryShader(true);
-- 
GitLab