layers: Fix unique_objects creation of VkDisplayKHR
Make an explict_GetPhysicalDeviceDisplayProperties.
Change-Id: I39411d0dd97ca03dbf42d7e79b02243ef8988078
diff --git a/layers/unique_objects.h b/layers/unique_objects.h
index c922681..bd42342 100644
--- a/layers/unique_objects.h
+++ b/layers/unique_objects.h
@@ -418,6 +418,45 @@
return result;
}
+VkResult explicit_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties)
+{
+ layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
+ safe_VkDisplayPropertiesKHR* local_pProperties = NULL;
+ {
+ std::lock_guard<std::mutex> lock(global_lock);
+ if (pProperties) {
+ local_pProperties = new safe_VkDisplayPropertiesKHR[*pPropertyCount];
+ for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) {
+ local_pProperties[idx0].initialize(&pProperties[idx0]);
+ if (pProperties[idx0].display) {
+ local_pProperties[idx0].display = (VkDisplayKHR)my_map_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pProperties[idx0].display)];
+ }
+ }
+ }
+ }
+
+ VkResult result = get_dispatch_table(unique_objects_instance_table_map, physicalDevice)->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, ( VkDisplayPropertiesKHR*)local_pProperties);
+ if (result == VK_SUCCESS && pProperties)
+ {
+ for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) {
+ std::lock_guard<std::mutex> lock(global_lock);
+
+ uint64_t unique_id = global_unique_id++;
+ my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(local_pProperties[idx0].display);
+ pProperties[idx0].display = reinterpret_cast<VkDisplayKHR&>(unique_id);
+ pProperties[idx0].displayName = local_pProperties[idx0].displayName;
+ pProperties[idx0].physicalDimensions = local_pProperties[idx0].physicalDimensions;
+ pProperties[idx0].physicalResolution = local_pProperties[idx0].physicalResolution;
+ pProperties[idx0].supportedTransforms = local_pProperties[idx0].supportedTransforms;
+ pProperties[idx0].planeReorderPossible = local_pProperties[idx0].planeReorderPossible;
+ pProperties[idx0].persistentContent = local_pProperties[idx0].persistentContent;
+ }
+ }
+ if (local_pProperties)
+ delete[] local_pProperties;
+ return result;
+}
+
VkResult explicit_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays)
{
layer_data *my_map_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
@@ -425,11 +464,10 @@
if (VK_SUCCESS == result) {
if ((*pDisplayCount > 0) && pDisplays) {
std::lock_guard<std::mutex> lock(global_lock);
- uint64_t unique_id;
for (uint32_t i = 0; i < *pDisplayCount; i++) {
- unique_id = global_unique_id++;
- my_map_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pDisplays);
- pDisplays[i] = reinterpret_cast<VkDisplayKHR&>(unique_id);
+ auto it = my_map_data->unique_id_mapping.find(reinterpret_cast<uint64_t> (pDisplays[i]));
+ assert (it != my_map_data->unique_id_mapping.end());
+ pDisplays[i] = reinterpret_cast<VkDisplayKHR> (it->second);
}
}
}
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 4d01549..977fd13 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -1556,6 +1556,7 @@
'DestroyDevice',
'CreateComputePipelines',
'CreateGraphicsPipelines',
+ 'GetPhysicalDeviceDisplayPropertiesKHR',
'GetDisplayPlaneSupportedDisplaysKHR',
'GetDisplayModePropertiesKHR'
]