From 4858ab01357e800e14a24098acba189e08da6730 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Thu, 13 Jul 2023 16:14:44 +0200 Subject: [PATCH] Solve validtion issues with size and stride in shader groups Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- .../{resources => assets}/Sponza/Sponza.bin | 0 .../{resources => assets}/Sponza/Sponza.gltf | 0 .../shaders/ambientOcclusion.rchit | 0 .../shaders/ambientOcclusion.rgen | 2 +- .../shaders/ambientOcclusion.rmiss | 0 projects/rt_ambient_occlusion/src/main.cpp | 8 ++--- src/vkcv/RayTracingPipelineManager.cpp | 29 ++++++++++++------- 7 files changed, 23 insertions(+), 16 deletions(-) rename projects/rt_ambient_occlusion/{resources => assets}/Sponza/Sponza.bin (100%) rename projects/rt_ambient_occlusion/{resources => assets}/Sponza/Sponza.gltf (100%) rename projects/rt_ambient_occlusion/{resources => assets}/shaders/ambientOcclusion.rchit (100%) rename projects/rt_ambient_occlusion/{resources => assets}/shaders/ambientOcclusion.rgen (99%) rename projects/rt_ambient_occlusion/{resources => assets}/shaders/ambientOcclusion.rmiss (100%) diff --git a/projects/rt_ambient_occlusion/resources/Sponza/Sponza.bin b/projects/rt_ambient_occlusion/assets/Sponza/Sponza.bin similarity index 100% rename from projects/rt_ambient_occlusion/resources/Sponza/Sponza.bin rename to projects/rt_ambient_occlusion/assets/Sponza/Sponza.bin diff --git a/projects/rt_ambient_occlusion/resources/Sponza/Sponza.gltf b/projects/rt_ambient_occlusion/assets/Sponza/Sponza.gltf similarity index 100% rename from projects/rt_ambient_occlusion/resources/Sponza/Sponza.gltf rename to projects/rt_ambient_occlusion/assets/Sponza/Sponza.gltf diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit b/projects/rt_ambient_occlusion/assets/shaders/ambientOcclusion.rchit similarity index 100% rename from projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit rename to projects/rt_ambient_occlusion/assets/shaders/ambientOcclusion.rchit diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rgen b/projects/rt_ambient_occlusion/assets/shaders/ambientOcclusion.rgen similarity index 99% rename from projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rgen rename to projects/rt_ambient_occlusion/assets/shaders/ambientOcclusion.rgen index cecbfcc9..ad3c18ad 100644 --- a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rgen +++ b/projects/rt_ambient_occlusion/assets/shaders/ambientOcclusion.rgen @@ -114,7 +114,7 @@ vec3 sampleCosineDistribution(vec2 xi) { sqrt(xi.x) * cos(phi), sqrt(1 - xi.x), sqrt(xi.x) * sin(phi) - ); + ); } struct Basis{ diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rmiss b/projects/rt_ambient_occlusion/assets/shaders/ambientOcclusion.rmiss similarity index 100% rename from projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rmiss rename to projects/rt_ambient_occlusion/assets/shaders/ambientOcclusion.rmiss diff --git a/projects/rt_ambient_occlusion/src/main.cpp b/projects/rt_ambient_occlusion/src/main.cpp index 49d61564..2194ac14 100644 --- a/projects/rt_ambient_occlusion/src/main.cpp +++ b/projects/rt_ambient_occlusion/src/main.cpp @@ -70,7 +70,7 @@ int main(int argc, const char** argv) { vkcv::scene::Scene scene = vkcv::scene::Scene::load( core, - "resources/Sponza/Sponza.gltf", + "assets/Sponza/Sponza.gltf", { vkcv::asset::PrimitiveType::POSITION } @@ -86,17 +86,17 @@ int main(int argc, const char** argv) { vkcv::shader::GLSLCompiler compiler (vkcv::shader::GLSLCompileTarget::RAY_TRACING); vkcv::ShaderProgram shaderProgram; - compiler.compile(vkcv::ShaderStage::RAY_GEN, std::filesystem::path("resources/shaders/ambientOcclusion.rgen"), + compiler.compile(vkcv::ShaderStage::RAY_GEN, std::filesystem::path("assets/shaders/ambientOcclusion.rgen"), [&shaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { shaderProgram.addShader(shaderStage, path); }); - compiler.compile(vkcv::ShaderStage::RAY_CLOSEST_HIT, std::filesystem::path("resources/shaders/ambientOcclusion.rchit"), + compiler.compile(vkcv::ShaderStage::RAY_CLOSEST_HIT, std::filesystem::path("assets/shaders/ambientOcclusion.rchit"), [&shaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { shaderProgram.addShader(shaderStage, path); }); - compiler.compile(vkcv::ShaderStage::RAY_MISS, std::filesystem::path("resources/shaders/ambientOcclusion.rmiss"), + compiler.compile(vkcv::ShaderStage::RAY_MISS, std::filesystem::path("assets/shaders/ambientOcclusion.rmiss"), [&shaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { shaderProgram.addShader(shaderStage, path); }); diff --git a/src/vkcv/RayTracingPipelineManager.cpp b/src/vkcv/RayTracingPipelineManager.cpp index aae73acf..28acac9d 100644 --- a/src/vkcv/RayTracingPipelineManager.cpp +++ b/src/vkcv/RayTracingPipelineManager.cpp @@ -3,6 +3,9 @@ #include "vkcv/Core.hpp" #include "vkcv/Logger.hpp" +#include <cstring> +#include <iostream> +#include <iterator> namespace vkcv { @@ -184,7 +187,7 @@ namespace vkcv { size_t missShaderGroupIndex = genShaderGroupIndex; size_t hitShaderGroupIndex = genShaderGroupIndex; size_t callShaderGroupIndex = genShaderGroupIndex; - + if (existsRayGenShader) { vk::PipelineShaderStageCreateInfo createInfo; const bool success = createPipelineShaderStageCreateInfo( @@ -311,7 +314,7 @@ namespace vkcv { nullptr ); } - + Vector<vk::DescriptorSetLayout> descriptorSetLayouts; descriptorSetLayouts.reserve(config.getDescriptorSetLayouts().size()); for (const auto &handle : config.getDescriptorSetLayouts()) { @@ -456,7 +459,7 @@ namespace vkcv { rayMissAddress = vk::StridedDeviceAddressRegionKHR( bufferBaseAddress + missShaderGroupIndex * tableSizeAlignment, shaderBindingTableSize, - shaderBindingTableSize + tableSizeAlignment ); } @@ -464,7 +467,7 @@ namespace vkcv { rayHitAddress = vk::StridedDeviceAddressRegionKHR( bufferBaseAddress + hitShaderGroupIndex * tableSizeAlignment, shaderBindingTableSize, - shaderBindingTableSize + tableSizeAlignment ); } @@ -472,10 +475,10 @@ namespace vkcv { rayCallAddress = vk::StridedDeviceAddressRegionKHR( bufferBaseAddress + callShaderGroupIndex * tableSizeAlignment, shaderBindingTableSize, - shaderBindingTableSize + tableSizeAlignment ); } - + return add({ pipeline, pipelineLayout, @@ -501,35 +504,39 @@ namespace vkcv { const RayTracingPipelineConfig & RayTracingPipelineManager::getPipelineConfig(const RayTracingPipelineHandle &handle) const { - auto &pipeline = (*this) [handle]; + const auto &pipeline = (*this) [handle]; return pipeline.m_config; } const vk::StridedDeviceAddressRegionKHR * RayTracingPipelineManager::getRayGenShaderBindingTableAddress( const vkcv::RayTracingPipelineHandle &handle) const { - auto &pipeline = (*this) [handle]; + const auto &pipeline = (*this) [handle]; + if (pipeline.m_rayGenAddress.size == 0) return nullptr; return &(pipeline.m_rayGenAddress); } const vk::StridedDeviceAddressRegionKHR * RayTracingPipelineManager::getMissShaderBindingTableAddress( const vkcv::RayTracingPipelineHandle &handle) const { - auto &pipeline = (*this) [handle]; + const auto &pipeline = (*this) [handle]; + if (pipeline.m_rayMissAddress.size == 0) return nullptr; return &(pipeline.m_rayMissAddress); } const vk::StridedDeviceAddressRegionKHR * RayTracingPipelineManager::getHitShaderBindingTableAddress( const vkcv::RayTracingPipelineHandle &handle) const { - auto &pipeline = (*this) [handle]; + const auto &pipeline = (*this) [handle]; + if (pipeline.m_rayHitAddress.size == 0) return nullptr; return &(pipeline.m_rayHitAddress); } const vk::StridedDeviceAddressRegionKHR * RayTracingPipelineManager::getCallShaderBindingTableAddress( const vkcv::RayTracingPipelineHandle &handle) const { - auto &pipeline = (*this) [handle]; + const auto &pipeline = (*this) [handle]; + //if (pipeline.m_rayCallAddress.size == 0) return nullptr; return &(pipeline.m_rayCallAddress); } -- GitLab