VulkanUnitTests: Free / Destroy all Vulkan objects. Fixes a whole lot of leak-detector warnings. Bug: b/133399620 Change-Id: I4f35150712dd2035a84c16d06ca75a4eba2c3c69 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31836 Tested-by: Ben Clayton <bclayton@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/tests/VulkanUnitTests/Device.cpp b/tests/VulkanUnitTests/Device.cpp index 098e736..18ebe18 100644 --- a/tests/VulkanUnitTests/Device.cpp +++ b/tests/VulkanUnitTests/Device.cpp
@@ -171,6 +171,11 @@ return VK_SUCCESS; } +void Device::DestroyBuffer(VkBuffer buffer) const +{ + driver->vkDestroyBuffer(device, buffer, nullptr); +} + VkResult Device::CreateShaderModule( const std::vector<uint32_t>& spirv, VkShaderModule* out) const { @@ -184,6 +189,11 @@ return driver->vkCreateShaderModule(device, &info, 0, out); } +void Device::DestroyShaderModule(VkShaderModule shaderModule) const +{ + driver->vkDestroyShaderModule(device, shaderModule, nullptr); +} + VkResult Device::CreateDescriptorSetLayout( const std::vector<VkDescriptorSetLayoutBinding>& bindings, VkDescriptorSetLayout* out) const @@ -199,6 +209,11 @@ return driver->vkCreateDescriptorSetLayout(device, &info, 0, out); } +void Device::DestroyDescriptorSetLayout(VkDescriptorSetLayout descriptorSetLayout) const +{ + driver->vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); +} + VkResult Device::CreatePipelineLayout( VkDescriptorSetLayout layout, VkPipelineLayout* out) const { @@ -215,6 +230,11 @@ return driver->vkCreatePipelineLayout(device, &info, 0, out); } +void Device::DestroyPipelineLayout(VkPipelineLayout pipelineLayout) const +{ + driver->vkDestroyPipelineLayout(device, pipelineLayout, nullptr); +} + VkResult Device::CreateComputePipeline( VkShaderModule module, VkPipelineLayout pipelineLayout, VkPipeline* out) const @@ -241,6 +261,11 @@ return driver->vkCreateComputePipelines(device, 0, 1, &info, 0, out); } +void Device::DestroyPipeline(VkPipeline pipeline) const +{ + driver->vkDestroyPipeline(device, pipeline, nullptr); +} + VkResult Device::CreateStorageBufferDescriptorPool(uint32_t descriptorCount, VkDescriptorPool* out) const { @@ -261,6 +286,11 @@ return driver->vkCreateDescriptorPool(device, &info, 0, out); } +void Device::DestroyDescriptorPool(VkDescriptorPool descriptorPool) const +{ + driver->vkDestroyDescriptorPool(device, descriptorPool, nullptr); +} + VkResult Device::AllocateDescriptorSet( VkDescriptorPool pool, VkDescriptorSetLayout layout, VkDescriptorSet* out) const @@ -331,6 +361,11 @@ return VK_ERROR_OUT_OF_DEVICE_MEMORY; // TODO: Change to something not made up? } +void Device::FreeMemory(VkDeviceMemory memory) const +{ + driver->vkFreeMemory(device, memory, nullptr); +} + VkResult Device::MapMemory(VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) const { @@ -353,6 +388,11 @@ return driver->vkCreateCommandPool(device, &info, 0, out); } +void Device::DestroyCommandPool(VkCommandPool commandPool) const +{ + return driver->vkDestroyCommandPool(device, commandPool, nullptr); +} + VkResult Device::AllocateCommandBuffer( VkCommandPool pool, VkCommandBuffer* out) const { @@ -366,6 +406,11 @@ return driver->vkAllocateCommandBuffers(device, &info, out); } +void Device::FreeCommandBuffer(VkCommandPool pool, VkCommandBuffer buffer) +{ + driver->vkFreeCommandBuffers(device, pool, 1, &buffer); +} + VkResult Device::BeginCommandBuffer( VkCommandBufferUsageFlags usage, VkCommandBuffer commandBuffer) const {
diff --git a/tests/VulkanUnitTests/Device.hpp b/tests/VulkanUnitTests/Device.hpp index 37b9108..ec582a7 100644 --- a/tests/VulkanUnitTests/Device.hpp +++ b/tests/VulkanUnitTests/Device.hpp
@@ -46,32 +46,50 @@ VkResult CreateStorageBuffer(VkDeviceMemory memory, VkDeviceSize size, VkDeviceSize offset, VkBuffer *out) const; + // DestroyBuffer destroys a VkBuffer. + void DestroyBuffer(VkBuffer buffer) const; + // CreateShaderModule creates a new shader module with the given SPIR-V // code. VkResult CreateShaderModule(const std::vector<uint32_t> &spirv, VkShaderModule *out) const; + // DestroyShaderModule destroys a VkShaderModule. + void DestroyShaderModule(VkShaderModule shaderModule) const; + // CreateDescriptorSetLayout creates a new descriptor set layout with the // given bindings. VkResult CreateDescriptorSetLayout( const std::vector<VkDescriptorSetLayoutBinding> &bindings, VkDescriptorSetLayout *out) const; + // DestroyDescriptorSetLayout destroys a VkDescriptorSetLayout. + void DestroyDescriptorSetLayout(VkDescriptorSetLayout descriptorSetLayout) const; + // CreatePipelineLayout creates a new single set descriptor set layout. VkResult CreatePipelineLayout(VkDescriptorSetLayout layout, VkPipelineLayout *out) const; + // DestroyPipelineLayout destroys a VkPipelineLayout. + void DestroyPipelineLayout(VkPipelineLayout pipelineLayout) const; + // CreateComputePipeline creates a new compute pipeline with the entry point // "main". VkResult CreateComputePipeline(VkShaderModule module, VkPipelineLayout pipelineLayout, VkPipeline *out) const; + // DestroyPipeline destroys a graphics or compute pipeline. + void DestroyPipeline(VkPipeline pipeline) const; + // CreateStorageBufferDescriptorPool creates a new descriptor pool that can // hold descriptorCount storage buffers. VkResult CreateStorageBufferDescriptorPool(uint32_t descriptorCount, VkDescriptorPool *out) const; + // DestroyDescriptorPool destroys the VkDescriptorPool. + void DestroyDescriptorPool(VkDescriptorPool descriptorPool) const; + // AllocateDescriptorSet allocates a single descriptor set with the given // layout from pool. VkResult AllocateDescriptorSet(VkDescriptorPool pool, @@ -89,6 +107,9 @@ // VK_ERROR_OUT_OF_DEVICE_MEMORY is returned. VkResult AllocateMemory(size_t size, VkMemoryPropertyFlags flags, VkDeviceMemory* out) const; + // FreeMemory frees the VkDeviceMemory. + void FreeMemory(VkDeviceMemory memory) const; + // MapMemory wraps vkMapMemory, supplying the first VkDevice parameter. VkResult MapMemory(VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) const; @@ -99,9 +120,15 @@ // CreateCommandPool creates a new command pool. VkResult CreateCommandPool(VkCommandPool* out) const; + // DestroyCommandPool destroys a VkCommandPool. + void DestroyCommandPool(VkCommandPool commandPool) const; + // AllocateCommandBuffer creates a new command buffer with a primary level. VkResult AllocateCommandBuffer(VkCommandPool pool, VkCommandBuffer* out) const; + // FreeCommandBuffer frees the VkCommandBuffer. + void FreeCommandBuffer(VkCommandPool pool, VkCommandBuffer buffer); + // BeginCommandBuffer begins writing to commandBuffer. VkResult BeginCommandBuffer(VkCommandBufferUsageFlags usage, VkCommandBuffer commandBuffer) const;
diff --git a/tests/VulkanUnitTests/VkInstanceFuncs.hpp b/tests/VulkanUnitTests/VkInstanceFuncs.hpp index bcd054f..a8ba8f5 100644 --- a/tests/VulkanUnitTests/VkInstanceFuncs.hpp +++ b/tests/VulkanUnitTests/VkInstanceFuncs.hpp
@@ -42,9 +42,19 @@ VkPipelineLayout*); VK_INSTANCE(vkCreateShaderModule, VkResult, VkDevice, const VkShaderModuleCreateInfo*, const VkAllocationCallbacks*, VkShaderModule*); +VK_INSTANCE(vkDestroyBuffer, void, VkDevice, VkBuffer, const VkAllocationCallbacks*); +VK_INSTANCE(vkDestroyCommandPool, void, VkDevice, VkCommandPool, const VkAllocationCallbacks*); +VK_INSTANCE(vkDestroyDescriptorPool, void, VkDevice, VkDescriptorPool, const VkAllocationCallbacks*); +VK_INSTANCE(vkDestroyDescriptorSetLayout, void, VkDevice, VkDescriptorSetLayout, const VkAllocationCallbacks*); VK_INSTANCE(vkDestroyDevice, VkResult, VkDevice, const VkAllocationCallbacks*); +VK_INSTANCE(vkDestroyInstance, void, VkInstance, const VkAllocationCallbacks*); +VK_INSTANCE(vkDestroyPipeline, void, VkDevice, VkPipeline, const VkAllocationCallbacks*); +VK_INSTANCE(vkDestroyPipelineLayout, void, VkDevice, VkPipelineLayout, const VkAllocationCallbacks*); +VK_INSTANCE(vkDestroyShaderModule, void, VkDevice, VkShaderModule, const VkAllocationCallbacks*); VK_INSTANCE(vkEndCommandBuffer, VkResult, VkCommandBuffer); VK_INSTANCE(vkEnumeratePhysicalDevices, VkResult, VkInstance, uint32_t*, VkPhysicalDevice*); +VK_INSTANCE(vkFreeCommandBuffers, void, VkDevice, VkCommandPool, uint32_t, const VkCommandBuffer*); +VK_INSTANCE(vkFreeMemory, void, VkDevice, VkDeviceMemory, const VkAllocationCallbacks*); VK_INSTANCE(vkGetDeviceQueue, void, VkDevice, uint32_t, uint32_t, VkQueue*); VK_INSTANCE(vkGetPhysicalDeviceMemoryProperties, void, VkPhysicalDevice, VkPhysicalDeviceMemoryProperties*); VK_INSTANCE(vkGetPhysicalDeviceProperties, void, VkPhysicalDevice, VkPhysicalDeviceProperties*);
diff --git a/tests/VulkanUnitTests/unittests.cpp b/tests/VulkanUnitTests/unittests.cpp index d2bfcc5..8a986b1 100644 --- a/tests/VulkanUnitTests/unittests.cpp +++ b/tests/VulkanUnitTests/unittests.cpp
@@ -103,6 +103,8 @@ EXPECT_EQ(physicalDeviceProperties.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU); EXPECT_EQ(strncmp(physicalDeviceProperties.deviceName, "SwiftShader Device", VK_MAX_PHYSICAL_DEVICE_NAME_SIZE), 0); + + driver.vkDestroyInstance(instance, nullptr); } std::vector<uint32_t> compileSpirv(const char* assembly) @@ -357,6 +359,19 @@ device->UnmapMemory(memory); buffers = nullptr; + + device->FreeCommandBuffer(commandPool, commandBuffer); + device->FreeMemory(memory); + device->DestroyPipeline(pipeline); + device->DestroyCommandPool(commandPool); + device->DestroyPipelineLayout(pipelineLayout); + device->DestroyDescriptorSetLayout(descriptorSetLayout); + device->DestroyDescriptorPool(descriptorPool); + device->DestroyBuffer(bufferIn); + device->DestroyBuffer(bufferOut); + device->DestroyShaderModule(shaderModule); + device.reset(nullptr); + driver.vkDestroyInstance(instance, nullptr); } INSTANTIATE_TEST_CASE_P(ComputeParams, SwiftShaderVulkanBufferToBufferComputeTest, testing::Values(