diff options
Diffstat (limited to 'src/venus/vkr_device.c')
-rw-r--r-- | src/venus/vkr_device.c | 214 |
1 files changed, 80 insertions, 134 deletions
diff --git a/src/venus/vkr_device.c b/src/venus/vkr_device.c index a15d431a..4d7aea77 100644 --- a/src/venus/vkr_device.c +++ b/src/venus/vkr_device.c @@ -20,6 +20,7 @@ vkr_device_create_queues(struct vkr_context *ctx, uint32_t create_info_count, const VkDeviceQueueCreateInfo *create_infos) { + struct vn_device_proc_table *vk = &dev->proc_table; list_inithead(&dev->queues); for (uint32_t i = 0; i < create_info_count; i++) { @@ -32,7 +33,16 @@ vkr_device_create_queues(struct vkr_context *ctx, .queueIndex = j, }; VkQueue handle = VK_NULL_HANDLE; - vkGetDeviceQueue2(dev->base.handle.device, &info, &handle); + /* There was a bug in spec which forbids usage of vkGetDeviceQueue2 + * with flags set to zero. It was fixed in spec version 1.1.130. + * Work around drivers that are implementing this buggy behavior + */ + if (info.flags) { + vk->GetDeviceQueue2(dev->base.handle.device, &info, &handle); + } else { + vk->GetDeviceQueue(dev->base.handle.device, info.queueFamilyIndex, + info.queueIndex, &handle); + } struct vkr_queue *queue = vkr_queue_create( ctx, dev, info.flags, info.queueFamilyIndex, info.queueIndex, handle); @@ -53,94 +63,16 @@ vkr_device_create_queues(struct vkr_context *ctx, } static void -vkr_device_init_entry_points(struct vkr_device *dev, uint32_t api_version) +vkr_device_init_proc_table(struct vkr_device *dev, + uint32_t api_version, + const char *const *exts, + uint32_t count) { - VkDevice handle = dev->base.handle.device; - if (api_version >= VK_API_VERSION_1_2) { - dev->GetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)vkGetDeviceProcAddr( - handle, "vkGetSemaphoreCounterValue"); - dev->WaitSemaphores = - (PFN_vkWaitSemaphores)vkGetDeviceProcAddr(handle, "vkWaitSemaphores"); - dev->SignalSemaphore = - (PFN_vkSignalSemaphore)vkGetDeviceProcAddr(handle, "vkSignalSemaphore"); - dev->GetDeviceMemoryOpaqueCaptureAddress = - (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)vkGetDeviceProcAddr( - handle, "vkGetDeviceMemoryOpaqueCaptureAddress"); - dev->GetBufferOpaqueCaptureAddress = - (PFN_vkGetBufferOpaqueCaptureAddress)vkGetDeviceProcAddr( - handle, "vkGetBufferOpaqueCaptureAddress"); - dev->GetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)vkGetDeviceProcAddr( - handle, "vkGetBufferDeviceAddress"); - dev->ResetQueryPool = - (PFN_vkResetQueryPool)vkGetDeviceProcAddr(handle, "vkResetQueryPool"); - dev->CreateRenderPass2 = - (PFN_vkCreateRenderPass2)vkGetDeviceProcAddr(handle, "vkCreateRenderPass2"); - dev->CmdBeginRenderPass2 = - (PFN_vkCmdBeginRenderPass2)vkGetDeviceProcAddr(handle, "vkCmdBeginRenderPass2"); - dev->CmdNextSubpass2 = - (PFN_vkCmdNextSubpass2)vkGetDeviceProcAddr(handle, "vkCmdNextSubpass2"); - dev->CmdEndRenderPass2 = - (PFN_vkCmdEndRenderPass2)vkGetDeviceProcAddr(handle, "vkCmdEndRenderPass2"); - dev->CmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)vkGetDeviceProcAddr( - handle, "vkCmdDrawIndirectCount"); - dev->CmdDrawIndexedIndirectCount = - (PFN_vkCmdDrawIndexedIndirectCount)vkGetDeviceProcAddr( - handle, "vkCmdDrawIndexedIndirectCount"); - } else { - dev->GetSemaphoreCounterValue = (PFN_vkGetSemaphoreCounterValue)vkGetDeviceProcAddr( - handle, "vkGetSemaphoreCounterValueKHR"); - dev->WaitSemaphores = - (PFN_vkWaitSemaphores)vkGetDeviceProcAddr(handle, "vkWaitSemaphoresKHR"); - dev->SignalSemaphore = - (PFN_vkSignalSemaphore)vkGetDeviceProcAddr(handle, "vkSignalSemaphoreKHR"); - dev->GetDeviceMemoryOpaqueCaptureAddress = - (PFN_vkGetDeviceMemoryOpaqueCaptureAddress)vkGetDeviceProcAddr( - handle, "vkGetDeviceMemoryOpaqueCaptureAddressKHR"); - dev->GetBufferOpaqueCaptureAddress = - (PFN_vkGetBufferOpaqueCaptureAddress)vkGetDeviceProcAddr( - handle, "vkGetBufferOpaqueCaptureAddressKHR"); - dev->GetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)vkGetDeviceProcAddr( - handle, "vkGetBufferDeviceAddressKHR"); - dev->ResetQueryPool = - (PFN_vkResetQueryPool)vkGetDeviceProcAddr(handle, "vkResetQueryPoolEXT"); - dev->CreateRenderPass2 = - (PFN_vkCreateRenderPass2)vkGetDeviceProcAddr(handle, "vkCreateRenderPass2KHR"); - dev->CmdBeginRenderPass2 = (PFN_vkCmdBeginRenderPass2)vkGetDeviceProcAddr( - handle, "vkCmdBeginRenderPass2KHR"); - dev->CmdNextSubpass2 = - (PFN_vkCmdNextSubpass2)vkGetDeviceProcAddr(handle, "vkCmdNextSubpass2KHR"); - dev->CmdEndRenderPass2 = - (PFN_vkCmdEndRenderPass2)vkGetDeviceProcAddr(handle, "vkCmdEndRenderPass2KHR"); - dev->CmdDrawIndirectCount = (PFN_vkCmdDrawIndirectCount)vkGetDeviceProcAddr( - handle, "vkCmdDrawIndirectCountKHR"); - dev->CmdDrawIndexedIndirectCount = - (PFN_vkCmdDrawIndexedIndirectCount)vkGetDeviceProcAddr( - handle, "vkCmdDrawIndexedIndirectCountKHR"); - } + struct vn_info_extension_table ext_table; + vkr_extension_table_init(&ext_table, exts, count); - dev->cmd_bind_transform_feedback_buffers = - (PFN_vkCmdBindTransformFeedbackBuffersEXT)vkGetDeviceProcAddr( - handle, "vkCmdBindTransformFeedbackBuffersEXT"); - dev->cmd_begin_transform_feedback = - (PFN_vkCmdBeginTransformFeedbackEXT)vkGetDeviceProcAddr( - handle, "vkCmdBeginTransformFeedbackEXT"); - dev->cmd_end_transform_feedback = - (PFN_vkCmdEndTransformFeedbackEXT)vkGetDeviceProcAddr( - handle, "vkCmdEndTransformFeedbackEXT"); - dev->cmd_begin_query_indexed = (PFN_vkCmdBeginQueryIndexedEXT)vkGetDeviceProcAddr( - handle, "vkCmdBeginQueryIndexedEXT"); - dev->cmd_end_query_indexed = - (PFN_vkCmdEndQueryIndexedEXT)vkGetDeviceProcAddr(handle, "vkCmdEndQueryIndexedEXT"); - dev->cmd_draw_indirect_byte_count = - (PFN_vkCmdDrawIndirectByteCountEXT)vkGetDeviceProcAddr( - handle, "vkCmdDrawIndirectByteCountEXT"); - - dev->get_image_drm_format_modifier_properties = - (PFN_vkGetImageDrmFormatModifierPropertiesEXT)vkGetDeviceProcAddr( - handle, "vkGetImageDrmFormatModifierPropertiesEXT"); - - dev->get_memory_fd_properties = (PFN_vkGetMemoryFdPropertiesKHR)vkGetDeviceProcAddr( - handle, "vkGetMemoryFdPropertiesKHR"); + vn_util_init_device_proc_table(dev->base.handle.device, api_version, &ext_table, + &dev->proc_table); } static void @@ -196,10 +128,14 @@ vkr_dispatch_vkCreateDevice(struct vn_dispatch_context *dispatch, return; } - free(exts); - dev->physical_device = physical_dev; + vkr_device_init_proc_table(dev, physical_dev->api_version, + args->pCreateInfo->ppEnabledExtensionNames, + args->pCreateInfo->enabledExtensionCount); + + free(exts); + args->ret = vkr_device_create_queues(ctx, dev, args->pCreateInfo->queueCreateInfoCount, args->pCreateInfo->pQueueCreateInfos); if (args->ret != VK_SUCCESS) { @@ -208,8 +144,6 @@ vkr_dispatch_vkCreateDevice(struct vn_dispatch_context *dispatch, return; } - vkr_device_init_entry_points(dev, physical_dev->api_version); - mtx_init(&dev->free_sync_mutex, mtx_plain); list_inithead(&dev->free_syncs); @@ -225,91 +159,83 @@ vkr_device_object_destroy(struct vkr_context *ctx, struct vkr_device *dev, struct vkr_object *obj) { + struct vn_device_proc_table *vk = &dev->proc_table; VkDevice device = dev->base.handle.device; assert(vkr_device_should_track_object(obj)); switch (obj->type) { case VK_OBJECT_TYPE_SEMAPHORE: - vkDestroySemaphore(device, obj->handle.semaphore, NULL); + vk->DestroySemaphore(device, obj->handle.semaphore, NULL); break; case VK_OBJECT_TYPE_FENCE: - vkDestroyFence(device, obj->handle.fence, NULL); + vk->DestroyFence(device, obj->handle.fence, NULL); break; case VK_OBJECT_TYPE_DEVICE_MEMORY: - vkFreeMemory(device, obj->handle.device_memory, NULL); - - /* remove device memory from exported or attachment list */ - list_del(&((struct vkr_device_memory *)obj)->exported_head); + vk->FreeMemory(device, obj->handle.device_memory, NULL); + vkr_device_memory_release((struct vkr_device_memory *)obj); break; case VK_OBJECT_TYPE_BUFFER: - vkDestroyBuffer(device, obj->handle.buffer, NULL); + vk->DestroyBuffer(device, obj->handle.buffer, NULL); break; case VK_OBJECT_TYPE_IMAGE: - vkDestroyImage(device, obj->handle.image, NULL); + vk->DestroyImage(device, obj->handle.image, NULL); break; case VK_OBJECT_TYPE_EVENT: - vkDestroyEvent(device, obj->handle.event, NULL); + vk->DestroyEvent(device, obj->handle.event, NULL); break; case VK_OBJECT_TYPE_QUERY_POOL: - vkDestroyQueryPool(device, obj->handle.query_pool, NULL); + vk->DestroyQueryPool(device, obj->handle.query_pool, NULL); break; case VK_OBJECT_TYPE_BUFFER_VIEW: - vkDestroyBufferView(device, obj->handle.buffer_view, NULL); + vk->DestroyBufferView(device, obj->handle.buffer_view, NULL); break; case VK_OBJECT_TYPE_IMAGE_VIEW: - vkDestroyImageView(device, obj->handle.image_view, NULL); + vk->DestroyImageView(device, obj->handle.image_view, NULL); break; case VK_OBJECT_TYPE_SHADER_MODULE: - vkDestroyShaderModule(device, obj->handle.shader_module, NULL); + vk->DestroyShaderModule(device, obj->handle.shader_module, NULL); break; case VK_OBJECT_TYPE_PIPELINE_CACHE: - vkDestroyPipelineCache(device, obj->handle.pipeline_cache, NULL); + vk->DestroyPipelineCache(device, obj->handle.pipeline_cache, NULL); break; case VK_OBJECT_TYPE_PIPELINE_LAYOUT: - vkDestroyPipelineLayout(device, obj->handle.pipeline_layout, NULL); + vk->DestroyPipelineLayout(device, obj->handle.pipeline_layout, NULL); break; case VK_OBJECT_TYPE_RENDER_PASS: - vkDestroyRenderPass(device, obj->handle.render_pass, NULL); + vk->DestroyRenderPass(device, obj->handle.render_pass, NULL); break; case VK_OBJECT_TYPE_PIPELINE: - vkDestroyPipeline(device, obj->handle.pipeline, NULL); + vk->DestroyPipeline(device, obj->handle.pipeline, NULL); break; case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT: - vkDestroyDescriptorSetLayout(device, obj->handle.descriptor_set_layout, NULL); + vk->DestroyDescriptorSetLayout(device, obj->handle.descriptor_set_layout, NULL); break; case VK_OBJECT_TYPE_SAMPLER: - vkDestroySampler(device, obj->handle.sampler, NULL); + vk->DestroySampler(device, obj->handle.sampler, NULL); break; case VK_OBJECT_TYPE_DESCRIPTOR_POOL: { - /* Destroying VkDescriptorPool frees all VkDescriptorSet objects that were allocated - * from it. - */ - vkDestroyDescriptorPool(device, obj->handle.descriptor_pool, NULL); - - struct vkr_descriptor_pool *pool = (struct vkr_descriptor_pool *)obj; - vkr_context_remove_objects(ctx, &pool->descriptor_sets); + /* Destroying VkDescriptorPool frees all VkDescriptorSet allocated inside. */ + vk->DestroyDescriptorPool(device, obj->handle.descriptor_pool, NULL); + vkr_descriptor_pool_release(ctx, (struct vkr_descriptor_pool *)obj); break; } case VK_OBJECT_TYPE_FRAMEBUFFER: - vkDestroyFramebuffer(device, obj->handle.framebuffer, NULL); + vk->DestroyFramebuffer(device, obj->handle.framebuffer, NULL); break; case VK_OBJECT_TYPE_COMMAND_POOL: { - /* Destroying VkCommandPool frees all VkCommandBuffer objects that were allocated - * from it. - */ - vkDestroyCommandPool(device, obj->handle.command_pool, NULL); - - struct vkr_command_pool *pool = (struct vkr_command_pool *)obj; - vkr_context_remove_objects(ctx, &pool->command_buffers); + /* Destroying VkCommandPool frees all VkCommandBuffer allocated inside. */ + vk->DestroyCommandPool(device, obj->handle.command_pool, NULL); + vkr_command_pool_release(ctx, (struct vkr_command_pool *)obj); break; } case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION: - vkDestroySamplerYcbcrConversion(device, obj->handle.sampler_ycbcr_conversion, NULL); + vk->DestroySamplerYcbcrConversion(device, obj->handle.sampler_ycbcr_conversion, + NULL); break; case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE: - vkDestroyDescriptorUpdateTemplate(device, obj->handle.descriptor_update_template, - NULL); + vk->DestroyDescriptorUpdateTemplate(device, obj->handle.descriptor_update_template, + NULL); break; default: vkr_log("Unhandled vkr_object(%p) with VkObjectType(%u)", obj, (uint32_t)obj->type); @@ -323,12 +249,13 @@ vkr_device_object_destroy(struct vkr_context *ctx, void vkr_device_destroy(struct vkr_context *ctx, struct vkr_device *dev) { + struct vn_device_proc_table *vk = &dev->proc_table; VkDevice device = dev->base.handle.device; if (!LIST_IS_EMPTY(&dev->objects)) vkr_log("destroying device with valid objects"); - VkResult result = vkDeviceWaitIdle(device); + VkResult result = vk->DeviceWaitIdle(device); if (result != VK_SUCCESS) vkr_log("vkDeviceWaitIdle(%p) failed(%d)", dev, (int32_t)result); @@ -344,13 +271,13 @@ vkr_device_destroy(struct vkr_context *ctx, struct vkr_device *dev) struct vkr_queue_sync *sync, *sync_tmp; LIST_FOR_EACH_ENTRY_SAFE (sync, sync_tmp, &dev->free_syncs, head) { - vkDestroyFence(dev->base.handle.device, sync->fence, NULL); + vk->DestroyFence(dev->base.handle.device, sync->fence, NULL); free(sync); } mtx_destroy(&dev->free_sync_mutex); - vkDestroyDevice(device, NULL); + vk->DestroyDevice(device, NULL); list_del(&dev->base.track_head); @@ -376,10 +303,13 @@ vkr_dispatch_vkGetDeviceGroupPeerMemoryFeatures( UNUSED struct vn_dispatch_context *dispatch, struct vn_command_vkGetDeviceGroupPeerMemoryFeatures *args) { + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + vn_replace_vkGetDeviceGroupPeerMemoryFeatures_args_handle(args); - vkGetDeviceGroupPeerMemoryFeatures(args->device, args->heapIndex, - args->localDeviceIndex, args->remoteDeviceIndex, - args->pPeerMemoryFeatures); + vk->GetDeviceGroupPeerMemoryFeatures(args->device, args->heapIndex, + args->localDeviceIndex, args->remoteDeviceIndex, + args->pPeerMemoryFeatures); } static void @@ -391,6 +321,20 @@ vkr_dispatch_vkDeviceWaitIdle(struct vn_dispatch_context *dispatch, vkr_cs_decoder_set_fatal(&ctx->decoder); } +static void +vkr_dispatch_vkGetCalibratedTimestampsEXT( + UNUSED struct vn_dispatch_context *ctx, + struct vn_command_vkGetCalibratedTimestampsEXT *args) +{ + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + + vn_replace_vkGetCalibratedTimestampsEXT_args_handle(args); + args->ret = vk->GetCalibratedTimestampsEXT(args->device, args->timestampCount, + args->pTimestampInfos, args->pTimestamps, + args->pMaxDeviation); +} + void vkr_context_init_device_dispatch(struct vkr_context *ctx) { @@ -402,4 +346,6 @@ vkr_context_init_device_dispatch(struct vkr_context *ctx) dispatch->dispatch_vkGetDeviceGroupPeerMemoryFeatures = vkr_dispatch_vkGetDeviceGroupPeerMemoryFeatures; dispatch->dispatch_vkDeviceWaitIdle = vkr_dispatch_vkDeviceWaitIdle; + dispatch->dispatch_vkGetCalibratedTimestampsEXT = + vkr_dispatch_vkGetCalibratedTimestampsEXT; } |