aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olv@google.com>2016-05-17 07:57:15 +0800
committerTobin Ehlis <tobine@google.com>2016-05-24 06:29:13 -0600
commit3a47bcd51ee269a8526edc70a53c28eee18be831 (patch)
treee47def01c7c6b023fe559a5c6f6f973b20c0a806
parenta9b5ac2c9c02a4228da2f0bb1484e64d7e4aaf90 (diff)
downloadusermoji-3a47bcd51ee269a8526edc70a53c28eee18be831.tar.xz
unique_objects: avoid invalid GIPA call in vkCreateDevice
Save VkInstance in layer_data so that we query vkCreateDevice with a valid instance.
-rw-r--r--layers/unique_objects.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/layers/unique_objects.h b/layers/unique_objects.h
index 0da90a19..9abf240c 100644
--- a/layers/unique_objects.h
+++ b/layers/unique_objects.h
@@ -45,6 +45,8 @@ namespace unique_objects {
static uint64_t global_unique_id = 1;
struct layer_data {
+ VkInstance instance;
+
bool wsi_enabled;
std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle
VkPhysicalDevice gpu;
@@ -162,6 +164,8 @@ VkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const
return result;
}
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
+ my_data->instance = *pInstance;
initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map);
createInstanceRegisterExtensions(pCreateInfo, *pInstance);
@@ -194,12 +198,13 @@ static void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo
VkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
VkDevice *pDevice) {
+ layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), 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;
}