summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-01-16 18:24:56 -0800
committerJason Ekstrand <[email protected]>2018-01-23 00:15:40 -0800
commite3d27542aec33c7e0c2048a46a8a3cf71f09e907 (patch)
tree6f403a706fe365361bb2394274443862f1b680f2 /src
parent0c399dca51d2aa1a784edcb6e409aba5b67e1473 (diff)
anv: Add a per-device dispatch table
We also switch GetDeviceProcAddr over to use it. Reviewed-by: Samuel Iglesias Gonsálvez <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/anv_device.c44
-rw-r--r--src/intel/vulkan/anv_private.h1
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;