mirror of
https://github.com/love2d/love.git
synced 2026-08-17 19:23:38 +02:00
vulkan: fix crash
This commit is contained in:
@@ -267,6 +267,8 @@ void Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, uint32_t frame
|
|||||||
VkDescriptorSet currentDescriptorSet = descriptorSetsVector.at(currentFrame).at(currentUsedDescriptorSetsCount);
|
VkDescriptorSet currentDescriptorSet = descriptorSetsVector.at(currentFrame).at(currentUsedDescriptorSetsCount);
|
||||||
std::vector<VkWriteDescriptorSet> descriptorWrite{};
|
std::vector<VkWriteDescriptorSet> descriptorWrite{};
|
||||||
|
|
||||||
|
VkDescriptorBufferInfo* bufferInfo = nullptr;
|
||||||
|
|
||||||
if (!localUniformStagingData.empty()) {
|
if (!localUniformStagingData.empty()) {
|
||||||
// additional data is always added onto the last stream buffer in the current frame
|
// additional data is always added onto the last stream buffer in the current frame
|
||||||
auto currentStreamBuffer = streamBuffers.at(currentFrame).back();
|
auto currentStreamBuffer = streamBuffers.at(currentFrame).back();
|
||||||
@@ -276,10 +278,10 @@ void Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, uint32_t frame
|
|||||||
currentStreamBuffer->unmap(uniformBufferSizeAligned);
|
currentStreamBuffer->unmap(uniformBufferSizeAligned);
|
||||||
currentStreamBuffer->markUsed(uniformBufferSizeAligned);
|
currentStreamBuffer->markUsed(uniformBufferSizeAligned);
|
||||||
|
|
||||||
VkDescriptorBufferInfo bufferInfo{};
|
bufferInfo = new VkDescriptorBufferInfo();
|
||||||
bufferInfo.buffer = (VkBuffer)currentStreamBuffer->getHandle();
|
bufferInfo->buffer = (VkBuffer)currentStreamBuffer->getHandle();
|
||||||
bufferInfo.offset = currentUsedUniformStreamBuffersCount * uniformBufferSizeAligned;
|
bufferInfo->offset = currentUsedUniformStreamBuffersCount * uniformBufferSizeAligned;
|
||||||
bufferInfo.range = localUniformStagingData.size();
|
bufferInfo->range = localUniformStagingData.size();
|
||||||
|
|
||||||
VkWriteDescriptorSet uniformWrite{};
|
VkWriteDescriptorSet uniformWrite{};
|
||||||
uniformWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
uniformWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
@@ -288,7 +290,7 @@ void Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, uint32_t frame
|
|||||||
uniformWrite.dstArrayElement = 0;
|
uniformWrite.dstArrayElement = 0;
|
||||||
uniformWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
uniformWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
uniformWrite.descriptorCount = 1;
|
uniformWrite.descriptorCount = 1;
|
||||||
uniformWrite.pBufferInfo = &bufferInfo;
|
uniformWrite.pBufferInfo = bufferInfo;
|
||||||
|
|
||||||
descriptorWrite.push_back(uniformWrite);
|
descriptorWrite.push_back(uniformWrite);
|
||||||
}
|
}
|
||||||
@@ -336,6 +338,9 @@ void Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, uint32_t frame
|
|||||||
for (const auto imageInfo : imageInfos) {
|
for (const auto imageInfo : imageInfos) {
|
||||||
delete imageInfo;
|
delete imageInfo;
|
||||||
}
|
}
|
||||||
|
if (bufferInfo) {
|
||||||
|
delete bufferInfo;
|
||||||
|
}
|
||||||
|
|
||||||
vkCmdBindDescriptorSets(commandBuffer, bindPoint, pipelineLayout, 0, 1, ¤tDescriptorSet, 0, nullptr);
|
vkCmdBindDescriptorSets(commandBuffer, bindPoint, pipelineLayout, 0, 1, ¤tDescriptorSet, 0, nullptr);
|
||||||
|
|
||||||
@@ -386,13 +391,10 @@ void Shader::calculateUniformBufferSizeAligned() {
|
|||||||
auto vgfx = (Graphics*)gfx;
|
auto vgfx = (Graphics*)gfx;
|
||||||
auto minAlignment = vgfx->getMinUniformBufferOffsetAlignment();
|
auto minAlignment = vgfx->getMinUniformBufferOffsetAlignment();
|
||||||
size_t size = localUniformStagingData.size();
|
size_t size = localUniformStagingData.size();
|
||||||
uniformBufferSizeAligned =
|
auto factor = static_cast<VkDeviceSize>(std::ceil(
|
||||||
static_cast<VkDeviceSize>(
|
static_cast<float>(size) / static_cast<float>(minAlignment)
|
||||||
std::ceil(
|
));
|
||||||
static_cast<float>(size) / static_cast<float>(minAlignment)
|
uniformBufferSizeAligned = factor * minAlignment;
|
||||||
)
|
|
||||||
)
|
|
||||||
* minAlignment;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shader::buildLocalUniforms(spirv_cross::Compiler& comp, const spirv_cross::SPIRType& type, size_t baseoff, const std::string& basename) {
|
void Shader::buildLocalUniforms(spirv_cross::Compiler& comp, const spirv_cross::SPIRType& type, size_t baseoff, const std::string& basename) {
|
||||||
|
|||||||
Reference in New Issue
Block a user