Allow custom input descriptors

This commit is contained in:
2023-09-01 14:59:11 +02:00
parent df4194be51
commit be7a48dc09
7 changed files with 40 additions and 21 deletions

View File

@@ -15,6 +15,9 @@ namespace openVulkanoCpp::Scene
{
class Camera : public Node
{
public:
ICloseable* renderCamera = nullptr;
protected:
Math::Matrix4f m_viewProjection{1}, m_view{1}, m_projection{1};
Math::Vector4f m_camPosition{};
@@ -35,8 +38,6 @@ namespace openVulkanoCpp::Scene
public:
static constexpr size_t SIZE = sizeof(Math::Matrix4f) * 3 + sizeof(Math::Vector4f) + sizeof(float) * 8;
ICloseable* renderCamera = nullptr;
void* GetData() { return &m_viewProjection; }
void Init(float width, float height, float nearPlane, float farPlane)

View File

@@ -56,11 +56,8 @@ namespace openVulkanoCpp
constexpr bool operator <(const DescriptorSetLayoutBinding& rhs) const
{
return bindingId < rhs.bindingId &&
descriptorType < rhs.descriptorType &&
descriptorCount < rhs.descriptorCount &&
stageFlags < rhs.stageFlags &&
immutableSamplers < rhs.immutableSamplers;
return std::tie(bindingId, descriptorType, descriptorCount, stageFlags, immutableSamplers) <
std::tie(rhs.bindingId, rhs.descriptorType, rhs.descriptorCount, rhs.stageFlags, rhs.immutableSamplers);
}
};

View File

@@ -71,7 +71,7 @@ namespace openVulkanoCpp::Scene
public:
std::vector<ShaderProgram> shaderPrograms{};
std::vector<VertexInputDescription> vertexInputDescriptions{};
std::vector<DescriptorSetLayoutBinding> descriptorSetLayoutBindings{};
std::vector<std::vector<DescriptorSetLayoutBinding>> descriptorSets;
Topology topology = Topology::TRIANGLE_LIST;
CullMode cullMode = CullMode::BACK;
ICloseable* renderShader = nullptr;
@@ -121,22 +121,23 @@ namespace openVulkanoCpp::Scene
return *this;
}
Shader& AddDescriptorSetLayoutBinding(const DescriptorSetLayoutBinding& binding, int bindingId = -1)
Shader& AddDescriptorSetLayoutBinding(const DescriptorSetLayoutBinding& binding, int setId = -1)
{
CheckShaderInitState();
if (bindingId < 0) bindingId = static_cast<int>(descriptorSetLayoutBindings.size());
while (bindingId > descriptorSetLayoutBindings.size())
if (setId < 0) setId = static_cast<int>(descriptorSets.size() + 2);
if (setId < 2) throw std::runtime_error("Cant bind set id 0 or 1!");
setId -= 2;
while (setId >= descriptorSets.size())
{
descriptorSetLayoutBindings.emplace_back().bindingId = descriptorSetLayoutBindings.size() - 1;
descriptorSets.emplace_back();
}
if (bindingId == vertexInputDescriptions.size())
if (setId == vertexInputDescriptions.size())
{
descriptorSetLayoutBindings.emplace_back(bindingId, binding);
descriptorSets.emplace_back().push_back(binding);
}
else
{
descriptorSetLayoutBindings[bindingId] = binding;
descriptorSetLayoutBindings[bindingId].bindingId = bindingId;
descriptorSets[setId].push_back(binding);
}
return *this;
}

View File

@@ -189,6 +189,18 @@ namespace openVulkanoCpp::Vulkan
}
}
UniformBuffer* ResourceManager::CreateUniformBuffer(const DescriptorSetLayoutBinding& binding, size_t size, void* data, uint32_t setId)
{
const std::unique_lock lock(mutex);
const vk::DeviceSize allocSize = Utils::Align(size, uniformBufferAlignment);
auto buffer = CreateDeviceOnlyBufferWithData(allocSize, vk::BufferUsageFlagBits::eUniformBuffer, data);
UniformBuffer* uBuffer = new UniformBuffer();
uBuffer->Init(buffer, 0, allocSize, GetDescriptorLayoutSet(binding), binding, setId);
return uBuffer;
}
vk::DescriptorSetLayout* ResourceManager::GetDescriptorLayoutSet(const DescriptorSetLayoutBinding& descriptorSetLayoutBinding)
{
auto& layout = descriptorSetLayoutCache[descriptorSetLayoutBinding];

View File

@@ -97,6 +97,8 @@ namespace openVulkanoCpp
[[nodiscard]] vk::Device GetDevice() const { return device; }
UniformBuffer* CreateUniformBuffer(const DescriptorSetLayoutBinding& binding, size_t size, void* data, uint32_t setId = 2);
protected: // Allocation management
void DoFreeBuffer(ManagedBuffer* buffer);

View File

@@ -51,7 +51,7 @@ namespace openVulkanoCpp::Vulkan
void Record(VulkanDrawContext* drawContext) override
{
uint32_t frameOffset = m_frameOffset * drawContext->currentImageId;
drawContext->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, drawContext->GetShader()->pipelineLayout, m_setOffset, m_setCount, &m_descriptorSet, 1, &frameOffset);
drawContext->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, drawContext->GetShader()->pipelineLayout, m_setOffset, m_setCount, &m_descriptorSet, (m_frameOffset) ? 1 : 0, &frameOffset);
}
void Update(void* data, uint32_t size, uint32_t bufferId) const

View File

@@ -133,10 +133,16 @@ namespace openVulkanoCpp::Vulkan
//std::array<vk::PushConstantRange, 1> camPushConstantDescs = { camPushConstantDesc };
std::array<vk::DescriptorSetLayoutBinding, 1> layoutBindings1 = { reinterpret_cast<const vk::DescriptorSetLayoutBinding&>(NODE_LAYOUT_BINDING) };
std::array<vk::DescriptorSetLayoutBinding, 1> layoutBindings2 = { reinterpret_cast<const vk::DescriptorSetLayoutBinding&>(CAM_LAYOUT_BINDING) };
vk::DescriptorSetLayoutCreateInfo dslci = { {}, layoutBindings1.size(), layoutBindings1.data() };
vk::DescriptorSetLayoutCreateInfo dslci2 = { {}, layoutBindings2.size(), layoutBindings2.data() };
descriptorSetLayouts.push_back(device.createDescriptorSetLayout(dslci));
descriptorSetLayouts.push_back(device.createDescriptorSetLayout(dslci2));
descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings1.size(), layoutBindings1.data() }));
descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings2.size(), layoutBindings2.data() }));
for(const auto& set : shader->descriptorSets)
{
vk::DescriptorSetLayoutCreateInfo createInfo { {}, static_cast<uint32_t>(set.size()), reinterpret_cast<const vk::DescriptorSetLayoutBinding*>(set.data()) };
descriptorSetLayouts.push_back(device.createDescriptorSetLayout(createInfo));
}
vk::PipelineLayoutCreateInfo plci = { {}, static_cast<uint32_t>(descriptorSetLayouts.size()), descriptorSetLayouts.data(), 0, nullptr };
pipelineLayout = this->device.createPipelineLayout(plci);
}