Browse Source

vulkan: fix crash

niki 3 years ago
parent
commit
b28d2df6f8
1 changed files with 14 additions and 12 deletions
  1. 14 12
      src/modules/graphics/vulkan/Shader.cpp

+ 14 - 12
src/modules/graphics/vulkan/Shader.cpp

@@ -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) {