From 682c81bdfb7ea28efccea1e8cbfeb7cfc67d02b8 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 21 Apr 2020 12:33:16 -0500 Subject: [PATCH] vulkan,anv: Add a base object struct type Reviewed-by: Lionel Landwerlin Acked-by: Kristian H. Kristensen Acked-by: Bas Nieuwenhuizen Reviewed-by: Samuel Pitoiset Part-of: --- src/intel/vulkan/anv_cmd_buffer.c | 8 +++- src/intel/vulkan/anv_descriptor_set.c | 25 +++++++++++- src/intel/vulkan/anv_device.c | 18 ++++++++- src/intel/vulkan/anv_formats.c | 3 ++ src/intel/vulkan/anv_image.c | 6 +++ src/intel/vulkan/anv_pass.c | 3 ++ src/intel/vulkan/anv_pipeline.c | 6 +++ src/intel/vulkan/anv_pipeline_cache.c | 4 ++ src/intel/vulkan/anv_private.h | 55 ++++++++++++++++++++++++--- src/intel/vulkan/anv_queue.c | 10 ++++- src/intel/vulkan/genX_pipeline.c | 2 + src/intel/vulkan/genX_query.c | 2 + src/intel/vulkan/genX_state.c | 1 + src/vulkan/util/vk_object.c | 16 +++++++- src/vulkan/util/vk_object.h | 14 ++++++- 15 files changed, 160 insertions(+), 13 deletions(-) diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 03af604de4c..49c7334567f 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -203,9 +203,11 @@ static VkResult anv_create_cmd_buffer( if (cmd_buffer == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &cmd_buffer->base, + VK_OBJECT_TYPE_COMMAND_BUFFER); + cmd_buffer->batch.status = VK_SUCCESS; - cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC; cmd_buffer->device = device; cmd_buffer->pool = pool; cmd_buffer->level = level; @@ -280,6 +282,7 @@ anv_cmd_buffer_destroy(struct anv_cmd_buffer *cmd_buffer) anv_cmd_state_finish(cmd_buffer); + vk_object_base_finish(&cmd_buffer->base); vk_free(&cmd_buffer->pool->alloc, cmd_buffer); } @@ -906,6 +909,8 @@ VkResult anv_CreateCommandPool( if (pool == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &pool->base, VK_OBJECT_TYPE_COMMAND_POOL); + if (pAllocator) pool->alloc = *pAllocator; else @@ -934,6 +939,7 @@ void anv_DestroyCommandPool( anv_cmd_buffer_destroy(cmd_buffer); } + vk_object_base_finish(&pool->base); vk_free2(&device->vk.alloc, pAllocator, pool); } diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index ce6caafcf7a..d4676b23416 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -363,6 +363,8 @@ VkResult anv_CreateDescriptorSetLayout( return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); memset(set_layout, 0, sizeof(*set_layout)); + vk_object_base_init(&device->vk, &set_layout->base, + VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT); set_layout->ref_cnt = 1; set_layout->binding_count = max_binding + 1; @@ -509,6 +511,15 @@ VkResult anv_CreateDescriptorSetLayout( return VK_SUCCESS; } +void +anv_descriptor_set_layout_destroy(struct anv_device *device, + struct anv_descriptor_set_layout *layout) +{ + assert(layout->ref_cnt == 0); + vk_object_base_finish(&layout->base); + vk_free(&device->vk.alloc, layout); +} + void anv_DestroyDescriptorSetLayout( VkDevice _device, VkDescriptorSetLayout _set_layout, @@ -592,6 +603,8 @@ VkResult anv_CreatePipelineLayout( if (layout == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &layout->base, + VK_OBJECT_TYPE_PIPELINE_LAYOUT); layout->num_sets = pCreateInfo->setLayoutCount; unsigned dynamic_offset_count = 0; @@ -641,6 +654,7 @@ void anv_DestroyPipelineLayout( for (uint32_t i = 0; i < pipeline_layout->num_sets; i++) anv_descriptor_set_layout_unref(device, pipeline_layout->set[i].layout); + vk_object_base_finish(&pipeline_layout->base); vk_free2(&device->vk.alloc, pAllocator, pipeline_layout); } @@ -736,6 +750,8 @@ VkResult anv_CreateDescriptorPool( if (!pool) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &pool->base, + VK_OBJECT_TYPE_DESCRIPTOR_POOL); pool->size = pool_size; pool->next = 0; pool->free_list = EMPTY; @@ -788,6 +804,7 @@ void anv_DestroyDescriptorPool( anv_device_release_bo(device, pool->bo); anv_state_stream_finish(&pool->surface_state_stream); + vk_object_base_finish(&pool->base); vk_free2(&device->vk.alloc, pAllocator, pool); } @@ -934,7 +951,7 @@ anv_descriptor_set_create(struct anv_device *device, uint64_t pool_vma_offset = util_vma_heap_alloc(&pool->bo_heap, set_buffer_size, 32); if (pool_vma_offset == 0) { - anv_descriptor_pool_free_set(pool, set); + vk_object_base_finish(&set->base); return vk_error(VK_ERROR_FRAGMENTED_POOL); } assert(pool_vma_offset >= POOL_HEAP_OFFSET && @@ -956,6 +973,8 @@ anv_descriptor_set_create(struct anv_device *device, set->desc_surface_state = ANV_STATE_NULL; } + vk_object_base_init(&device->vk, &set->base, + VK_OBJECT_TYPE_DESCRIPTOR_SET); set->pool = pool; set->layout = layout; anv_descriptor_set_layout_ref(layout); @@ -1025,6 +1044,7 @@ anv_descriptor_set_destroy(struct anv_device *device, list_del(&set->pool_link); + vk_object_base_finish(&set->base); anv_descriptor_pool_free_set(pool, set); } @@ -1604,6 +1624,8 @@ VkResult anv_CreateDescriptorUpdateTemplate( if (template == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &template->base, + VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE); template->bind_point = pCreateInfo->pipelineBindPoint; if (pCreateInfo->templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET) @@ -1639,6 +1661,7 @@ void anv_DestroyDescriptorUpdateTemplate( ANV_FROM_HANDLE(anv_descriptor_update_template, template, descriptorUpdateTemplate); + vk_object_base_finish(&template->base); vk_free2(&device->vk.alloc, pAllocator, template); } diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index fd3b292dbbd..8b54408eff0 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -377,7 +377,7 @@ anv_physical_device_try_create(struct anv_instance *instance, goto fail_fd; } - device->_loader_data.loaderMagic = ICD_LOADER_MAGIC; + vk_object_base_init(NULL, &device->base, VK_OBJECT_TYPE_PHYSICAL_DEVICE); device->instance = instance; assert(strlen(path) < ARRAY_SIZE(device->path)); @@ -595,6 +595,7 @@ anv_physical_device_destroy(struct anv_physical_device *device) close(device->local_fd); if (device->master_fd >= 0) close(device->master_fd); + vk_object_base_finish(&device->base); vk_free(&device->instance->alloc, device); } @@ -676,7 +677,7 @@ VkResult anv_CreateInstance( if (!instance) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - instance->_loader_data.loaderMagic = ICD_LOADER_MAGIC; + vk_object_base_init(NULL, &instance->base, VK_OBJECT_TYPE_INSTANCE); if (pAllocator) instance->alloc = *pAllocator; @@ -796,6 +797,7 @@ void anv_DestroyInstance( driDestroyOptionCache(&instance->dri_options); driDestroyOptionInfo(&instance->available_dri_options); + vk_object_base_finish(&instance->base); vk_free(&instance->alloc, instance); } @@ -3360,6 +3362,7 @@ VkResult anv_AllocateMemory( return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); assert(pAllocateInfo->memoryTypeIndex < pdevice->memory.type_count); + vk_object_base_init(&device->vk, &mem->base, VK_OBJECT_TYPE_DEVICE_MEMORY); mem->type = mem_type; mem->map = NULL; mem->map_size = 0; @@ -3683,6 +3686,7 @@ void anv_FreeMemory( AHardwareBuffer_release(mem->ahw); #endif + vk_object_base_finish(&mem->base); vk_free2(&device->vk.alloc, pAllocator, mem); } @@ -4087,6 +4091,7 @@ VkResult anv_CreateEvent( if (event == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &event->base, VK_OBJECT_TYPE_EVENT); event->state = anv_state_pool_alloc(&device->dynamic_state_pool, sizeof(uint64_t), 8); *(uint64_t *)event->state.map = VK_EVENT_RESET; @@ -4108,6 +4113,8 @@ void anv_DestroyEvent( return; anv_state_pool_free(&device->dynamic_state_pool, event->state); + + vk_object_base_finish(&event->base); vk_free2(&device->vk.alloc, pAllocator, event); } @@ -4172,6 +4179,7 @@ VkResult anv_CreateBuffer( if (buffer == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &buffer->base, VK_OBJECT_TYPE_BUFFER); buffer->size = pCreateInfo->size; buffer->usage = pCreateInfo->usage; buffer->address = ANV_NULL_ADDRESS; @@ -4192,6 +4200,7 @@ void anv_DestroyBuffer( if (!buffer) return; + vk_object_base_finish(&buffer->base); vk_free2(&device->vk.alloc, pAllocator, buffer); } @@ -4257,6 +4266,7 @@ void anv_DestroySampler( sampler->bindless_state); } + vk_object_base_finish(&sampler->base); vk_free2(&device->vk.alloc, pAllocator, sampler); } @@ -4299,6 +4309,9 @@ VkResult anv_CreateFramebuffer( framebuffer->attachment_count = 0; } + vk_object_base_init(&device->vk, &framebuffer->base, + VK_OBJECT_TYPE_FRAMEBUFFER); + framebuffer->width = pCreateInfo->width; framebuffer->height = pCreateInfo->height; framebuffer->layers = pCreateInfo->layers; @@ -4319,6 +4332,7 @@ void anv_DestroyFramebuffer( if (!fb) return; + vk_object_base_finish(&fb->base); vk_free2(&device->vk.alloc, pAllocator, fb); } diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index db1ea3f1818..a3d25ebc3e6 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -1293,6 +1293,8 @@ VkResult anv_CreateSamplerYcbcrConversion( memset(conversion, 0, sizeof(*conversion)); + vk_object_base_init(&device->vk, &conversion->base, + VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION); conversion->format = anv_get_format(pCreateInfo->format); conversion->ycbcr_model = pCreateInfo->ycbcrModel; conversion->ycbcr_range = pCreateInfo->ycbcrRange; @@ -1342,5 +1344,6 @@ void anv_DestroySamplerYcbcrConversion( if (!conversion) return; + vk_object_base_finish(&conversion->base); vk_free2(&device->vk.alloc, pAllocator, conversion); } diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 1f30ee12819..05b38f22661 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -695,6 +695,7 @@ anv_image_create(VkDevice _device, if (!image) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &image->base, VK_OBJECT_TYPE_IMAGE); image->type = pCreateInfo->imageType; image->extent = pCreateInfo->extent; image->vk_format = pCreateInfo->format; @@ -889,6 +890,7 @@ anv_DestroyImage(VkDevice _device, VkImage _image, } } + vk_object_base_finish(&image->base); vk_free2(&device->vk.alloc, pAllocator, image); } @@ -1916,6 +1918,8 @@ anv_CreateImageView(VkDevice _device, if (iview == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &iview->base, VK_OBJECT_TYPE_IMAGE_VIEW); + const VkImageSubresourceRange *range = &pCreateInfo->subresourceRange; assert(range->layerCount > 0); @@ -2190,6 +2194,7 @@ anv_CreateBufferView(VkDevice _device, /* TODO: Handle the format swizzle? */ + vk_object_base_init(&device->vk, &view->base, VK_OBJECT_TYPE_BUFFER_VIEW); view->format = anv_get_isl_format(&device->info, pCreateInfo->format, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_TILING_LINEAR); @@ -2267,5 +2272,6 @@ anv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, anv_state_pool_free(&device->surface_state_pool, view->writeonly_storage_surface_state); + vk_object_base_finish(&view->base); vk_free2(&device->vk.alloc, pAllocator, view); } diff --git a/src/intel/vulkan/anv_pass.c b/src/intel/vulkan/anv_pass.c index b100bec929d..3820cbfe5dd 100644 --- a/src/intel/vulkan/anv_pass.c +++ b/src/intel/vulkan/anv_pass.c @@ -267,6 +267,7 @@ VkResult anv_CreateRenderPass( * each array member of anv_subpass must be a valid pointer if not NULL. */ memset(pass, 0, ma.size); + vk_object_base_init(&device->vk, &pass->base, VK_OBJECT_TYPE_RENDER_PASS); pass->attachment_count = pCreateInfo->attachmentCount; pass->subpass_count = pCreateInfo->subpassCount; pass->attachments = attachments; @@ -441,6 +442,7 @@ VkResult anv_CreateRenderPass2( * each array member of anv_subpass must be a valid pointer if not NULL. */ memset(pass, 0, ma.size); + vk_object_base_init(&device->vk, &pass->base, VK_OBJECT_TYPE_RENDER_PASS); pass->attachment_count = pCreateInfo->attachmentCount; pass->subpass_count = pCreateInfo->subpassCount; pass->attachments = attachments; @@ -591,6 +593,7 @@ void anv_DestroyRenderPass( ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_render_pass, pass, _pass); + vk_object_base_finish(&pass->base); vk_free2(&device->vk.alloc, pAllocator, pass); } diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index d3bbd06e061..88bc58f3771 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -61,6 +61,8 @@ VkResult anv_CreateShaderModule( if (module == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &module->base, + VK_OBJECT_TYPE_SHADER_MODULE); module->size = pCreateInfo->codeSize; memcpy(module->data, pCreateInfo->pCode, module->size); @@ -82,6 +84,7 @@ void anv_DestroyShaderModule( if (!module) return; + vk_object_base_finish(&module->base); vk_free2(&device->vk.alloc, pAllocator, module); } @@ -340,6 +343,7 @@ void anv_DestroyPipeline( unreachable("invalid pipeline type"); } + vk_object_base_finish(&pipeline->base); vk_free2(&device->vk.alloc, pAllocator, pipeline); } @@ -1981,6 +1985,8 @@ anv_pipeline_init(struct anv_graphics_pipeline *pipeline, if (alloc == NULL) alloc = &device->vk.alloc; + vk_object_base_init(&device->vk, &pipeline->base.base, + VK_OBJECT_TYPE_PIPELINE); pipeline->base.device = device; pipeline->base.type = ANV_PIPELINE_GRAPHICS; diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c index 39df5f1ded5..bdbca77bc08 100644 --- a/src/intel/vulkan/anv_pipeline_cache.c +++ b/src/intel/vulkan/anv_pipeline_cache.c @@ -282,6 +282,8 @@ anv_pipeline_cache_init(struct anv_pipeline_cache *cache, struct anv_device *device, bool cache_enabled) { + vk_object_base_init(&device->vk, &cache->base, + VK_OBJECT_TYPE_PIPELINE_CACHE); cache->device = device; pthread_mutex_init(&cache->mutex, NULL); @@ -318,6 +320,8 @@ anv_pipeline_cache_finish(struct anv_pipeline_cache *cache) _mesa_hash_table_destroy(cache->nir_cache, NULL); } + + vk_object_base_finish(&cache->base); } static struct anv_shader_bin * diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index e39b328cca3..b778121951a 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1007,7 +1007,7 @@ struct anv_memory_heap { }; struct anv_physical_device { - VK_LOADER_DATA _loader_data; + struct vk_object_base base; /* Link in anv_instance::physical_devices */ struct list_head link; @@ -1100,7 +1100,7 @@ struct anv_app_info { }; struct anv_instance { - VK_LOADER_DATA _loader_data; + struct vk_object_base base; VkAllocationCallbacks alloc; @@ -1177,7 +1177,7 @@ struct anv_queue_submit { }; struct anv_queue { - VK_LOADER_DATA _loader_data; + struct vk_object_base base; struct anv_device * device; @@ -1190,6 +1190,7 @@ struct anv_queue { }; struct anv_pipeline_cache { + struct vk_object_base base; struct anv_device * device; pthread_mutex_t mutex; @@ -1727,6 +1728,8 @@ _anv_combine_address(struct anv_batch *batch, void *location, })) struct anv_device_memory { + struct vk_object_base base; + struct list_head link; struct anv_bo * bo; @@ -1880,6 +1883,8 @@ bool anv_descriptor_requires_bindless(const struct anv_physical_device *pdevice, bool sampler); struct anv_descriptor_set_layout { + struct vk_object_base base; + /* Descriptor set layouts can be destroyed at almost any time */ uint32_t ref_cnt; @@ -1908,6 +1913,9 @@ struct anv_descriptor_set_layout { struct anv_descriptor_set_binding_layout binding[0]; }; +void anv_descriptor_set_layout_destroy(struct anv_device *device, + struct anv_descriptor_set_layout *layout); + static inline void anv_descriptor_set_layout_ref(struct anv_descriptor_set_layout *layout) { @@ -1921,7 +1929,7 @@ anv_descriptor_set_layout_unref(struct anv_device *device, { assert(layout && layout->ref_cnt >= 1); if (p_atomic_dec_zero(&layout->ref_cnt)) - vk_free(&device->vk.alloc, layout); + anv_descriptor_set_layout_destroy(device, layout); } struct anv_descriptor { @@ -1945,6 +1953,8 @@ struct anv_descriptor { }; struct anv_descriptor_set { + struct vk_object_base base; + struct anv_descriptor_pool *pool; struct anv_descriptor_set_layout *layout; uint32_t size; @@ -1964,6 +1974,8 @@ struct anv_descriptor_set { }; struct anv_buffer_view { + struct vk_object_base base; + enum isl_format format; /**< VkBufferViewCreateInfo::format */ uint64_t range; /**< VkBufferViewCreateInfo::range */ @@ -1992,6 +2004,8 @@ struct anv_push_descriptor_set { }; struct anv_descriptor_pool { + struct vk_object_base base; + uint32_t size; uint32_t next; uint32_t free_list; @@ -2034,6 +2048,8 @@ struct anv_descriptor_template_entry { }; struct anv_descriptor_update_template { + struct vk_object_base base; + VkPipelineBindPoint bind_point; /* The descriptor set this template corresponds to. This value is only @@ -2164,6 +2180,8 @@ struct anv_push_range { }; struct anv_pipeline_layout { + struct vk_object_base base; + struct { struct anv_descriptor_set_layout *layout; uint32_t dynamic_offset_start; @@ -2175,6 +2193,8 @@ struct anv_pipeline_layout { }; struct anv_buffer { + struct vk_object_base base; + struct anv_device * device; VkDeviceSize size; @@ -2764,6 +2784,7 @@ struct anv_cmd_state { }; struct anv_cmd_pool { + struct vk_object_base base; VkAllocationCallbacks alloc; struct list_head cmd_buffers; }; @@ -2779,7 +2800,7 @@ enum anv_cmd_buffer_exec_mode { }; struct anv_cmd_buffer { - VK_LOADER_DATA _loader_data; + struct vk_object_base base; struct anv_device * device; @@ -2946,6 +2967,8 @@ struct anv_fence_impl { }; struct anv_fence { + struct vk_object_base base; + /* Permanent fence state. Every fence has some form of permanent state * (type != ANV_SEMAPHORE_TYPE_NONE). This may be a BO to fence on (for * cross-process fences) or it could just be a dummy for use internally. @@ -2966,6 +2989,7 @@ void anv_fence_reset_temporary(struct anv_device *device, struct anv_fence *fence); struct anv_event { + struct vk_object_base base; uint64_t semaphore; struct anv_state state; }; @@ -3038,6 +3062,8 @@ struct anv_semaphore_impl { }; struct anv_semaphore { + struct vk_object_base base; + uint32_t refcount; /* Permanent semaphore state. Every semaphore has some form of permanent @@ -3061,6 +3087,8 @@ void anv_semaphore_reset_temporary(struct anv_device *device, struct anv_semaphore *semaphore); struct anv_shader_module { + struct vk_object_base base; + unsigned char sha1[20]; uint32_t size; char data[0]; @@ -3175,6 +3203,8 @@ enum anv_pipeline_type { }; struct anv_pipeline { + struct vk_object_base base; + struct anv_device * device; struct anv_batch batch; @@ -3462,6 +3492,8 @@ struct anv_surface { }; struct anv_image { + struct vk_object_base base; + VkImageType type; /**< VkImageCreateInfo::imageType */ /* The original VkFormat provided by the client. This may not match any * of the actual surface formats. @@ -3878,6 +3910,8 @@ anv_image_aspects_compatible(VkImageAspectFlags aspects1, } struct anv_image_view { + struct vk_object_base base; + const struct anv_image *image; /**< VkImageViewCreateInfo::image */ VkImageAspectFlags aspect_mask; @@ -4018,6 +4052,8 @@ anv_clear_color_from_att_state(union isl_color_value *clear_color, struct anv_ycbcr_conversion { + struct vk_object_base base; + const struct anv_format * format; VkSamplerYcbcrModelConversion ycbcr_model; VkSamplerYcbcrRange ycbcr_range; @@ -4028,6 +4064,8 @@ struct anv_ycbcr_conversion { }; struct anv_sampler { + struct vk_object_base base; + uint32_t state[3][4]; uint32_t n_planes; struct anv_ycbcr_conversion *conversion; @@ -4039,6 +4077,8 @@ struct anv_sampler { }; struct anv_framebuffer { + struct vk_object_base base; + uint32_t width; uint32_t height; uint32_t layers; @@ -4112,6 +4152,8 @@ struct anv_render_pass_attachment { }; struct anv_render_pass { + struct vk_object_base base; + uint32_t attachment_count; uint32_t subpass_count; /* An array of subpass_count+1 flushes, one per subpass boundary */ @@ -4123,6 +4165,8 @@ struct anv_render_pass { #define ANV_PIPELINE_STATISTICS_MASK 0x000007ff struct anv_query_pool { + struct vk_object_base base; + VkQueryType type; VkQueryPipelineStatisticFlags pipeline_statistics; /** Stride between slots, in bytes */ @@ -4244,7 +4288,6 @@ ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_render_pass, VkRenderPass) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_sampler, VkSampler) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_semaphore, VkSemaphore) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_shader_module, VkShaderModule) -ANV_DEFINE_NONDISP_HANDLE_CASTS(vk_debug_report_callback, VkDebugReportCallbackEXT) ANV_DEFINE_NONDISP_HANDLE_CASTS(anv_ycbcr_conversion, VkSamplerYcbcrConversion) /* Gen-specific function declarations */ diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c index c2229e9fd0a..ebe3216dd02 100644 --- a/src/intel/vulkan/anv_queue.c +++ b/src/intel/vulkan/anv_queue.c @@ -381,7 +381,7 @@ _anv_queue_submit(struct anv_queue *queue, struct anv_queue_submit **_submit, VkResult anv_queue_init(struct anv_device *device, struct anv_queue *queue) { - queue->_loader_data.loaderMagic = ICD_LOADER_MAGIC; + vk_object_base_init(&device->vk, &queue->base, VK_OBJECT_TYPE_QUEUE); queue->device = device; queue->flags = 0; @@ -393,6 +393,7 @@ anv_queue_init(struct anv_device *device, struct anv_queue *queue) void anv_queue_finish(struct anv_queue *queue) { + vk_object_base_finish(&queue->base); } static VkResult @@ -1105,6 +1106,8 @@ VkResult anv_CreateFence( if (fence == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &fence->base, VK_OBJECT_TYPE_FENCE); + if (device->physical->has_syncobj_wait) { fence->permanent.type = ANV_FENCE_TYPE_SYNCOBJ; @@ -1191,6 +1194,7 @@ void anv_DestroyFence( anv_fence_impl_cleanup(device, &fence->temporary); anv_fence_impl_cleanup(device, &fence->permanent); + vk_object_base_finish(&fence->base); vk_free2(&device->vk.alloc, pAllocator, fence); } @@ -1787,6 +1791,8 @@ VkResult anv_CreateSemaphore( if (semaphore == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &semaphore->base, VK_OBJECT_TYPE_SEMAPHORE); + p_atomic_set(&semaphore->refcount, 1); const VkExportSemaphoreCreateInfo *export = @@ -1900,6 +1906,8 @@ anv_semaphore_unref(struct anv_device *device, struct anv_semaphore *semaphore) anv_semaphore_impl_cleanup(device, &semaphore->temporary); anv_semaphore_impl_cleanup(device, &semaphore->permanent); + + vk_object_base_finish(&semaphore->base); vk_free(&device->vk.alloc, semaphore); } diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index 82d6793e66a..f3f9333cc76 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -2279,6 +2279,8 @@ compute_pipeline_create( if (pipeline == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &pipeline->base.base, + VK_OBJECT_TYPE_PIPELINE); pipeline->base.device = device; pipeline->base.type = ANV_PIPELINE_COMPUTE; diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index d5d6d6e2f91..c5009445d38 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -106,6 +106,7 @@ VkResult genX(CreateQueryPool)( if (pool == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &pool->base, VK_OBJECT_TYPE_QUERY_POOL); pool->type = pCreateInfo->queryType; pool->pipeline_statistics = pipeline_statistics; pool->stride = uint64s_per_slot * sizeof(uint64_t); @@ -152,6 +153,7 @@ void genX(DestroyQueryPool)( return; anv_device_release_bo(device, pool->bo); + vk_object_base_finish(&pool->base); vk_free2(&device->vk.alloc, pAllocator, pool); } diff --git a/src/intel/vulkan/genX_state.c b/src/intel/vulkan/genX_state.c index fd87954d100..ea953b7842b 100644 --- a/src/intel/vulkan/genX_state.c +++ b/src/intel/vulkan/genX_state.c @@ -363,6 +363,7 @@ VkResult genX(CreateSampler)( if (!sampler) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + vk_object_base_init(&device->vk, &sampler->base, VK_OBJECT_TYPE_SAMPLER); sampler->n_planes = 1; uint32_t border_color_stride = GEN_IS_HASWELL ? 512 : 64; diff --git a/src/vulkan/util/vk_object.c b/src/vulkan/util/vk_object.c index 77258ab6879..d6965158914 100644 --- a/src/vulkan/util/vk_object.c +++ b/src/vulkan/util/vk_object.c @@ -23,13 +23,26 @@ #include "vk_object.h" +void +vk_object_base_init(UNUSED struct vk_device *device, + struct vk_object_base *base, + UNUSED VkObjectType obj_type) +{ + base->_loader_data.loaderMagic = ICD_LOADER_MAGIC; +} + +void +vk_object_base_finish(UNUSED struct vk_object_base *base) +{ +} + void vk_device_init(struct vk_device *device, UNUSED const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *instance_alloc, const VkAllocationCallbacks *device_alloc) { - device->_loader_data.loaderMagic = ICD_LOADER_MAGIC; + vk_object_base_init(device, &device->base, VK_OBJECT_TYPE_DEVICE); if (device_alloc) device->alloc = *device_alloc; else @@ -39,4 +52,5 @@ vk_device_init(struct vk_device *device, void vk_device_finish(UNUSED struct vk_device *device) { + vk_object_base_finish(&device->base); } diff --git a/src/vulkan/util/vk_object.h b/src/vulkan/util/vk_object.h index 8fc42b862da..c2b3926133e 100644 --- a/src/vulkan/util/vk_object.h +++ b/src/vulkan/util/vk_object.h @@ -32,8 +32,20 @@ extern "C" { #endif -struct vk_device { +struct vk_device; + +struct vk_object_base { VK_LOADER_DATA _loader_data; +}; + +void vk_object_base_init(UNUSED struct vk_device *device, + struct vk_object_base *base, + UNUSED VkObjectType obj_type); +void vk_object_base_finish(UNUSED struct vk_object_base *base); + + +struct vk_device { + struct vk_object_base base; VkAllocationCallbacks alloc; }; -- 2.30.2