Initial Vulkan documentation stated that it was invalid to free VK_NULL_HANDLE objects, however this has been changed. From the Vulkan 1.0.33 specification. 2.6.2. Implicit Valid Usage. Valid Usage for Object Handles:
"It is valid to pass VK_NULL_HANDLE to any vkDestroy* or vkFree* command, which will silently ignore these values." This patch changes all anv_Destroy and anv_Free entry points to return early when the target of the command is a NULL object. This fixes crashes and fails in new Vulkan CTS tests in the vulkan-cts-1.0-dev branch that have been added to verify this behavior. Fixes: dEQP-VK.api.null_handle.* --- Maybe tag for stable? src/intel/vulkan/anv_cmd_buffer.c | 6 ++++++ src/intel/vulkan/anv_descriptor_set.c | 12 ++++++++++++ src/intel/vulkan/anv_device.c | 21 +++++++++++++++++++++ src/intel/vulkan/anv_image.c | 9 +++++++++ src/intel/vulkan/anv_pass.c | 3 +++ src/intel/vulkan/anv_pipeline.c | 6 ++++++ src/intel/vulkan/anv_pipeline_cache.c | 3 +++ src/intel/vulkan/anv_query.c | 3 +++ src/intel/vulkan/anv_wsi.c | 6 ++++++ 9 files changed, 69 insertions(+) diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 7ff7dba..e1c6193 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -298,6 +298,9 @@ VkResult anv_AllocateCommandBuffers( static void anv_cmd_buffer_destroy(struct anv_cmd_buffer *cmd_buffer) { + if (!cmd_buffer) + return; + list_del(&cmd_buffer->pool_link); anv_cmd_buffer_fini_batch_bo_chain(cmd_buffer); @@ -793,6 +796,9 @@ void anv_DestroyCommandPool( VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator) { + if (!commandPool) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_cmd_pool, pool, commandPool); diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index 7d5a78d..81f48ef 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -197,6 +197,9 @@ void anv_DestroyDescriptorSetLayout( VkDescriptorSetLayout _set_layout, const VkAllocationCallbacks* pAllocator) { + if (!_set_layout) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_descriptor_set_layout, set_layout, _set_layout); @@ -279,6 +282,9 @@ void anv_DestroyPipelineLayout( VkPipelineLayout _pipelineLayout, const VkAllocationCallbacks* pAllocator) { + if (!_pipelineLayout) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_pipeline_layout, pipeline_layout, _pipelineLayout); @@ -352,6 +358,9 @@ void anv_DestroyDescriptorPool( VkDescriptorPool _pool, const VkAllocationCallbacks* pAllocator) { + if (!_pool) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_descriptor_pool, pool, _pool); @@ -484,6 +493,9 @@ anv_descriptor_set_destroy(struct anv_device *device, struct anv_descriptor_pool *pool, struct anv_descriptor_set *set) { + if (!set) + return; + /* Put the buffer view surface state back on the free list. */ for (uint32_t b = 0; b < set->buffer_count; b++) { struct surface_state_free_list_entry *entry = diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 0999fcf..fdca633 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -322,6 +322,9 @@ void anv_DestroyInstance( VkInstance _instance, const VkAllocationCallbacks* pAllocator) { + if (!_instance) + return; + ANV_FROM_HANDLE(anv_instance, instance, _instance); if (instance->physicalDeviceCount > 0) { @@ -966,6 +969,9 @@ void anv_DestroyDevice( VkDevice _device, const VkAllocationCallbacks* pAllocator) { + if (!_device) + return; + ANV_FROM_HANDLE(anv_device, device, _device); anv_queue_finish(&device->queue); @@ -1565,6 +1571,9 @@ void anv_DestroyFence( VkFence _fence, const VkAllocationCallbacks* pAllocator) { + if (!_fence) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_fence, fence, _fence); @@ -1804,6 +1813,9 @@ void anv_DestroyEvent( VkEvent _event, const VkAllocationCallbacks* pAllocator) { + if (!_event) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_event, event, _event); @@ -1896,6 +1908,9 @@ void anv_DestroyBuffer( VkBuffer _buffer, const VkAllocationCallbacks* pAllocator) { + if (!_buffer) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_buffer, buffer, _buffer); @@ -1923,6 +1938,9 @@ void anv_DestroySampler( VkSampler _sampler, const VkAllocationCallbacks* pAllocator) { + if (!_sampler) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_sampler, sampler, _sampler); @@ -1967,6 +1985,9 @@ void anv_DestroyFramebuffer( VkFramebuffer _fb, const VkAllocationCallbacks* pAllocator) { + if (!_fb) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_framebuffer, fb, _fb); diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index b7c2e99..16fafe0 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -274,6 +274,9 @@ void anv_DestroyImage(VkDevice _device, VkImage _image, const VkAllocationCallbacks *pAllocator) { + if (!_image) + return; + ANV_FROM_HANDLE(anv_device, device, _device); vk_free2(&device->alloc, pAllocator, anv_image_from_handle(_image)); @@ -562,6 +565,9 @@ void anv_DestroyImageView(VkDevice _device, VkImageView _iview, const VkAllocationCallbacks *pAllocator) { + if (!_iview) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_image_view, iview, _iview); @@ -652,6 +658,9 @@ void anv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) { + if (!bufferView) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_buffer_view, view, bufferView); diff --git a/src/intel/vulkan/anv_pass.c b/src/intel/vulkan/anv_pass.c index 6eaa5c8..a72ea46 100644 --- a/src/intel/vulkan/anv_pass.c +++ b/src/intel/vulkan/anv_pass.c @@ -143,6 +143,9 @@ void anv_DestroyRenderPass( VkRenderPass _pass, const VkAllocationCallbacks* pAllocator) { + if (!_pass) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_render_pass, pass, _pass); diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index bdc2f01..c9f8a91 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -72,6 +72,9 @@ void anv_DestroyShaderModule( VkShaderModule _module, const VkAllocationCallbacks* pAllocator) { + if (!_module) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_shader_module, module, _module); @@ -186,6 +189,9 @@ void anv_DestroyPipeline( VkPipeline _pipeline, const VkAllocationCallbacks* pAllocator) { + if (!_pipeline) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_pipeline, pipeline, _pipeline); diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c index ff6e651..596f8ff 100644 --- a/src/intel/vulkan/anv_pipeline_cache.c +++ b/src/intel/vulkan/anv_pipeline_cache.c @@ -451,6 +451,9 @@ void anv_DestroyPipelineCache( VkPipelineCache _cache, const VkAllocationCallbacks* pAllocator) { + if (!_cache) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_pipeline_cache, cache, _cache); diff --git a/src/intel/vulkan/anv_query.c b/src/intel/vulkan/anv_query.c index 4afdaaf..2078fb9 100644 --- a/src/intel/vulkan/anv_query.c +++ b/src/intel/vulkan/anv_query.c @@ -84,6 +84,9 @@ void anv_DestroyQueryPool( VkQueryPool _pool, const VkAllocationCallbacks* pAllocator) { + if (!_pool) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_query_pool, pool, _pool); diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index b95e965..3f9cf2b 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -73,6 +73,9 @@ void anv_DestroySurfaceKHR( VkSurfaceKHR _surface, const VkAllocationCallbacks* pAllocator) { + if (!_surface) + return; + ANV_FROM_HANDLE(anv_instance, instance, _instance); ANV_FROM_HANDLE(_VkIcdSurfaceBase, surface, _surface); @@ -290,6 +293,9 @@ void anv_DestroySwapchainKHR( VkSwapchainKHR _swapchain, const VkAllocationCallbacks* pAllocator) { + if (!_swapchain) + return; + ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); const VkAllocationCallbacks *alloc; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev