diff options
| author | Chia-I Wu <olvaffe@gmail.com> | 2016-04-28 16:04:15 +0800 |
|---|---|---|
| committer | Chia-I Wu <olv@google.com> | 2016-05-13 10:35:37 +0800 |
| commit | 258dd617c33a65bbedacbbbd49a7548ff16e4e39 (patch) | |
| tree | aeb540d132f706962f4933853c74f3cc5b0f29e7 /layers | |
| parent | 4953006673c8a85e5f257864f83c586e49a66229 (diff) | |
| download | usermoji-258dd617c33a65bbedacbbbd49a7548ff16e4e39.tar.xz | |
swapchain: avoid invalid GIPA call in vkCreateDevice
Save VkInstance in layer_data so that we query vkCreateDevice with a valid
instance.
Diffstat (limited to 'layers')
| -rw-r--r-- | layers/swapchain.cpp | 5 | ||||
| -rw-r--r-- | layers/swapchain.h | 2 |
2 files changed, 5 insertions, 2 deletions
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index 2da7b62d..21527616 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -251,6 +251,7 @@ CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallba } layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); + my_data->instance = *pInstance; my_data->instance_dispatch_table = new VkLayerInstanceDispatchTable; layer_init_instance_dispatch_table(*pInstance, my_data->instance_dispatch_table, fpGetInstanceProcAddr); @@ -1002,12 +1003,13 @@ EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, Vk VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { + layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); assert(chain_info->u.pLayerInfo); PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; - PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice"); + PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice"); if (fpCreateDevice == NULL) { return VK_ERROR_INITIALIZATION_FAILED; } @@ -1021,7 +1023,6 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, } std::lock_guard<std::mutex> lock(global_lock); - layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); // Setup device dispatch table diff --git a/layers/swapchain.h b/layers/swapchain.h index acbdaf48..3348d623 100644 --- a/layers/swapchain.h +++ b/layers/swapchain.h @@ -327,6 +327,8 @@ struct _SwpQueue { }; struct layer_data { + VkInstance instance; + debug_report_data *report_data; std::vector<VkDebugReportCallbackEXT> logging_callback; VkLayerDispatchTable *device_dispatch_table; |
