aboutsummaryrefslogtreecommitdiff
path: root/src/venus/vkr_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/venus/vkr_device.c')
-rw-r--r--src/venus/vkr_device.c214
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;
}