mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2026-02-17 19:21:06 +00:00
refactor(cleanup): dynamically allocate descriptor pool sizes
This commit is contained in:
parent
3d3ab22ec6
commit
5703d715fa
26 changed files with 215 additions and 83 deletions
|
|
@ -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"
|
||||
|
|
|
|||
53
lsfg-vk-backend/src/helpers/limits.cpp
Normal file
53
lsfg-vk-backend/src/helpers/limits.cpp
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
#include "limits.hpp"
|
||||
|
||||
#include "lsfg-vk-common/vulkan/descriptor_pool.hpp"
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
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<uint16_t>(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;
|
||||
}
|
||||
13
lsfg-vk-backend/src/helpers/limits.hpp
Normal file
13
lsfg-vk-backend/src/helpers/limits.hpp
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#pragma once
|
||||
|
||||
#include "lsfg-vk-common/vulkan/descriptor_pool.hpp"
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
@ -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<vk::Barrier> 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,
|
||||
|
|
|
|||
|
|
@ -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<ls::R<const vk::Image>> sampledImages;
|
||||
std::vector<ls::R<const vk::Image>> storageImages;
|
||||
|
|
|
|||
|
|
@ -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<const vk::Vulkan> vk; // safe back reference
|
||||
ls::R<const extr::ShaderRegistry> shaders; // safe back reference
|
||||
|
||||
vk::DescriptorPool pool;
|
||||
|
||||
vk::Buffer constantBuffer;
|
||||
std::vector<vk::Buffer> constantBuffers;
|
||||
vk::Sampler bnbSampler; //!< border, no compare, black
|
||||
|
|
|
|||
|
|
@ -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)},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
#pragma once
|
||||
|
||||
#include "../helpers/pointers.hpp"
|
||||
#include "vulkan.hpp"
|
||||
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
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<VkDescriptorPool> descriptor_pool;
|
||||
};
|
||||
}
|
||||
|
|
@ -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<ls::R<const vk::Image>>& sampledImages,
|
||||
const std::vector<ls::R<const vk::Image>>& storageImages,
|
||||
const std::vector<ls::R<const vk::Sampler>>& samplers,
|
||||
|
|
|
|||
|
|
@ -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<VkCommandPool> cmdPool;
|
||||
ls::owned_ptr<VkDescriptorPool> descPool;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
58
lsfg-vk-common/src/vulkan/descriptor_pool.cpp
Normal file
58
lsfg-vk-common/src/vulkan/descriptor_pool.cpp
Normal file
|
|
@ -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 <array>
|
||||
#include <cstdint>
|
||||
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
using namespace vk;
|
||||
|
||||
namespace {
|
||||
/// create a descriptor pool
|
||||
ls::owned_ptr<VkDescriptorPool> createDescriptorPool(const vk::Vulkan& vk,
|
||||
const Limits& limits) {
|
||||
VkDescriptorPool handle{};
|
||||
|
||||
const std::array<VkDescriptorPoolSize, 4> 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<uint32_t>(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<VkDescriptorPool>(
|
||||
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)) {}
|
||||
|
|
@ -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 <cstddef>
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
|
@ -18,13 +20,13 @@ using namespace vk;
|
|||
namespace {
|
||||
/// create a descriptor set
|
||||
ls::owned_ptr<VkDescriptorSet> 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<VkDescriptorSet>(
|
||||
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<ls::R<const vk::Image>>& sampledImages,
|
||||
const std::vector<ls::R<const vk::Image>>& storageImages,
|
||||
const std::vector<ls::R<const vk::Sampler>>& samplers,
|
||||
const std::vector<ls::R<const vk::Buffer>>& buffers)
|
||||
: descriptorSet(createDescriptorSet(vk, shader)) {
|
||||
: descriptorSet(createDescriptorSet(vk, pool, shader)) {
|
||||
// update descriptor set
|
||||
const size_t bindingCount =
|
||||
samplers.size()
|
||||
|
|
|
|||
|
|
@ -236,36 +236,6 @@ namespace {
|
|||
}
|
||||
);
|
||||
}
|
||||
|
||||
/// create a descriptor pool
|
||||
ls::owned_ptr<VkDescriptorPool> createDescriptorPool(const VulkanDeviceFuncs& fd,
|
||||
VkDevice device) {
|
||||
VkDescriptorPool handle{};
|
||||
|
||||
const std::array<VkDescriptorPoolSize, 4> 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<uint32_t>(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<VkDescriptorPool>(
|
||||
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
|
||||
)) {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ int main() {
|
|||
|
||||
std::vector<vk::Image> destimgs{};
|
||||
std::vector<int> 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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue