mirror of
https://github.com/love2d/love.git
synced 2026-08-16 08:11:02 +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);
|
||||
std::vector<VkWriteDescriptorSet> descriptorWrite{};
|
||||
|
||||
VkDescriptorBufferInfo* bufferInfo = nullptr;
|
||||
|
||||
if (!localUniformStagingData.empty()) {
|
||||
// additional data is always added onto the last stream buffer in the current frame
|
||||
auto currentStreamBuffer = streamBuffers.at(currentFrame).back();
|
||||
@@ -276,10 +278,10 @@ void Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, uint32_t frame
|
||||
currentStreamBuffer->unmap(uniformBufferSizeAligned);
|
||||
currentStreamBuffer->markUsed(uniformBufferSizeAligned);
|
||||
|
||||
VkDescriptorBufferInfo bufferInfo{};
|
||||
bufferInfo.buffer = (VkBuffer)currentStreamBuffer->getHandle();
|
||||
bufferInfo.offset = currentUsedUniformStreamBuffersCount * uniformBufferSizeAligned;
|
||||
bufferInfo.range = localUniformStagingData.size();
|
||||
bufferInfo = new VkDescriptorBufferInfo();
|
||||
bufferInfo->buffer = (VkBuffer)currentStreamBuffer->getHandle();
|
||||
bufferInfo->offset = currentUsedUniformStreamBuffersCount * uniformBufferSizeAligned;
|
||||
bufferInfo->range = localUniformStagingData.size();
|
||||
|
||||
VkWriteDescriptorSet uniformWrite{};
|
||||
uniformWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
@@ -288,7 +290,7 @@ void Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, uint32_t frame
|
||||
uniformWrite.dstArrayElement = 0;
|
||||
uniformWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
uniformWrite.descriptorCount = 1;
|
||||
uniformWrite.pBufferInfo = &bufferInfo;
|
||||
uniformWrite.pBufferInfo = bufferInfo;
|
||||
|
||||
descriptorWrite.push_back(uniformWrite);
|
||||
}
|
||||
@@ -336,6 +338,9 @@ void Shader::cmdPushDescriptorSets(VkCommandBuffer commandBuffer, uint32_t frame
|
||||
for (const auto imageInfo : imageInfos) {
|
||||
delete imageInfo;
|
||||
}
|
||||
if (bufferInfo) {
|
||||
delete bufferInfo;
|
||||
}
|
||||
|
||||
vkCmdBindDescriptorSets(commandBuffer, bindPoint, pipelineLayout, 0, 1, ¤tDescriptorSet, 0, nullptr);
|
||||
|
||||
@@ -386,13 +391,10 @@ void Shader::calculateUniformBufferSizeAligned() {
|
||||
auto vgfx = (Graphics*)gfx;
|
||||
auto minAlignment = vgfx->getMinUniformBufferOffsetAlignment();
|
||||
size_t size = localUniformStagingData.size();
|
||||
uniformBufferSizeAligned =
|
||||
static_cast<VkDeviceSize>(
|
||||
std::ceil(
|
||||
static_cast<float>(size) / static_cast<float>(minAlignment)
|
||||
)
|
||||
)
|
||||
* minAlignment;
|
||||
auto factor = static_cast<VkDeviceSize>(std::ceil(
|
||||
static_cast<float>(size) / static_cast<float>(minAlignment)
|
||||
));
|
||||
uniformBufferSizeAligned = factor * minAlignment;
|
||||
}
|
||||
|
||||
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