refactor(cleanup): dynamically allocate descriptor pool sizes

This commit is contained in:
PancakeTAS 2025-12-20 05:38:27 +01:00
parent 3d3ab22ec6
commit 5703d715fa
No known key found for this signature in database
26 changed files with 215 additions and 83 deletions

View file

@ -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"

View 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;
}

View 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);
}

View file

@ -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,

View file

@ -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;

View file

@ -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

View file

@ -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)},

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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})

View file

@ -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;
};
}

View file

@ -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,

View file

@ -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;
};
}

View 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)) {}

View file

@ -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()

View file

@ -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
)) {
}

View file

@ -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,

View file

@ -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