diff options
author | Jason Ekstrand <[email protected]> | 2018-01-16 18:24:56 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-01-23 00:15:40 -0800 |
commit | e3d27542aec33c7e0c2048a46a8a3cf71f09e907 (patch) | |
tree | 6f403a706fe365361bb2394274443862f1b680f2 | |
parent | 0c399dca51d2aa1a784edcb6e409aba5b67e1473 (diff) |
anv: Add a per-device dispatch table
We also switch GetDeviceProcAddr over to use it.
Reviewed-by: Samuel Iglesias Gonsálvez <[email protected]>
-rw-r--r-- | src/intel/vulkan/anv_device.c | 44 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 1 |
2 files changed, 44 insertions, 1 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index d827aec9a71..e70ddf17998 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -1117,7 +1117,15 @@ PFN_vkVoidFunction anv_GetDeviceProcAddr( const char* pName) { ANV_FROM_HANDLE(anv_device, device, _device); - return anv_lookup_entrypoint(&device->info, pName); + + if (!device || !pName) + return NULL; + + int idx = anv_get_entrypoint_index(pName); + if (idx < 0) + return NULL; + + return device->dispatch.entrypoints[idx]; } VkResult @@ -1256,6 +1264,38 @@ VkResult anv_EnumerateDeviceExtensionProperties( return vk_outarray_status(&out); } +static void +anv_device_init_dispatch(struct anv_device *device) +{ + const struct anv_dispatch_table *genX_table; + switch (device->info.gen) { + case 10: + genX_table = &gen10_dispatch_table; + break; + case 9: + genX_table = &gen9_dispatch_table; + break; + case 8: + genX_table = &gen8_dispatch_table; + break; + case 7: + if (device->info.is_haswell) + genX_table = &gen75_dispatch_table; + else + genX_table = &gen7_dispatch_table; + break; + default: + unreachable("unsupported gen\n"); + } + + for (unsigned i = 0; i < ARRAY_SIZE(device->dispatch.entrypoints); i++) { + if (genX_table->entrypoints[i]) + device->dispatch.entrypoints[i] = genX_table->entrypoints[i]; + else + device->dispatch.entrypoints[i] = anv_dispatch_table.entrypoints[i]; + } +} + VkResult anv_CreateDevice( VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, @@ -1342,6 +1382,8 @@ VkResult anv_CreateDevice( pCreateInfo->pEnabledFeatures->robustBufferAccess; device->enabled_extensions = enabled_extensions; + anv_device_init_dispatch(device); + if (pthread_mutex_init(&device->mutex, NULL) != 0) { result = vk_error(VK_ERROR_INITIALIZATION_FAILED); goto fail_context_id; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d1b2ebc11fb..45dbcfdcb63 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -859,6 +859,7 @@ struct anv_device { bool can_chain_batches; bool robust_buffer_access; struct anv_device_extension_table enabled_extensions; + struct anv_dispatch_table dispatch; struct anv_bo_pool batch_bo_pool; |