vulkan: fix crash

This commit is contained in:
niki
2022-08-31 02:35:56 +02:00
parent a0ee9f7b9b
commit b28d2df6f8
+14 -12
View File
@@ -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, &currentDescriptorSet, 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) {