aboutsummaryrefslogtreecommitdiff
path: root/layers/unique_objects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers/unique_objects.cpp')
-rw-r--r--layers/unique_objects.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp
index f6d78fef..4d7722ba 100644
--- a/layers/unique_objects.cpp
+++ b/layers/unique_objects.cpp
@@ -581,6 +581,45 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapc
return result;
}
+VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount,
+ const VkSwapchainCreateInfoKHR *pCreateInfos,
+ const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) {
+ layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ safe_VkSwapchainCreateInfoKHR *local_pCreateInfos = NULL;
+ {
+ std::lock_guard<std::mutex> lock(global_lock);
+ if (pCreateInfos) {
+ // Need to pull surface mapping from the instance-level map
+ layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(dev_data->gpu), layer_data_map);
+ local_pCreateInfos = new safe_VkSwapchainCreateInfoKHR[swapchainCount];
+ for (uint32_t i = 0; i < swapchainCount; ++i) {
+ local_pCreateInfos[i].initialize(&pCreateInfos[i]);
+ if (pCreateInfos[i].surface) {
+ local_pCreateInfos[i].surface =
+ (VkSurfaceKHR)instance_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[i].surface)];
+ }
+ if (pCreateInfos[i].oldSwapchain) {
+ local_pCreateInfos[i].oldSwapchain =
+ (VkSwapchainKHR)
+ dev_data->unique_id_mapping[reinterpret_cast<const uint64_t &>(pCreateInfos[i].oldSwapchain)];
+ }
+ }
+ }
+ }
+ VkResult result = dev_data->device_dispatch_table->CreateSharedSwapchainsKHR(
+ device, swapchainCount, (const VkSwapchainCreateInfoKHR *)local_pCreateInfos, pAllocator, pSwapchains);
+ if (local_pCreateInfos) delete[] local_pCreateInfos;
+ if (VK_SUCCESS == result) {
+ std::lock_guard<std::mutex> lock(global_lock);
+ for (uint32_t i = 0; i < swapchainCount; i++) {
+ uint64_t unique_id = global_unique_id++;
+ dev_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pSwapchains[i]);
+ pSwapchains[i] = reinterpret_cast<VkSwapchainKHR &>(unique_id);
+ }
+ }
+ return result;
+}
+
VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
VkImage *pSwapchainImages) {
layer_data *my_device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);