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