summaryrefslogtreecommitdiff
path: root/vulkan/libvulkan/loader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vulkan/libvulkan/loader.cpp')
-rw-r--r--vulkan/libvulkan/loader.cpp74
1 files changed, 38 insertions, 36 deletions
diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
index 8c68efa70a..3e5ea22c10 100644
--- a/vulkan/libvulkan/loader.cpp
+++ b/vulkan/libvulkan/loader.cpp
@@ -147,7 +147,6 @@ struct Instance {
num_physical_devices(0) {
memset(physical_devices, 0, sizeof(physical_devices));
enabled_extensions.reset();
- memset(&drv.dispatch, 0, sizeof(drv.dispatch));
}
~Instance() {}
@@ -162,10 +161,6 @@ struct Instance {
DebugReportCallbackList debug_report_callbacks;
InstanceExtensionSet enabled_extensions;
-
- struct {
- DriverDispatchTable dispatch;
- } drv; // may eventually be an array
};
struct Device {
@@ -226,8 +221,8 @@ typename HandleTraits<THandle>::LoaderObjectType& GetDispatchParent(
void DestroyDevice(Device* device, VkDevice vkdevice) {
const auto& instance = *device->instance;
- if (vkdevice != VK_NULL_HANDLE)
- instance.drv.dispatch.DestroyDevice(vkdevice, instance.alloc);
+ if (vkdevice != VK_NULL_HANDLE && device->base.driver.DestroyDevice)
+ device->base.driver.DestroyDevice(vkdevice, instance.alloc);
device->~Device();
instance.alloc->pfnFree(instance.alloc->pUserData, device);
@@ -263,8 +258,8 @@ void* StripCreateExtensions(const void* pNext) {
void DestroyInstance(Instance* instance,
const VkAllocationCallbacks* allocator,
VkInstance vkinstance) {
- if (vkinstance != VK_NULL_HANDLE && instance->drv.dispatch.DestroyInstance)
- instance->drv.dispatch.DestroyInstance(vkinstance, allocator);
+ if (vkinstance != VK_NULL_HANDLE && instance->base.driver.DestroyInstance)
+ instance->base.driver.DestroyInstance(vkinstance, allocator);
instance->~Instance();
allocator->pfnFree(allocator->pUserData, instance);
@@ -397,22 +392,30 @@ VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info,
return VK_ERROR_INITIALIZATION_FAILED;
}
- if (!LoadDriverDispatchTable(drv_instance, g_hwdevice->GetInstanceProcAddr,
- instance.enabled_extensions,
- instance.drv.dispatch)) {
+ if (!driver::InitDriverTable(drv_instance,
+ g_hwdevice->GetInstanceProcAddr)) {
+ DestroyInstance(&instance, allocator, drv_instance);
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+
+ instance.base.get_device_proc_addr =
+ reinterpret_cast<PFN_vkGetDeviceProcAddr>(
+ g_hwdevice->GetInstanceProcAddr(drv_instance,
+ "vkGetDeviceProcAddr"));
+ if (!instance.base.get_device_proc_addr) {
DestroyInstance(&instance, allocator, drv_instance);
return VK_ERROR_INITIALIZATION_FAILED;
}
uint32_t num_physical_devices = 0;
- result = instance.drv.dispatch.EnumeratePhysicalDevices(
+ result = instance.base.driver.EnumeratePhysicalDevices(
drv_instance, &num_physical_devices, nullptr);
if (result != VK_SUCCESS) {
DestroyInstance(&instance, allocator, drv_instance);
return VK_ERROR_INITIALIZATION_FAILED;
}
num_physical_devices = std::min(num_physical_devices, kMaxPhysicalDevices);
- result = instance.drv.dispatch.EnumeratePhysicalDevices(
+ result = instance.base.driver.EnumeratePhysicalDevices(
drv_instance, &num_physical_devices, instance.physical_devices);
if (result != VK_SUCCESS) {
DestroyInstance(&instance, allocator, drv_instance);
@@ -428,7 +431,7 @@ VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info,
}
uint32_t count;
- if ((result = instance.drv.dispatch.EnumerateDeviceExtensionProperties(
+ if ((result = instance.base.driver.EnumerateDeviceExtensionProperties(
instance.physical_devices[i], nullptr, &count, nullptr)) !=
VK_SUCCESS) {
ALOGW("driver EnumerateDeviceExtensionProperties(%u) failed: %d", i,
@@ -442,7 +445,7 @@ VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info,
DestroyInstance(&instance, allocator, drv_instance);
return VK_ERROR_OUT_OF_HOST_MEMORY;
}
- if ((result = instance.drv.dispatch.EnumerateDeviceExtensionProperties(
+ if ((result = instance.base.driver.EnumerateDeviceExtensionProperties(
instance.physical_devices[i], nullptr, &count,
extensions.data())) != VK_SUCCESS) {
ALOGW("driver EnumerateDeviceExtensionProperties(%u) failed: %d", i,
@@ -596,7 +599,7 @@ VkResult CreateDevice_Bottom(VkPhysicalDevice gpu,
driver_create_info.enabledExtensionCount = num_driver_extensions;
driver_create_info.ppEnabledExtensionNames = driver_extensions;
VkDevice drv_device;
- VkResult result = instance.drv.dispatch.CreateDevice(
+ VkResult result = instance.base.driver.CreateDevice(
gpu, &driver_create_info, allocator, &drv_device);
if (result != VK_SUCCESS) {
DestroyDevice(device, VK_NULL_HANDLE);
@@ -608,10 +611,11 @@ VkResult CreateDevice_Bottom(VkPhysicalDevice gpu,
return VK_ERROR_INITIALIZATION_FAILED;
}
- device->base.get_device_proc_addr =
- reinterpret_cast<PFN_vkGetDeviceProcAddr>(
- instance.drv.dispatch.GetDeviceProcAddr(drv_device,
- "vkGetDeviceProcAddr"));
+ if (!driver::InitDriverTable(drv_device,
+ instance.base.get_device_proc_addr)) {
+ DestroyDevice(device, drv_device);
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
*device_out = drv_device;
return VK_SUCCESS;
@@ -638,25 +642,23 @@ void GetDeviceQueue_Bottom(VkDevice vkdevice,
uint32_t family,
uint32_t index,
VkQueue* queue_out) {
- const auto& device = GetDispatchParent(vkdevice);
- const auto& instance = *device.instance;
+ const auto& data = driver::GetData(vkdevice);
- instance.drv.dispatch.GetDeviceQueue(vkdevice, family, index, queue_out);
- driver::SetData(*queue_out, device.base);
+ data.driver.GetDeviceQueue(vkdevice, family, index, queue_out);
+ driver::SetData(*queue_out, data);
}
VkResult AllocateCommandBuffers_Bottom(
VkDevice vkdevice,
const VkCommandBufferAllocateInfo* alloc_info,
VkCommandBuffer* cmdbufs) {
- const auto& device = GetDispatchParent(vkdevice);
- const auto& instance = *device.instance;
+ const auto& data = driver::GetData(vkdevice);
- VkResult result = instance.drv.dispatch.AllocateCommandBuffers(
- vkdevice, alloc_info, cmdbufs);
+ VkResult result =
+ data.driver.AllocateCommandBuffers(vkdevice, alloc_info, cmdbufs);
if (result == VK_SUCCESS) {
for (uint32_t i = 0; i < alloc_info->commandBufferCount; i++)
- driver::SetData(cmdbufs[i], device.base);
+ driver::SetData(cmdbufs[i], data);
}
return result;
@@ -676,16 +678,16 @@ VkInstance GetDriverInstance(VkInstance instance) {
return instance;
}
-const DriverDispatchTable& GetDriverDispatch(VkInstance instance) {
- return GetDispatchParent(instance).drv.dispatch;
+const driver::InstanceDriverTable& GetDriverDispatch(VkInstance instance) {
+ return driver::GetData(instance).driver;
}
-const DriverDispatchTable& GetDriverDispatch(VkDevice device) {
- return GetDispatchParent(device).instance->drv.dispatch;
+const driver::DeviceDriverTable& GetDriverDispatch(VkDevice device) {
+ return driver::GetData(device).driver;
}
-const DriverDispatchTable& GetDriverDispatch(VkQueue queue) {
- return GetDispatchParent(queue).instance->drv.dispatch;
+const driver::DeviceDriverTable& GetDriverDispatch(VkQueue queue) {
+ return driver::GetData(queue).driver;
}
DebugReportCallbackList& GetDebugReportCallbacks(VkInstance instance) {