anv: Add a per-device dispatch table
We also switch GetDeviceProcAddr over to use it. Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
This commit is contained in:
@@ -1117,7 +1117,15 @@ PFN_vkVoidFunction anv_GetDeviceProcAddr(
|
|||||||
const char* pName)
|
const char* pName)
|
||||||
{
|
{
|
||||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
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
|
VkResult
|
||||||
@@ -1256,6 +1264,38 @@ VkResult anv_EnumerateDeviceExtensionProperties(
|
|||||||
return vk_outarray_status(&out);
|
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(
|
VkResult anv_CreateDevice(
|
||||||
VkPhysicalDevice physicalDevice,
|
VkPhysicalDevice physicalDevice,
|
||||||
const VkDeviceCreateInfo* pCreateInfo,
|
const VkDeviceCreateInfo* pCreateInfo,
|
||||||
@@ -1342,6 +1382,8 @@ VkResult anv_CreateDevice(
|
|||||||
pCreateInfo->pEnabledFeatures->robustBufferAccess;
|
pCreateInfo->pEnabledFeatures->robustBufferAccess;
|
||||||
device->enabled_extensions = enabled_extensions;
|
device->enabled_extensions = enabled_extensions;
|
||||||
|
|
||||||
|
anv_device_init_dispatch(device);
|
||||||
|
|
||||||
if (pthread_mutex_init(&device->mutex, NULL) != 0) {
|
if (pthread_mutex_init(&device->mutex, NULL) != 0) {
|
||||||
result = vk_error(VK_ERROR_INITIALIZATION_FAILED);
|
result = vk_error(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
goto fail_context_id;
|
goto fail_context_id;
|
||||||
|
@@ -859,6 +859,7 @@ struct anv_device {
|
|||||||
bool can_chain_batches;
|
bool can_chain_batches;
|
||||||
bool robust_buffer_access;
|
bool robust_buffer_access;
|
||||||
struct anv_device_extension_table enabled_extensions;
|
struct anv_device_extension_table enabled_extensions;
|
||||||
|
struct anv_dispatch_table dispatch;
|
||||||
|
|
||||||
struct anv_bo_pool batch_bo_pool;
|
struct anv_bo_pool batch_bo_pool;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user