mirror of
https://github.com/love2d/love.git
synced 2026-08-21 13:09:56 +02:00
vulkan: modify descriptor set allocation
Setting the size of each descriptor pool to one was a hack introduced to make the code work on android. Changing the code to now allocate all descriptor sets at once should fix the previous crash. Not tested yet.
This commit is contained in:
@@ -118,7 +118,7 @@ static const TBuiltInResource defaultTBuiltInResource = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const uint32_t STREAMBUFFER_DEFAULT_SIZE = 16;
|
static const uint32_t STREAMBUFFER_DEFAULT_SIZE = 16;
|
||||||
static const uint32_t DESCRIPTOR_POOL_SIZE = 1;
|
static const uint32_t DESCRIPTOR_POOL_SIZE = 16;
|
||||||
|
|
||||||
static VkShaderStageFlagBits getStageBit(ShaderStageType type) {
|
static VkShaderStageFlagBits getStageBit(ShaderStageType type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@@ -174,7 +174,6 @@ bool Shader::loadVolatile() {
|
|||||||
currentFrame = 0;
|
currentFrame = 0;
|
||||||
currentUsedUniformStreamBuffersCount = 0;
|
currentUsedUniformStreamBuffersCount = 0;
|
||||||
currentUsedDescriptorSetsCount = 0;
|
currentUsedDescriptorSetsCount = 0;
|
||||||
currentAllocatedDescriptorSets = DESCRIPTOR_POOL_SIZE;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -197,11 +196,14 @@ void Shader::unloadVolatile() {
|
|||||||
if (computePipeline != VK_NULL_HANDLE)
|
if (computePipeline != VK_NULL_HANDLE)
|
||||||
vkDestroyPipeline(device, computePipeline, nullptr);
|
vkDestroyPipeline(device, computePipeline, nullptr);
|
||||||
});
|
});
|
||||||
for (const auto &streamBufferVector : streamBuffers) {
|
|
||||||
for (const auto streamBuffer : streamBufferVector) {
|
while (!freeDescriptorSets.empty())
|
||||||
|
freeDescriptorSets.pop();
|
||||||
|
|
||||||
|
for (const auto &streamBufferVector : streamBuffers)
|
||||||
|
for (const auto streamBuffer : streamBufferVector)
|
||||||
delete streamBuffer;
|
delete streamBuffer;
|
||||||
}
|
|
||||||
}
|
|
||||||
shaderModules.clear();
|
shaderModules.clear();
|
||||||
shaderStages.clear();
|
shaderStages.clear();
|
||||||
streamBuffers.clear();
|
streamBuffers.clear();
|
||||||
@@ -877,7 +879,7 @@ void Shader::setMainTex(graphics::Texture* texture) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VkDescriptorSet Shader::allocateDescriptorSet() {
|
VkDescriptorSet Shader::allocateDescriptorSet() {
|
||||||
if (currentAllocatedDescriptorSets >= DESCRIPTOR_POOL_SIZE) {
|
if (freeDescriptorSets.empty()) {
|
||||||
// fixme: we can optimize this, since sizes should never change for a given shader.
|
// fixme: we can optimize this, since sizes should never change for a given shader.
|
||||||
std::vector<VkDescriptorPoolSize> sizes;
|
std::vector<VkDescriptorPoolSize> sizes;
|
||||||
|
|
||||||
@@ -910,24 +912,29 @@ VkDescriptorSet Shader::allocateDescriptorSet() {
|
|||||||
}
|
}
|
||||||
descriptorPools.push_back(pool);
|
descriptorPools.push_back(pool);
|
||||||
|
|
||||||
currentAllocatedDescriptorSets = 0;
|
std::vector<VkDescriptorSetLayout> layouts(DESCRIPTOR_POOL_SIZE, descriptorSetLayout);
|
||||||
|
|
||||||
|
VkDescriptorSetAllocateInfo allocInfo{};
|
||||||
|
allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
allocInfo.descriptorPool = descriptorPools.back();
|
||||||
|
allocInfo.descriptorSetCount = DESCRIPTOR_POOL_SIZE;
|
||||||
|
allocInfo.pSetLayouts = layouts.data();
|
||||||
|
|
||||||
|
std::vector<VkDescriptorSet> descriptorSet;
|
||||||
|
descriptorSet.resize(DESCRIPTOR_POOL_SIZE);
|
||||||
|
VkResult result = vkAllocateDescriptorSets(device, &allocInfo, descriptorSet.data());
|
||||||
|
if (result != VK_SUCCESS) {
|
||||||
|
throw love::Exception("failed to allocate descriptor set");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto ds : descriptorSet) {
|
||||||
|
freeDescriptorSets.push(ds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VkDescriptorSetAllocateInfo allocInfo{};
|
auto ds = freeDescriptorSets.front();
|
||||||
allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
freeDescriptorSets.pop();
|
||||||
allocInfo.descriptorPool = descriptorPools.back();
|
return ds;
|
||||||
allocInfo.descriptorSetCount = 1;
|
|
||||||
allocInfo.pSetLayouts = &descriptorSetLayout;
|
|
||||||
|
|
||||||
VkDescriptorSet descriptorSet;
|
|
||||||
VkResult result = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet);
|
|
||||||
if (result != VK_SUCCESS) {
|
|
||||||
throw love::Exception("failed to allocate descriptor set");
|
|
||||||
}
|
|
||||||
|
|
||||||
currentAllocatedDescriptorSets++;
|
|
||||||
|
|
||||||
return descriptorSet;
|
|
||||||
}
|
}
|
||||||
} // vulkan
|
} // vulkan
|
||||||
} // graphics
|
} // graphics
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
|
||||||
namespace love {
|
namespace love {
|
||||||
@@ -88,7 +89,7 @@ private:
|
|||||||
// that gets dynamically increased if more memory is needed
|
// that gets dynamically increased if more memory is needed
|
||||||
std::vector<std::vector<StreamBuffer*>> streamBuffers;
|
std::vector<std::vector<StreamBuffer*>> streamBuffers;
|
||||||
std::vector<VkDescriptorPool> descriptorPools;
|
std::vector<VkDescriptorPool> descriptorPools;
|
||||||
uint32_t currentAllocatedDescriptorSets;
|
std::queue<VkDescriptorSet> freeDescriptorSets;
|
||||||
std::vector<std::vector<VkDescriptorSet>> descriptorSetsVector;
|
std::vector<std::vector<VkDescriptorSet>> descriptorSetsVector;
|
||||||
|
|
||||||
std::vector<VkPipelineShaderStageCreateInfo> shaderStages;
|
std::vector<VkPipelineShaderStageCreateInfo> shaderStages;
|
||||||
|
|||||||
Reference in New Issue
Block a user