From 50195131cce1f39842524acf0ea11332a8a61659 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 9 Dec 2015 21:44:28 +0100 Subject: [PATCH] Fix up deserialise functions (delete/cleanup allocated arrays on replay) --- renderdoc/driver/vulkan/vk_common.cpp | 88 +++++++++++---------------- renderdoc/driver/vulkan/vk_common.h | 2 + 2 files changed, 38 insertions(+), 52 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 083ae54c4..ffae03797 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -2754,6 +2754,8 @@ void Serialiser::Deserialise(const VkDeviceCreateInfo* const el) const if(m_Mode == READING) { RDCASSERT(el->pNext == NULL); // otherwise delete + for(uint32_t i=0; i < el->queueCreateInfoCount; i++) + delete[] el->pQueueCreateInfos[i].pQueuePriorities; delete [] el->pQueueCreateInfos; delete el->ppEnabledExtensionNames; delete el->ppEnabledLayerNames; @@ -2872,16 +2874,6 @@ void Serialiser::Serialise(const char *name, VkSparseBufferMemoryBindInfo &el) SerialiseComplexArray("pBinds", (VkSparseMemoryBind *&)el.pBinds, el.bindCount); } -template<> -void Serialiser::Deserialise(const VkSparseBufferMemoryBindInfo* const el) const -{ - if(m_Mode == READING) - { - RDCASSERT(el->pNext == NULL); // otherwise delete - delete [] el->pBinds; - } -} - template<> void Serialiser::Serialise(const char *name, VkSparseImageOpaqueMemoryBindInfo &el) { @@ -2891,16 +2883,6 @@ void Serialiser::Serialise(const char *name, VkSparseImageOpaqueMemoryBindInfo & SerialiseComplexArray("pBinds", (VkSparseMemoryBind *&)el.pBinds, el.bindCount); } -template<> -void Serialiser::Deserialise(const VkSparseImageOpaqueMemoryBindInfo* const el) const -{ - if(m_Mode == READING) - { - RDCASSERT(el->pNext == NULL); // otherwise delete - delete [] el->pBinds; - } -} - template<> void Serialiser::Serialise(const char *name, VkSparseImageMemoryBind &el) { @@ -2956,7 +2938,11 @@ void Serialiser::Deserialise(const VkBindSparseInfo* const el) const { RDCASSERT(el->pNext == NULL); // otherwise delete delete [] el->pWaitSemaphores; + for(uint32_t i=0; i < el->bufferBindCount; i++) + delete[] el->pBufferBinds[i].pBinds; delete [] el->pBufferBinds; + for(uint32_t i=0; i < el->imageOpaqueBindCount; i++) + delete[] el->pImageOpaqueBinds[i].pBinds; delete [] el->pImageOpaqueBinds; delete [] el->pImageBinds; delete [] el->pSignalSemaphores; @@ -3078,24 +3064,16 @@ void Serialiser::Deserialise(const VkRenderPassCreateInfo* const el) const if(m_Mode == READING) { RDCASSERT(el->pNext == NULL); // otherwise delete - for (uint32_t i=0; iattachmentCount; i++) - { - RDCASSERT(el->pAttachments[i].pNext == NULL); // otherwise delete - } delete [] el->pAttachments; for (uint32_t i=0; isubpassCount; i++) { - RDCASSERT(el->pSubpasses[i].pNext == NULL); // otherwise delete - delete el->pSubpasses[i].pInputAttachments; - delete el->pSubpasses[i].pColorAttachments; - delete el->pSubpasses[i].pResolveAttachments; - delete el->pSubpasses[i].pPreserveAttachments; + delete el->pSubpasses[i].pDepthStencilAttachment; + delete[] el->pSubpasses[i].pInputAttachments; + delete[] el->pSubpasses[i].pColorAttachments; + delete[] el->pSubpasses[i].pResolveAttachments; + if(el->pSubpasses[i].pPreserveAttachments) delete[] el->pSubpasses[i].pPreserveAttachments; } delete [] el->pSubpasses; - for (uint32_t i=0; idependencyCount; i++) - { - RDCASSERT(el->pDependencies[i].pNext == NULL); // otherwise delete - } delete [] el->pDependencies; } } @@ -3517,17 +3495,6 @@ void Serialiser::Serialise(const char *name, VkSpecializationInfo &el) SerialiseComplexArray("pMapEntries", (VkSpecializationMapEntry *&)el.pMapEntries, el.mapEntryCount); } -template<> -void Serialiser::Deserialise(const VkSpecializationInfo* const el) const -{ - if(m_Mode == READING) - { - RDCASSERT(el->pNext == NULL); // otherwise delete - delete [] (byte *)(el->pData); - delete [] el->pMapEntries; - } -} - template<> void Serialiser::Serialise(const char *name, VkPipelineCacheCreateInfo &el) { @@ -3767,8 +3734,8 @@ void Serialiser::Deserialise(const VkGraphicsPipelineCreateInfo* const el) const if (el->pViewportState) { RDCASSERT(el->pViewportState->pNext == NULL); // otherwise delete - delete [] el->pViewportState->pViewports; - delete [] el->pViewportState->pScissors; + if(el->pViewportState->pViewports) delete [] el->pViewportState->pViewports; + if(el->pViewportState->pScissors) delete [] el->pViewportState->pScissors; delete el->pViewportState; } if (el->pRasterizationState) @@ -3796,7 +3763,7 @@ void Serialiser::Deserialise(const VkGraphicsPipelineCreateInfo* const el) const if (el->pDynamicState) { RDCASSERT(el->pDynamicState->pNext == NULL); // otherwise delete - delete [] el->pDynamicState->pDynamicStates; + if(el->pDynamicState->pDynamicStates) delete [] el->pDynamicState->pDynamicStates; delete el->pDynamicState; } for (uint32_t i=0; istageCount; i++) @@ -3805,7 +3772,7 @@ void Serialiser::Deserialise(const VkGraphicsPipelineCreateInfo* const el) const if (el->pStages[i].pSpecializationInfo) { delete [] (byte *)(el->pStages[i].pSpecializationInfo->pData); - delete [] el->pStages[i].pSpecializationInfo->pMap; + delete [] el->pStages[i].pSpecializationInfo->pMapEntries; delete el->pStages[i].pSpecializationInfo; } } @@ -3828,6 +3795,22 @@ void Serialiser::Serialise(const char *name, VkComputePipelineCreateInfo &el) Serialise("basePipelineIndex", el.basePipelineIndex); } +template<> +void Serialiser::Deserialise(const VkComputePipelineCreateInfo* const el) const +{ + if(m_Mode == READING) + { + RDCASSERT(el->pNext == NULL); // otherwise delete + RDCASSERT(el->stage.pNext == NULL); // otherwise delete + if (el->stage.pSpecializationInfo) + { + delete [] (byte *)(el->stage.pSpecializationInfo->pData); + delete [] el->stage.pSpecializationInfo->pMapEntries; + delete el->stage.pSpecializationInfo; + } + } +} + template<> void Serialiser::Serialise(const char *name, VkDescriptorPoolSize &el) { @@ -3939,9 +3922,9 @@ void Serialiser::Deserialise(const VkWriteDescriptorSet* const el) const if(m_Mode == READING) { RDCASSERT(el->pNext == NULL); // otherwise delete - delete [] el->pImageInfo; - delete [] el->pBufferInfo; - delete [] el->pTexelBufferView; + if(el->pImageInfo) delete[] el->pImageInfo; + if(el->pBufferInfo) delete[] el->pBufferInfo; + if(el->pTexelBufferView) delete[] el->pTexelBufferView; } } @@ -4023,7 +4006,8 @@ void Serialiser::Deserialise(const VkDescriptorSetLayoutCreateInfo* const el) co { RDCASSERT(el->pNext == NULL); // otherwise delete for (uint32_t i=0; ibindingCount; i++) - delete [] el->pBinding[i].pImmutableSamplers; + if(el->pBinding[i].pImmutableSamplers) + delete[] el->pBinding[i].pImmutableSamplers; delete [] el->pBinding; } } diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index cba0ea8b5..5207a9bc9 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -127,6 +127,7 @@ template<> void Serialiser::Serialise(const char *name, VkSwapchainCreateInfoKHR template<> void Serialiser::Deserialise(const VkDeviceCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkBufferCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkImageCreateInfo* const el) const; +template<> void Serialiser::Deserialise(const VkBindSparseInfo* const el) const; template<> void Serialiser::Deserialise(const VkFramebufferCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkRenderPassCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkRenderPassBeginInfo* const el) const; @@ -134,6 +135,7 @@ template<> void Serialiser::Deserialise(const VkPipelineCacheCreateInfo* const e template<> void Serialiser::Deserialise(const VkPipelineLayoutCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkShaderModuleCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkGraphicsPipelineCreateInfo* const el) const; +template<> void Serialiser::Deserialise(const VkComputePipelineCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkDescriptorPoolCreateInfo* const el) const; template<> void Serialiser::Deserialise(const VkWriteDescriptorSet* const el) const; template<> void Serialiser::Deserialise(const VkDescriptorSetLayoutCreateInfo* const el) const;