[Mesa-dev] [PATCH] anv: don't try to free VK_NULL_HANDLE objects
Iago Toral
itoral at igalia.com
Wed Nov 16 13:05:29 UTC 2016
Never mind this, I just noticed that Jason has the same patch in his
vulkan-cts fixes branch, I am not sure how I missed that.
Iago
On Wed, 2016-11-16 at 13:34 +0100, Iago Toral Quiroga wrote:
> 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;
More information about the mesa-dev
mailing list