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); 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, &currentDescriptorSet, 0, nullptr); vkCmdBindDescriptorSets(commandBuffer, bindPoint, pipelineLayout, 0, 1, &currentDescriptorSet, 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) {