From 5703d715faa667e1141aee8cac3eb3bec57bc566 Mon Sep 17 00:00:00 2001 From: PancakeTAS Date: Sat, 20 Dec 2025 05:38:27 +0100 Subject: [PATCH] refactor(cleanup): dynamically allocate descriptor pool sizes --- lsfg-vk-backend/CMakeLists.txt | 1 + lsfg-vk-backend/src/helpers/limits.cpp | 53 +++++++++++++++++ lsfg-vk-backend/src/helpers/limits.hpp | 13 +++++ .../src/helpers/managed_shader.cpp | 5 +- .../src/helpers/managed_shader.hpp | 5 +- lsfg-vk-backend/src/helpers/utils.hpp | 3 + lsfg-vk-backend/src/lsfgvk.cpp | 2 + lsfg-vk-backend/src/shaderchains/alpha0.cpp | 6 +- lsfg-vk-backend/src/shaderchains/alpha1.cpp | 2 +- lsfg-vk-backend/src/shaderchains/beta0.cpp | 2 +- lsfg-vk-backend/src/shaderchains/beta1.cpp | 8 +-- lsfg-vk-backend/src/shaderchains/delta0.cpp | 4 +- lsfg-vk-backend/src/shaderchains/delta1.cpp | 16 ++--- lsfg-vk-backend/src/shaderchains/gamma0.cpp | 2 +- lsfg-vk-backend/src/shaderchains/gamma1.cpp | 8 +-- lsfg-vk-backend/src/shaderchains/generate.cpp | 4 +- lsfg-vk-backend/src/shaderchains/mipmaps.cpp | 4 +- lsfg-vk-common/CMakeLists.txt | 9 +-- .../lsfg-vk-common/vulkan/descriptor_pool.hpp | 33 +++++++++++ .../lsfg-vk-common/vulkan/descriptor_set.hpp | 4 +- .../include/lsfg-vk-common/vulkan/vulkan.hpp | 4 -- lsfg-vk-common/src/vulkan/descriptor_pool.cpp | 58 +++++++++++++++++++ lsfg-vk-common/src/vulkan/descriptor_set.cpp | 12 ++-- lsfg-vk-common/src/vulkan/vulkan.cpp | 36 ------------ lsfg-vk-debug/src/debug.cpp | 2 +- lsfg-vk-layer/src/configuration/config.cpp | 2 +- 26 files changed, 215 insertions(+), 83 deletions(-) create mode 100644 lsfg-vk-backend/src/helpers/limits.cpp create mode 100644 lsfg-vk-backend/src/helpers/limits.hpp create mode 100644 lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_pool.hpp create mode 100644 lsfg-vk-common/src/vulkan/descriptor_pool.cpp diff --git a/lsfg-vk-backend/CMakeLists.txt b/lsfg-vk-backend/CMakeLists.txt index d046856..d167430 100644 --- a/lsfg-vk-backend/CMakeLists.txt +++ b/lsfg-vk-backend/CMakeLists.txt @@ -1,6 +1,7 @@ set(BACKEND_SOURCES "src/extraction/dll_reader.cpp" "src/extraction/shader_registry.cpp" + "src/helpers/limits.cpp" "src/helpers/managed_shader.cpp" "src/helpers/utils.cpp" "src/shaderchains/alpha0.cpp" diff --git a/lsfg-vk-backend/src/helpers/limits.cpp b/lsfg-vk-backend/src/helpers/limits.cpp new file mode 100644 index 0000000..565629a --- /dev/null +++ b/lsfg-vk-backend/src/helpers/limits.cpp @@ -0,0 +1,53 @@ +#include "limits.hpp" + +#include "lsfg-vk-common/vulkan/descriptor_pool.hpp" + +#include +#include + +using namespace ls; + +namespace { + const vk::Limits BASE_LIMITS{ + .sets = 51, + .uniform_buffers = 3, + .samplers = 51, + .sampled_images = 165, + .storage_images = 172 + }; + const vk::Limits BASE_LIMITS_PERF{ + .sampled_images = 91, + .storage_images = 102 + }; + const vk::Limits GEN_LIMITS{ + .sets = 93, + .uniform_buffers = 54, + .samplers = 147, + .sampled_images = 567, + .storage_images = 261 + }; + const vk::Limits GEN_LIMITS_PERF{ + .sampled_images = 339, + .storage_images = 183 + }; +} + +vk::Limits ls::calculateDescriptorPoolLimits(size_t count, bool perf) { + const auto m = static_cast(count); + + vk::Limits a{BASE_LIMITS}; + vk::Limits b{GEN_LIMITS}; + if (perf) { + a.sampled_images = BASE_LIMITS_PERF.sampled_images; + b.sampled_images = GEN_LIMITS_PERF.sampled_images; + a.storage_images = BASE_LIMITS_PERF.storage_images; + b.storage_images = GEN_LIMITS_PERF.storage_images; + } + + a.sets += b.sets * m; + a.uniform_buffers += b.uniform_buffers * m; + a.samplers += b.samplers * m; + a.sampled_images += b.sampled_images * m; + a.storage_images += b.storage_images * m; + return a; +} diff --git a/lsfg-vk-backend/src/helpers/limits.hpp b/lsfg-vk-backend/src/helpers/limits.hpp new file mode 100644 index 0000000..e2c31cf --- /dev/null +++ b/lsfg-vk-backend/src/helpers/limits.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "lsfg-vk-common/vulkan/descriptor_pool.hpp" + +#include + +namespace ls { + /// calculate limits for descriptor pools + /// @param count number of images + /// @param perf whether performance mode is enabled + /// @return calculated limits + vk::Limits calculateDescriptorPoolLimits(size_t count, bool perf); +} diff --git a/lsfg-vk-backend/src/helpers/managed_shader.cpp b/lsfg-vk-backend/src/helpers/managed_shader.cpp index 9d66762..0646916 100644 --- a/lsfg-vk-backend/src/helpers/managed_shader.cpp +++ b/lsfg-vk-backend/src/helpers/managed_shader.cpp @@ -1,6 +1,7 @@ #include "managed_shader.hpp" #include "lsfg-vk-common/vulkan/buffer.hpp" #include "lsfg-vk-common/vulkan/command_buffer.hpp" +#include "lsfg-vk-common/vulkan/descriptor_pool.hpp" #include "lsfg-vk-common/vulkan/image.hpp" #include "lsfg-vk-common/vulkan/sampler.hpp" #include "lsfg-vk-common/vulkan/shader.hpp" @@ -66,7 +67,7 @@ ManagedShaderBuilder& ManagedShaderBuilder::buffer(const vk::Buffer& buffer) { } ManagedShader ManagedShaderBuilder::build(const vk::Vulkan& vk, - const vk::Shader& shader) const { + const vk::DescriptorPool& pool, const vk::Shader& shader) const { std::vector barriers; barriers.reserve(this->storageImages.size() + this->sampledImages.size()); @@ -102,7 +103,7 @@ ManagedShader ManagedShaderBuilder::build(const vk::Vulkan& vk, return { std::ref(shader), std::move(barriers), - vk::DescriptorSet(vk, shader, + vk::DescriptorSet(vk, pool, shader, this->sampledImages, this->storageImages, this->imageSamplers, diff --git a/lsfg-vk-backend/src/helpers/managed_shader.hpp b/lsfg-vk-backend/src/helpers/managed_shader.hpp index 1618af9..7e3c62c 100644 --- a/lsfg-vk-backend/src/helpers/managed_shader.hpp +++ b/lsfg-vk-backend/src/helpers/managed_shader.hpp @@ -2,6 +2,7 @@ #include "lsfg-vk-common/helpers/pointers.hpp" #include "lsfg-vk-common/vulkan/command_buffer.hpp" +#include "lsfg-vk-common/vulkan/descriptor_pool.hpp" #include "lsfg-vk-common/vulkan/descriptor_set.hpp" #include "lsfg-vk-common/vulkan/shader.hpp" @@ -80,9 +81,11 @@ namespace ls { /// build the managed shader /// @param vk the vulkan instance + /// @param pool the descriptor pool to use /// @param shader the shader to use /// @returns the built managed shader - [[nodiscard]] ManagedShader build(const vk::Vulkan& vk, const vk::Shader& shader) const; + [[nodiscard]] ManagedShader build(const vk::Vulkan& vk, + const vk::DescriptorPool& pool, const vk::Shader& shader) const; private: std::vector> sampledImages; std::vector> storageImages; diff --git a/lsfg-vk-backend/src/helpers/utils.hpp b/lsfg-vk-backend/src/helpers/utils.hpp index 5a22a3f..3d37092 100644 --- a/lsfg-vk-backend/src/helpers/utils.hpp +++ b/lsfg-vk-backend/src/helpers/utils.hpp @@ -3,6 +3,7 @@ #include "../extraction/shader_registry.hpp" #include "lsfg-vk-common/helpers/pointers.hpp" #include "lsfg-vk-common/vulkan/buffer.hpp" +#include "lsfg-vk-common/vulkan/descriptor_pool.hpp" #include "lsfg-vk-common/vulkan/sampler.hpp" #include "lsfg-vk-common/vulkan/vulkan.hpp" @@ -20,6 +21,8 @@ namespace ls { ls::R vk; // safe back reference ls::R shaders; // safe back reference + vk::DescriptorPool pool; + vk::Buffer constantBuffer; std::vector constantBuffers; vk::Sampler bnbSampler; //!< border, no compare, black diff --git a/lsfg-vk-backend/src/lsfgvk.cpp b/lsfg-vk-backend/src/lsfgvk.cpp index db8bfb8..79344a9 100644 --- a/lsfg-vk-backend/src/lsfgvk.cpp +++ b/lsfg-vk-backend/src/lsfgvk.cpp @@ -1,6 +1,7 @@ #include "lsfg-vk-backend/lsfgvk.hpp" #include "extraction/dll_reader.hpp" #include "extraction/shader_registry.hpp" +#include "helpers/limits.hpp" #include "helpers/utils.hpp" #include "lsfg-vk-common/helpers/errors.hpp" #include "lsfg-vk-common/helpers/pointers.hpp" @@ -343,6 +344,7 @@ namespace { return { .vk = std::ref(vk), .shaders = std::ref(shaders), + .pool{vk, ls::calculateDescriptorPoolLimits(count, perf)}, .constantBuffer{vk, ls::getDefaultConstantBuffer(0, 1, hdr, flow)}, .constantBuffers{std::move(constantBuffers)}, diff --git a/lsfg-vk-backend/src/shaderchains/alpha0.cpp b/lsfg-vk-backend/src/shaderchains/alpha0.cpp index 0240273..393e0d0 100644 --- a/lsfg-vk-backend/src/shaderchains/alpha0.cpp +++ b/lsfg-vk-backend/src/shaderchains/alpha0.cpp @@ -37,17 +37,17 @@ Alpha0::Alpha0(const ls::Ctx& ctx, .sampled(sourceImage) .storages(this->tempImages0) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.alpha.at(0))); + .build(ctx.vk, ctx.pool, shaders.alpha.at(0))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0) .storages(this->tempImages1) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.alpha.at(1))); + .build(ctx.vk, ctx.pool, shaders.alpha.at(1))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages1) .storages(this->images) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.alpha.at(2))); + .build(ctx.vk, ctx.pool, shaders.alpha.at(2))); // store dispatch extents this->dispatchExtent0 = ls::add_shift_extent(halfExtent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/alpha1.cpp b/lsfg-vk-backend/src/shaderchains/alpha1.cpp index 0d40948..41a0fac 100644 --- a/lsfg-vk-backend/src/shaderchains/alpha1.cpp +++ b/lsfg-vk-backend/src/shaderchains/alpha1.cpp @@ -35,7 +35,7 @@ Alpha1::Alpha1(const ls::Ctx& ctx, .sampleds(sourceImages) .storages(this->images.at(i)) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.alpha.at(3))); + .build(ctx.vk, ctx.pool, shaders.alpha.at(3))); // store dispatch extents this->dispatchExtent = ls::add_shift_extent(quarterExtent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/beta0.cpp b/lsfg-vk-backend/src/shaderchains/beta0.cpp index 08b8c1e..b68c2a8 100644 --- a/lsfg-vk-backend/src/shaderchains/beta0.cpp +++ b/lsfg-vk-backend/src/shaderchains/beta0.cpp @@ -32,7 +32,7 @@ Beta0::Beta0(const ls::Ctx& ctx, .sampleds(sourceImages.at(i % 3)) .storages(this->images) .sampler(ctx.bnwSampler) - .build(ctx.vk, shader)); + .build(ctx.vk, ctx.pool, shader)); // store dispatch extents this->dispatchExtent = ls::add_shift_extent(extent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/beta1.cpp b/lsfg-vk-backend/src/shaderchains/beta1.cpp index 9591a62..5d7bef1 100644 --- a/lsfg-vk-backend/src/shaderchains/beta1.cpp +++ b/lsfg-vk-backend/src/shaderchains/beta1.cpp @@ -39,23 +39,23 @@ Beta1::Beta1(const ls::Ctx& ctx, .sampleds(sourceImages) .storages(this->tempImages0) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(1))); + .build(ctx.vk, ctx.pool, shaders.at(1))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0) .storages(this->tempImages1) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(2))); + .build(ctx.vk, ctx.pool, shaders.at(2))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages1) .storages(this->tempImages0) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(3))); + .build(ctx.vk, ctx.pool, shaders.at(3))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0) .storages(this->images) .sampler(ctx.bnbSampler) .buffer(ctx.constantBuffer) - .build(ctx.vk, shaders.at(4))); + .build(ctx.vk, ctx.pool, shaders.at(4))); // store dispatch extents this->dispatchExtent0 = ls::add_shift_extent(extent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/delta0.cpp b/lsfg-vk-backend/src/shaderchains/delta0.cpp index 5e3ff0f..951222a 100644 --- a/lsfg-vk-backend/src/shaderchains/delta0.cpp +++ b/lsfg-vk-backend/src/shaderchains/delta0.cpp @@ -41,7 +41,7 @@ Delta0::Delta0(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnwSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, shaders.at(0))); + .build(ctx.vk, ctx.pool, shaders.at(0))); this->sets1.reserve(3); for (size_t i = 0; i < 3; i++) @@ -54,7 +54,7 @@ Delta0::Delta0(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnwSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, shaders.at(5))); + .build(ctx.vk, ctx.pool, shaders.at(5))); // store dispatch extents this->dispatchExtent = ls::add_shift_extent(extent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/delta1.cpp b/lsfg-vk-backend/src/shaderchains/delta1.cpp index e9cf418..68fd193 100644 --- a/lsfg-vk-backend/src/shaderchains/delta1.cpp +++ b/lsfg-vk-backend/src/shaderchains/delta1.cpp @@ -44,17 +44,17 @@ Delta1::Delta1(const ls::Ctx& ctx, size_t idx, .sampleds(sourceImages0) .storages(this->tempImages0) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(1))); + .build(ctx.vk, ctx.pool, shaders.at(1))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0) .storages(this->tempImages1) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(2))); + .build(ctx.vk, ctx.pool, shaders.at(2))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages1) .storages(this->tempImages0) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(3))); + .build(ctx.vk, ctx.pool, shaders.at(3))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0) .sampled(additionalInput0) @@ -63,23 +63,23 @@ Delta1::Delta1(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnbSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, shaders.at(4))); + .build(ctx.vk, ctx.pool, shaders.at(4))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(sourceImages1) .storages(this->tempImages0, 0, m) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(6))); + .build(ctx.vk, ctx.pool, shaders.at(6))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0, 0, m) .storages(this->tempImages1, 0, m) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(7))); + .build(ctx.vk, ctx.pool, shaders.at(7))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages1, 0, m) .storages(this->tempImages0, 0, m) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(8))); + .build(ctx.vk, ctx.pool, shaders.at(8))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0, 0, m) .sampled(additionalInput2) @@ -87,7 +87,7 @@ Delta1::Delta1(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnbSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, shaders.at(9))); + .build(ctx.vk, ctx.pool, shaders.at(9))); // store dispatch extents this->dispatchExtent = ls::add_shift_extent(extent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/gamma0.cpp b/lsfg-vk-backend/src/shaderchains/gamma0.cpp index 77c4e8e..74d95ec 100644 --- a/lsfg-vk-backend/src/shaderchains/gamma0.cpp +++ b/lsfg-vk-backend/src/shaderchains/gamma0.cpp @@ -35,7 +35,7 @@ Gamma0::Gamma0(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnwSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, shader)); + .build(ctx.vk, ctx.pool, shader)); // store dispatch extents this->dispatchExtent = ls::add_shift_extent(extent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/gamma1.cpp b/lsfg-vk-backend/src/shaderchains/gamma1.cpp index ca89446..2fd5cac 100644 --- a/lsfg-vk-backend/src/shaderchains/gamma1.cpp +++ b/lsfg-vk-backend/src/shaderchains/gamma1.cpp @@ -37,17 +37,17 @@ Gamma1::Gamma1(const ls::Ctx& ctx, size_t idx, .sampleds(sourceImages) .storages(this->tempImages0) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(1))); + .build(ctx.vk, ctx.pool, shaders.at(1))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0) .storages(this->tempImages1) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(2))); + .build(ctx.vk, ctx.pool, shaders.at(2))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages1) .storages(this->tempImages0) .sampler(ctx.bnbSampler) - .build(ctx.vk, shaders.at(3))); + .build(ctx.vk, ctx.pool, shaders.at(3))); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampleds(this->tempImages0) .sampled(additionalInput0) @@ -56,7 +56,7 @@ Gamma1::Gamma1(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnbSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, shaders.at(4))); + .build(ctx.vk, ctx.pool, shaders.at(4))); // store dispatch extents this->dispatchExtent = ls::add_shift_extent(extent, 7, 3); diff --git a/lsfg-vk-backend/src/shaderchains/generate.cpp b/lsfg-vk-backend/src/shaderchains/generate.cpp index a677d03..fb97467 100644 --- a/lsfg-vk-backend/src/shaderchains/generate.cpp +++ b/lsfg-vk-backend/src/shaderchains/generate.cpp @@ -31,7 +31,7 @@ Generate::Generate(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnbSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, ctx.shaders.get().generate)); + .build(ctx.vk, ctx.pool, ctx.shaders.get().generate)); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampled(sourceImages.first) .sampled(sourceImages.second) @@ -42,7 +42,7 @@ Generate::Generate(const ls::Ctx& ctx, size_t idx, .sampler(ctx.bnbSampler) .sampler(ctx.eabSampler) .buffer(ctx.constantBuffers.at(idx)) - .build(ctx.vk, ctx.shaders.get().generate)); + .build(ctx.vk, ctx.pool, ctx.shaders.get().generate)); // store dispatch extent this->dispatchExtent = ls::add_shift_extent(ctx.sourceExtent, 15, 4); diff --git a/lsfg-vk-backend/src/shaderchains/mipmaps.cpp b/lsfg-vk-backend/src/shaderchains/mipmaps.cpp index 5d151b4..34fa12b 100644 --- a/lsfg-vk-backend/src/shaderchains/mipmaps.cpp +++ b/lsfg-vk-backend/src/shaderchains/mipmaps.cpp @@ -29,13 +29,13 @@ Mipmaps::Mipmaps(const ls::Ctx& ctx, .storages(this->images) .sampler(ctx.bnbSampler) .buffer(ctx.constantBuffer) - .build(ctx.vk, ctx.shaders.get().mipmaps)); + .build(ctx.vk, ctx.pool, ctx.shaders.get().mipmaps)); this->sets.emplace_back(ls::ManagedShaderBuilder() .sampled(sourceImages.second) .storages(this->images) .sampler(ctx.bnbSampler) .buffer(ctx.constantBuffer) - .build(ctx.vk, ctx.shaders.get().mipmaps)); + .build(ctx.vk, ctx.pool, ctx.shaders.get().mipmaps)); // store dispatch extent this->dispatchExtent = ls::add_shift_extent(ctx.flowExtent, 63, 6); diff --git a/lsfg-vk-common/CMakeLists.txt b/lsfg-vk-common/CMakeLists.txt index ec59a0d..4048b19 100644 --- a/lsfg-vk-common/CMakeLists.txt +++ b/lsfg-vk-common/CMakeLists.txt @@ -1,14 +1,15 @@ set(COMMON_SOURCES "src/helpers/errors.cpp" "src/vulkan/buffer.cpp" + "src/vulkan/command_buffer.cpp" + "src/vulkan/descriptor_pool.cpp" + "src/vulkan/descriptor_set.cpp" + "src/vulkan/fence.cpp" "src/vulkan/image.cpp" "src/vulkan/sampler.cpp" - "src/vulkan/fence.cpp" "src/vulkan/semaphore.cpp" - "src/vulkan/timeline_semaphore.cpp" - "src/vulkan/command_buffer.cpp" - "src/vulkan/descriptor_set.cpp" "src/vulkan/shader.cpp" + "src/vulkan/timeline_semaphore.cpp" "src/vulkan/vulkan.cpp") add_library(lsfg-vk-common STATIC ${COMMON_SOURCES}) diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_pool.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_pool.hpp new file mode 100644 index 0000000..a0f3edd --- /dev/null +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_pool.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include "../helpers/pointers.hpp" +#include "vulkan.hpp" + +#include + +namespace vk { + /// limits for descriptor pools + struct Limits { + uint32_t sets; + uint32_t uniform_buffers; + uint32_t samplers; + uint32_t sampled_images; + uint32_t storage_images; + }; + + /// vulkan descriptor pool + class DescriptorPool { + public: + /// create a descriptor pool + /// @param vk the vulkan instance + /// @param limits the limits for the descriptor pool + /// @throws ls::vulkan_error on failure + DescriptorPool(const vk::Vulkan& vk, const Limits& limits); + + /// get the underlying handle + /// @return the underlying handle + [[nodiscard]] const auto& handle() const { return *this->descriptor_pool; } + private: + ls::owned_ptr descriptor_pool; + }; +} diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp index a2654b6..4e63cb8 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp @@ -3,6 +3,7 @@ #include "../helpers/pointers.hpp" #include "buffer.hpp" #include "image.hpp" +#include "descriptor_pool.hpp" #include "sampler.hpp" #include "shader.hpp" #include "vulkan.hpp" @@ -17,6 +18,7 @@ namespace vk { public: /// create a descriptor set /// @param vk the vulkan instance + /// @param pool the descriptor pool to allocate from /// @param shader the shader module this descriptor set is for /// @param sampledImages the sampled images to bind /// @param storageImages the storage images to bind @@ -24,7 +26,7 @@ namespace vk { /// @param buffers the buffers to bind /// @throws ls::vulkan_error on failure DescriptorSet(const vk::Vulkan& vk, - const vk::Shader& shader, + const vk::DescriptorPool& pool, const vk::Shader& shader, const std::vector>& sampledImages, const std::vector>& storageImages, const std::vector>& samplers, diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp index 04b79b1..3fca762 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp @@ -188,9 +188,6 @@ namespace vk { /// get the command pool /// @return the command pool handle [[nodiscard]] const auto& cmdpool() const { return this->cmdPool.get(); } - /// get the descriptor pool - /// @return the descriptor pool handle - [[nodiscard]] const auto& descpool() const { return this->descPool.get(); } /// get the compute queue /// @return the compute queue handle [[nodiscard]] const auto& queue() const { return this->computeQueue; } @@ -223,6 +220,5 @@ namespace vk { VkQueue computeQueue; ls::owned_ptr cmdPool; - ls::owned_ptr descPool; }; } diff --git a/lsfg-vk-common/src/vulkan/descriptor_pool.cpp b/lsfg-vk-common/src/vulkan/descriptor_pool.cpp new file mode 100644 index 0000000..7e67195 --- /dev/null +++ b/lsfg-vk-common/src/vulkan/descriptor_pool.cpp @@ -0,0 +1,58 @@ +#include "lsfg-vk-common/vulkan/descriptor_pool.hpp" +#include "lsfg-vk-common/helpers/errors.hpp" +#include "lsfg-vk-common/helpers/pointers.hpp" +#include "lsfg-vk-common/vulkan/vulkan.hpp" + +#include +#include + +#include + +using namespace vk; + +namespace { + /// create a descriptor pool + ls::owned_ptr createDescriptorPool(const vk::Vulkan& vk, + const Limits& limits) { + VkDescriptorPool handle{}; + + const std::array poolCounts{{ + { + .type = VK_DESCRIPTOR_TYPE_SAMPLER, + .descriptorCount = limits.samplers + }, + { + .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .descriptorCount = limits.sampled_images + }, + { + .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = limits.storage_images + }, + { + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .descriptorCount = limits.uniform_buffers + } + }}; + const VkDescriptorPoolCreateInfo descpoolInfo{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, + .maxSets = limits.sets, + .poolSizeCount = static_cast(poolCounts.size()), + .pPoolSizes = poolCounts.data() + }; + auto res = vk.df().CreateDescriptorPool(vk.dev(), &descpoolInfo, nullptr, &handle); + if (res != VK_SUCCESS) + throw ls::vulkan_error(res, "vkCreateDescriptorPool() failed"); + + return ls::owned_ptr( + new VkDescriptorPool(handle), + [dev = vk.dev(), defunc = vk.df().DestroyDescriptorPool](VkDescriptorPool& pool) { + defunc(dev, pool, nullptr); + } + ); + } +} + +DescriptorPool::DescriptorPool(const vk::Vulkan& vk, const Limits& limits) + : descriptor_pool(createDescriptorPool(vk, limits)) {} diff --git a/lsfg-vk-common/src/vulkan/descriptor_set.cpp b/lsfg-vk-common/src/vulkan/descriptor_set.cpp index ecef74b..e787888 100644 --- a/lsfg-vk-common/src/vulkan/descriptor_set.cpp +++ b/lsfg-vk-common/src/vulkan/descriptor_set.cpp @@ -2,6 +2,7 @@ #include "lsfg-vk-common/helpers/errors.hpp" #include "lsfg-vk-common/helpers/pointers.hpp" #include "lsfg-vk-common/vulkan/buffer.hpp" +#include "lsfg-vk-common/vulkan/descriptor_pool.hpp" #include "lsfg-vk-common/vulkan/image.hpp" #include "lsfg-vk-common/vulkan/sampler.hpp" #include "lsfg-vk-common/vulkan/shader.hpp" @@ -9,6 +10,7 @@ #include #include +#include #include #include @@ -18,13 +20,13 @@ using namespace vk; namespace { /// create a descriptor set ls::owned_ptr createDescriptorSet(const vk::Vulkan& vk, - const vk::Shader& shader) { + const vk::DescriptorPool& pool, const vk::Shader& shader) { VkDescriptorSet handle{}; auto* layout = shader.descriptorlayout(); const VkDescriptorSetAllocateInfo setInfo{ .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, - .descriptorPool = vk.descpool(), + .descriptorPool = pool.handle(), .descriptorSetCount = 1, .pSetLayouts = &layout }; @@ -34,7 +36,7 @@ namespace { return ls::owned_ptr( new VkDescriptorSet(handle), - [dev = vk.dev(), pool = vk.descpool(), defunc = vk.df().FreeDescriptorSets]( + [dev = vk.dev(), pool = pool.handle(), defunc = vk.df().FreeDescriptorSets]( VkDescriptorSet& commandBufferModule ) { defunc(dev, pool, 1, &commandBufferModule); @@ -44,12 +46,12 @@ namespace { } DescriptorSet::DescriptorSet(const vk::Vulkan& vk, - const vk::Shader& shader, + const vk::DescriptorPool& pool, const vk::Shader& shader, const std::vector>& sampledImages, const std::vector>& storageImages, const std::vector>& samplers, const std::vector>& buffers) - : descriptorSet(createDescriptorSet(vk, shader)) { + : descriptorSet(createDescriptorSet(vk, pool, shader)) { // update descriptor set const size_t bindingCount = samplers.size() diff --git a/lsfg-vk-common/src/vulkan/vulkan.cpp b/lsfg-vk-common/src/vulkan/vulkan.cpp index cac5ff7..93cafc5 100644 --- a/lsfg-vk-common/src/vulkan/vulkan.cpp +++ b/lsfg-vk-common/src/vulkan/vulkan.cpp @@ -236,36 +236,6 @@ namespace { } ); } - - /// create a descriptor pool - ls::owned_ptr createDescriptorPool(const VulkanDeviceFuncs& fd, - VkDevice device) { - VkDescriptorPool handle{}; - - const std::array poolCounts{{ // FIXME: arbitrary limits - { .type = VK_DESCRIPTOR_TYPE_SAMPLER, .descriptorCount = 4096 }, - { .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, .descriptorCount = 4096 }, - { .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, .descriptorCount = 4096 }, - { .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .descriptorCount = 4096 } - }}; - const VkDescriptorPoolCreateInfo descpoolInfo{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, - .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, - .maxSets = 16384, - .poolSizeCount = static_cast(poolCounts.size()), - .pPoolSizes = poolCounts.data() - }; - auto res = fd.CreateDescriptorPool(device, &descpoolInfo, nullptr, &handle); - if (res != VK_SUCCESS) - throw ls::vulkan_error(res, "vkCreateDescriptorPool() failed"); - - return ls::owned_ptr( - new VkDescriptorPool(handle), - [dev = device, defunc = fd.DestroyDescriptorPool](VkDescriptorPool& pool) { - defunc(dev, pool, nullptr); - } - ); - } } /// initialize vulkan instance function pointers @@ -410,9 +380,6 @@ Vulkan::Vulkan(const std::string& appName, version appVersion, cmdPool(createCommandPool(this->device_funcs, *this->device, this->queueFamilyIdx - )), - descPool(createDescriptorPool(this->device_funcs, - *this->device )) { } @@ -437,9 +404,6 @@ Vulkan::Vulkan(VkInstance instance, VkDevice device, cmdPool(createCommandPool(this->device_funcs, *this->device, this->queueFamilyIdx - )), - descPool(createDescriptorPool(this->device_funcs, - *this->device )) { } diff --git a/lsfg-vk-debug/src/debug.cpp b/lsfg-vk-debug/src/debug.cpp index dcbdd36..b21123e 100644 --- a/lsfg-vk-debug/src/debug.cpp +++ b/lsfg-vk-debug/src/debug.cpp @@ -95,7 +95,7 @@ int main() { std::vector destimgs{}; std::vector destfds{}; - for (size_t i = 0; i < 1; i++) { + for (size_t i = 0; i < 4; i++) { int fd{}; destimgs.emplace_back(vk, EXTENT, VK_FORMAT_R8G8B8A8_UNORM, diff --git a/lsfg-vk-layer/src/configuration/config.cpp b/lsfg-vk-layer/src/configuration/config.cpp index 40ec34a..208bed1 100644 --- a/lsfg-vk-layer/src/configuration/config.cpp +++ b/lsfg-vk-layer/src/configuration/config.cpp @@ -27,7 +27,7 @@ active_in = [ # see the wiki for more info 'vkcube', 'vkcubepp' ] -gpu = 'NVIDIA GeForce RTX 5080' # see the wiki for more info +# gpu = 'NVIDIA GeForce RTX 5080' # see the wiki for more info multiplier = 4 flow_scale = 0.85 performance_mode = true