From 446e11e3b823d3a95e956d54ca5367588fd0cfaf Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Sun, 3 Sep 2023 17:07:23 +0200 Subject: [PATCH] Cleanup descriptor layout handling --- openVulkanoCpp/Math/RGB10A2.hpp | 15 +++++++++++ openVulkanoCpp/Scene/Camera.hpp | 27 ++++++++++++------- openVulkanoCpp/Scene/Node.hpp | 4 +++ .../Shader/DescriptorInputDescription.hpp | 3 --- openVulkanoCpp/Shader/CompileShaders.sh | 2 +- .../Vulkan/Resources/ResourceManager.cpp | 6 ++--- openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 12 ++++++--- 7 files changed, 49 insertions(+), 20 deletions(-) diff --git a/openVulkanoCpp/Math/RGB10A2.hpp b/openVulkanoCpp/Math/RGB10A2.hpp index 8f7a030..97ce5cf 100644 --- a/openVulkanoCpp/Math/RGB10A2.hpp +++ b/openVulkanoCpp/Math/RGB10A2.hpp @@ -162,6 +162,21 @@ namespace openVulkanoCpp::Math return { r / factor, g / factor, b / factor, a * 255 / MAX_ALPHA_VALUE }; } + operator Math::Vector4i() const + { + return { r, g, b, a }; + } + + operator Math::Vector3i_SIMD() const + { + return { r, g, b }; + } + + operator Math::Vector3i() const + { + return { r, g, b }; + } + RGB10A2& operator =(const RGB10A2& rhs) { this->value = rhs.value; diff --git a/openVulkanoCpp/Scene/Camera.hpp b/openVulkanoCpp/Scene/Camera.hpp index 7d1cfba..3ccbb25 100644 --- a/openVulkanoCpp/Scene/Camera.hpp +++ b/openVulkanoCpp/Scene/Camera.hpp @@ -17,11 +17,15 @@ namespace openVulkanoCpp::Scene { public: ICloseable* renderCamera = nullptr; + static constexpr inline size_t SIZE = sizeof(Math::Matrix4f) * 3 + sizeof(Math::Vector4f) + sizeof(float) * 8 + 16; + static constexpr inline DescriptorSetLayoutBinding DESCRIPTOR_SET_LAYOUT_BINDING = { 0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER_DYNAMIC, 1, ShaderProgramType::ALL_GRAPHICS }; protected: Math::Matrix4f m_viewProjection{1}, m_view{1}, m_projection{1}; Math::Vector4f m_camPosition{}; float m_nearPlane, m_farPlane, m_width, m_height; + float m_fov = 0, m_aspect = 0, m_scaleFactor = 0, m_perPixelScaleFactor = 0; + std::array m_userData{}; Camera() : m_nearPlane(0), m_farPlane(0), m_width(0), m_height(0) {} @@ -35,11 +39,6 @@ namespace openVulkanoCpp::Scene //if (renderCamera) renderCamera->Close(); } - public: - static constexpr size_t SIZE = sizeof(Math::Matrix4f) * 3 + sizeof(Math::Vector4f) + sizeof(float) * 8; - - void* GetData() { return &m_viewProjection; } - void Init(float width, float height, float nearPlane, float farPlane) { m_width = width; @@ -50,6 +49,9 @@ namespace openVulkanoCpp::Scene UpdateProjectionMatrix(); } + public: + void* GetData() { return &m_viewProjection; } + virtual void SetSize(const float width, const float height) { if (m_width == width && m_height == height) return; @@ -125,13 +127,16 @@ namespace openVulkanoCpp::Scene { return {m_viewProjection}; } + + /** + * The 16 byte of user data can be used to transmit additional data about the camera to the shader. + * @return reference to the custom data array + */ + [[nodiscard]] std::array& GetUserData() { return m_userData; } }; class PerspectiveCamera : public Camera { - protected: - float m_fov = 0, m_aspect = 0, m_scaleFactor = 0, m_perPixelScaleFactor = 0; - public: PerspectiveCamera() = default; ~PerspectiveCamera() override = default; @@ -157,6 +162,11 @@ namespace openVulkanoCpp::Scene m_perPixelScaleFactor = m_height / m_scaleFactor; } + [[nodiscard]] int GetPixelPerMeter(float distance) const + { + return static_cast(m_perPixelScaleFactor / distance); + } + void SetSize(const float width, const float height) override { m_aspect = width / height; @@ -221,7 +231,6 @@ namespace openVulkanoCpp::Scene class OrthographicCamera : public Camera { - std::array placeholder; public: void UpdateProjectionMatrix() final { diff --git a/openVulkanoCpp/Scene/Node.hpp b/openVulkanoCpp/Scene/Node.hpp index 83e43f5..3075d20 100644 --- a/openVulkanoCpp/Scene/Node.hpp +++ b/openVulkanoCpp/Scene/Node.hpp @@ -10,6 +10,7 @@ #include "Math/Math.hpp" #include "Drawable.hpp" #include "UpdateFrequency.hpp" +#include "Shader/DescriptorInputDescription.hpp" #include #include @@ -22,6 +23,9 @@ namespace openVulkanoCpp::Scene friend Scene; public: + static constexpr size_t SIZE = sizeof(Math::Matrix4f); + static constexpr DescriptorSetLayoutBinding DESCRIPTOR_SET_LAYOUT_BINDING = { 0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER_DYNAMIC, 1, ShaderProgramType::ALL_GRAPHICS }; + Math::Matrix4f localMat, worldMat; bool enabled = true; Node* parent = nullptr; diff --git a/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp b/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp index 69af433..3b68017 100644 --- a/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp +++ b/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp @@ -60,7 +60,4 @@ namespace openVulkanoCpp std::tie(rhs.bindingId, rhs.descriptorType, rhs.descriptorCount, rhs.stageFlags, rhs.immutableSamplers); } }; - - static constexpr inline DescriptorSetLayoutBinding NODE_LAYOUT_BINDING = {0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER_DYNAMIC, 1, ShaderProgramType::ALL_GRAPHICS}; - static constexpr inline DescriptorSetLayoutBinding CAM_LAYOUT_BINDING = {0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER_DYNAMIC, 1, ShaderProgramType::ALL_GRAPHICS}; } \ No newline at end of file diff --git a/openVulkanoCpp/Shader/CompileShaders.sh b/openVulkanoCpp/Shader/CompileShaders.sh index f0fbbbb..083eb84 100644 --- a/openVulkanoCpp/Shader/CompileShaders.sh +++ b/openVulkanoCpp/Shader/CompileShaders.sh @@ -5,7 +5,7 @@ rm Shaders.c rm *.spv for f in ./* ; do - if [[ "$f" != *.sh ]] + if [[ "$f" != *.sh ]] && [[ "$f" != *.hpp ]] && [[ "$f" != *.cpp ]] then glslang -V $f -o $f.spv fi diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index a99ff27..8720129 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -163,10 +163,10 @@ namespace openVulkanoCpp::Vulkan else { vkNode = new VulkanNode(); - buffer = CreateDeviceOnlyBufferWithData(sizeof(Math::Matrix4f), vk::BufferUsageFlagBits::eUniformBuffer, &node->worldMat); + buffer = CreateDeviceOnlyBufferWithData(Scene::Node::SIZE, vk::BufferUsageFlagBits::eUniformBuffer, &node->worldMat); } - uBuffer->Init(buffer, frameSize, allocSize, GetDescriptorLayoutSet(NODE_LAYOUT_BINDING), NODE_LAYOUT_BINDING, 0); + uBuffer->Init(buffer, frameSize, allocSize, GetDescriptorLayoutSet(Scene::Node::DESCRIPTOR_SET_LAYOUT_BINDING), Scene::Node::DESCRIPTOR_SET_LAYOUT_BINDING, 0); vkNode->Init(node, uBuffer); node->renderNode = vkNode; } @@ -182,7 +182,7 @@ namespace openVulkanoCpp::Vulkan ManagedBuffer* buffer = CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible); buffer->Map(); UniformBuffer* uBuffer = new UniformBuffer(); - uBuffer->Init(buffer, allocSize, allocSize, GetDescriptorLayoutSet(CAM_LAYOUT_BINDING), CAM_LAYOUT_BINDING, 1); + uBuffer->Init(buffer, allocSize, allocSize, GetDescriptorLayoutSet(Scene::Camera::DESCRIPTOR_SET_LAYOUT_BINDING), Scene::Camera::DESCRIPTOR_SET_LAYOUT_BINDING, 1); VulkanCamera* vkCam = new VulkanCamera(); vkCam->Init(camera, uBuffer); camera->renderCamera = vkCam; diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index e235d72..74fdb8e 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -129,10 +129,14 @@ namespace openVulkanoCpp::Vulkan void VulkanShader::CreatePipelineLayout() { - //vk::PushConstantRange camPushConstantDesc = { vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f) + 8 * sizeof(float) }; - //std::array camPushConstantDescs = { camPushConstantDesc }; - std::array layoutBindings1 = { reinterpret_cast(NODE_LAYOUT_BINDING) }; - std::array layoutBindings2 = { reinterpret_cast(CAM_LAYOUT_BINDING) }; + if (!descriptorSetLayouts.empty()) + { + for(auto& descriptorSetLayout : descriptorSetLayouts) + device.destroyDescriptorSetLayout(descriptorSetLayout); + descriptorSetLayouts.clear(); + } + std::array layoutBindings1 = { reinterpret_cast(Scene::Camera::DESCRIPTOR_SET_LAYOUT_BINDING) }; + std::array layoutBindings2 = { reinterpret_cast(Scene::Node::DESCRIPTOR_SET_LAYOUT_BINDING) }; descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings1.size(), layoutBindings1.data() })); descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings2.size(), layoutBindings2.data() }));