blob: 21a0dc6f4f5c9c57d076601836439a435db4c073 [file] [log] [blame]
Mark Lobodzinski6eda00a2016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
Ian Elliott8f78daa2016-01-26 10:51:10 -07004 * Copyright (C) 2015-2016 Google Inc.
Ian Elliott0b4d6242015-09-22 10:51:24 -06005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
Ian Elliott0b4d6242015-09-22 10:51:24 -06009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Ian Elliott0b4d6242015-09-22 10:51:24 -060011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
Ian Elliott0b4d6242015-09-22 10:51:24 -060017 *
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060018 * Author: Ian Elliott <ian@lunarg.com>
Ian Elliott578e7e22016-01-05 14:03:16 -070019 * Author: Ian Elliott <ianelliott@google.com>
Ian Elliott0b4d6242015-09-22 10:51:24 -060020 */
21
22#ifndef SWAPCHAIN_H
23#define SWAPCHAIN_H
24
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include "vulkan/vk_layer.h"
Tobin Ehlis711ff312015-10-29 12:58:13 -060026#include "vk_layer_config.h"
27#include "vk_layer_logging.h"
Courtney Goeltzenleuchtercf60e0a2015-10-08 17:07:25 -060028#include <vector>
Tobin Ehlis711ff312015-10-29 12:58:13 -060029#include <unordered_map>
Courtney Goeltzenleuchtercf60e0a2015-10-08 17:07:25 -060030
Ian Elliott0b4d6242015-09-22 10:51:24 -060031using namespace std;
32
Ian Elliottb0f474c2015-09-25 15:50:55 -060033// Swapchain ERROR codes
Jon Ashburn5484e0c2016-03-08 17:48:44 -070034typedef enum _SWAPCHAIN_ERROR {
35 SWAPCHAIN_INVALID_HANDLE, // Handle used that isn't currently valid
36 SWAPCHAIN_NULL_POINTER, // Pointer set to NULL, instead of being a valid pointer
37 SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED, // Did not enable WSI extension, but called WSI function
38 SWAPCHAIN_DEL_OBJECT_BEFORE_CHILDREN, // Called vkDestroyDevice() before vkDestroySwapchainKHR()
39 SWAPCHAIN_CREATE_UNSUPPORTED_SURFACE, // Called vkCreateSwapchainKHR() with a pCreateInfo->surface that wasn't seen as supported
40 // by vkGetPhysicalDeviceSurfaceSupportKHR for the device
41 SWAPCHAIN_CREATE_SWAP_WITHOUT_QUERY, // Called vkCreateSwapchainKHR() without calling a query (e.g.
42 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR())
43 SWAPCHAIN_CREATE_SWAP_BAD_MIN_IMG_COUNT, // Called vkCreateSwapchainKHR() with out-of-bounds minImageCount
44 SWAPCHAIN_CREATE_SWAP_OUT_OF_BOUNDS_EXTENTS, // Called vkCreateSwapchainKHR() with out-of-bounds imageExtent
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -070045 SWAPCHAIN_CREATE_SWAP_EXTENTS_NO_MATCH_WIN, // Called vkCreateSwapchainKHR() with imageExtent that doesn't match window's extent
46 SWAPCHAIN_CREATE_SWAP_BAD_PRE_TRANSFORM, // Called vkCreateSwapchainKHR() with a non-supported preTransform
47 SWAPCHAIN_CREATE_SWAP_BAD_COMPOSITE_ALPHA, // Called vkCreateSwapchainKHR() with a non-supported compositeAlpha
48 SWAPCHAIN_CREATE_SWAP_BAD_IMG_ARRAY_SIZE, // Called vkCreateSwapchainKHR() with a non-supported imageArraySize
49 SWAPCHAIN_CREATE_SWAP_BAD_IMG_USAGE_FLAGS, // Called vkCreateSwapchainKHR() with a non-supported imageUsageFlags
50 SWAPCHAIN_CREATE_SWAP_BAD_IMG_COLOR_SPACE, // Called vkCreateSwapchainKHR() with a non-supported imageColorSpace
51 SWAPCHAIN_CREATE_SWAP_BAD_IMG_FORMAT, // Called vkCreateSwapchainKHR() with a non-supported imageFormat
52 SWAPCHAIN_CREATE_SWAP_BAD_IMG_FMT_CLR_SP, // Called vkCreateSwapchainKHR() with a non-supported imageColorSpace
53 SWAPCHAIN_CREATE_SWAP_BAD_PRESENT_MODE, // Called vkCreateSwapchainKHR() with a non-supported presentMode
54 SWAPCHAIN_CREATE_SWAP_BAD_SHARING_MODE, // Called vkCreateSwapchainKHR() with a non-supported imageSharingMode
Jon Ashburn5484e0c2016-03-08 17:48:44 -070055 SWAPCHAIN_CREATE_SWAP_BAD_SHARING_VALUES, // Called vkCreateSwapchainKHR() with bad values when imageSharingMode is
56 // VK_SHARING_MODE_CONCURRENT
57 SWAPCHAIN_CREATE_SWAP_DIFF_SURFACE, // Called vkCreateSwapchainKHR() with pCreateInfo->oldSwapchain that has a different surface
58 // than pCreateInfo->surface
59 SWAPCHAIN_DESTROY_SWAP_DIFF_DEVICE, // Called vkDestroySwapchainKHR() with a different VkDevice than vkCreateSwapchainKHR()
Ian Elliott5c680282016-04-06 14:29:56 -060060 SWAPCHAIN_APP_ACQUIRES_TOO_MANY_IMAGES, // vkAcquireNextImageKHR() asked for more images than are available
Jon Ashburn5484e0c2016-03-08 17:48:44 -070061 SWAPCHAIN_INDEX_TOO_LARGE, // Index is too large for swapchain
Ian Elliotta5d13a92016-04-07 09:05:45 -060062 SWAPCHAIN_INDEX_NOT_IN_USE, // vkQueuePresentKHR() given index that is not acquired by app
Jon Ashburn5484e0c2016-03-08 17:48:44 -070063 SWAPCHAIN_BAD_BOOL, // VkBool32 that doesn't have value of VK_TRUE or VK_FALSE (e.g. is a non-zero form of true)
64 SWAPCHAIN_INVALID_COUNT, // Second time a query called, the pCount value didn't match first time
65 SWAPCHAIN_WRONG_STYPE, // The sType for a struct has the wrong value
66 SWAPCHAIN_WRONG_NEXT, // The pNext for a struct is not NULL
67 SWAPCHAIN_ZERO_VALUE, // A value should be non-zero
68 SWAPCHAIN_INCOMPATIBLE_ALLOCATOR, // pAllocator must be compatible (i.e. NULL or not) when object is created and destroyed
69 SWAPCHAIN_DID_NOT_QUERY_QUEUE_FAMILIES, // A function using a queueFamilyIndex was called before
70 // vkGetPhysicalDeviceQueueFamilyProperties() was called
71 SWAPCHAIN_QUEUE_FAMILY_INDEX_TOO_LARGE, // A queueFamilyIndex value is not less than pQueueFamilyPropertyCount returned by
72 // vkGetPhysicalDeviceQueueFamilyProperties()
73 SWAPCHAIN_SURFACE_NOT_SUPPORTED_WITH_QUEUE, // A surface is not supported by a given queueFamilyIndex, as seen by
74 // vkGetPhysicalDeviceSurfaceSupportKHR()
Ian Elliottfa8f0322016-03-23 08:28:54 -060075 SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, // vkAcquireNextImageKHR should be called with a valid semaphore and/or fence
Ian Elliottb0f474c2015-09-25 15:50:55 -060076} SWAPCHAIN_ERROR;
77
Ian Elliott0b4d6242015-09-22 10:51:24 -060078// The following is for logging error messages:
Ian Elliott0b4d6242015-09-22 10:51:24 -060079#define LAYER_NAME (char *) "Swapchain"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070080#define LOG_ERROR_NON_VALID_OBJ(objType, type, obj) \
81 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, \
82 SWAPCHAIN_INVALID_HANDLE, LAYER_NAME, "%s() called with a non-valid %s.", __FUNCTION__, (obj)) \
83 : VK_FALSE
84#define LOG_ERROR_NULL_POINTER(objType, type, obj) \
85 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, \
86 SWAPCHAIN_NULL_POINTER, LAYER_NAME, "%s() called with NULL pointer %s.", __FUNCTION__, (obj)) \
87 : VK_FALSE
88#define LOG_ERROR_INVALID_COUNT(objType, type, obj, obj2, val, val2) \
89 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, \
90 SWAPCHAIN_INVALID_COUNT, LAYER_NAME, "%s() called with non-NULL %s, and with %s set to a " \
91 "value (%d) that is greater than the value (%d) that " \
92 "was returned when %s was NULL.", \
93 __FUNCTION__, (obj2), (obj), (val), (val2), (obj2)) \
94 : VK_FALSE
95#define LOG_ERROR_WRONG_STYPE(objType, type, obj, val) \
96 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, SWAPCHAIN_WRONG_STYPE, \
97 LAYER_NAME, "%s() called with the wrong value for %s->sType " \
98 "(expected %s).", \
99 __FUNCTION__, (obj), (val)) \
100 : VK_FALSE
101#define LOG_ERROR_ZERO_VALUE(objType, type, obj) \
102 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, SWAPCHAIN_ZERO_VALUE, \
103 LAYER_NAME, "%s() called with a zero value for %s.", __FUNCTION__, (obj)) \
104 : VK_FALSE
105#define LOG_ERROR(objType, type, obj, enm, fmt, ...) \
106 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, (enm), \
107 LAYER_NAME, (fmt), __VA_ARGS__) \
108 : VK_FALSE
109#define LOG_ERROR_QUEUE_FAMILY_INDEX_TOO_LARGE(objType, type, obj, val1, val2) \
110 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, \
111 SWAPCHAIN_QUEUE_FAMILY_INDEX_TOO_LARGE, LAYER_NAME, "%s() called with a queueFamilyIndex that is too " \
112 "large (i.e. %d). The maximum value (returned " \
113 "by vkGetPhysicalDeviceQueueFamilyProperties) is " \
114 "only %d.\n", \
115 __FUNCTION__, (val1), (val2)) \
116 : VK_FALSE
117#define LOG_PERF_WARNING(objType, type, obj, enm, fmt, ...) \
118 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, \
119 (enm), LAYER_NAME, (fmt), __VA_ARGS__) \
120 : VK_FALSE
Ian Elliottfa8f0322016-03-23 08:28:54 -0600121#define LOG_WARNING(objType, type, obj, enm, fmt, ...) \
122 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, (enm), \
123 LAYER_NAME, (fmt), __VA_ARGS__) \
124 : VK_FALSE
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700125#define LOG_INFO_WRONG_NEXT(objType, type, obj) \
126 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, (objType), (uint64_t)(obj), 0, \
127 SWAPCHAIN_WRONG_NEXT, LAYER_NAME, "%s() called with non-NULL value for %s->pNext.", __FUNCTION__, (obj)) \
128 : VK_FALSE
Ian Elliott0b4d6242015-09-22 10:51:24 -0600129
130// NOTE: The following struct's/typedef's are for keeping track of
131// info that is used for validating the WSI extensions.
132
133// Forward declarations:
134struct _SwpInstance;
Ian Elliott1f6bb802016-01-20 16:33:34 -0700135struct _SwpSurface;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600136struct _SwpPhysicalDevice;
137struct _SwpDevice;
138struct _SwpSwapchain;
139struct _SwpImage;
Ian Elliottc4db6952016-01-21 14:29:45 -0700140struct _SwpQueue;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600141
142typedef _SwpInstance SwpInstance;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700143typedef _SwpSurface SwpSurface;
144;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600145typedef _SwpPhysicalDevice SwpPhysicalDevice;
146typedef _SwpDevice SwpDevice;
147typedef _SwpSwapchain SwpSwapchain;
148typedef _SwpImage SwpImage;
Ian Elliottc4db6952016-01-21 14:29:45 -0700149typedef _SwpQueue SwpQueue;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600150
151// Create one of these for each VkInstance:
152struct _SwpInstance {
153 // The actual handle for this VkInstance:
154 VkInstance instance;
155
Ian Elliott1f6bb802016-01-20 16:33:34 -0700156 // Remember the VkSurfaceKHR's that are created for this VkInstance:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700157 unordered_map<VkSurfaceKHR, SwpSurface *> surfaces;
Ian Elliott1f6bb802016-01-20 16:33:34 -0700158
Ian Elliott0b4d6242015-09-22 10:51:24 -0600159 // When vkEnumeratePhysicalDevices is called, the VkPhysicalDevice's are
160 // remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700161 unordered_map<const void *, SwpPhysicalDevice *> physicalDevices;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600162
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700163 // Set to true if VK_KHR_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott1cb77a62015-12-29 16:44:39 -0700164 bool surfaceExtensionEnabled;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600165
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700166// TODO: Add additional booleans for platform-specific extensions:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700167#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700168 // Set to true if VK_KHR_ANDROID_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700169 bool androidSurfaceExtensionEnabled;
170#endif // VK_USE_PLATFORM_ANDROID_KHR
171#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700172 // Set to true if VK_KHR_MIR_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700173 bool mirSurfaceExtensionEnabled;
174#endif // VK_USE_PLATFORM_MIR_KHR
175#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700176 // Set to true if VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700177 bool waylandSurfaceExtensionEnabled;
178#endif // VK_USE_PLATFORM_WAYLAND_KHR
179#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700180 // Set to true if VK_KHR_WIN32_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700181 bool win32SurfaceExtensionEnabled;
182#endif // VK_USE_PLATFORM_WIN32_KHR
183#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700184 // Set to true if VK_KHR_XCB_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700185 bool xcbSurfaceExtensionEnabled;
186#endif // VK_USE_PLATFORM_XCB_KHR
187#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700188 // Set to true if VK_KHR_XLIB_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700189 bool xlibSurfaceExtensionEnabled;
190#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott0b4d6242015-09-22 10:51:24 -0600191};
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700192
Ian Elliott1f6bb802016-01-20 16:33:34 -0700193// Create one of these for each VkSurfaceKHR:
194struct _SwpSurface {
195 // The actual handle for this VkSurfaceKHR:
196 VkSurfaceKHR surface;
197
198 // VkInstance that this VkSurfaceKHR is associated with:
199 SwpInstance *pInstance;
200
201 // When vkCreateSwapchainKHR is called, the VkSwapchainKHR's are
202 // remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700203 unordered_map<VkSwapchainKHR, SwpSwapchain *> swapchains;
Ian Elliott680825b2016-01-21 12:42:19 -0700204
205 // 'true' if pAllocator was non-NULL when vkCreate*SurfaceKHR was called:
206 bool usedAllocatorToCreate;
Ian Elliottc4db6952016-01-21 14:29:45 -0700207
208 // Value of pQueueFamilyPropertyCount that was returned by the
209 // vkGetPhysicalDeviceQueueFamilyProperties() function:
210 uint32_t numQueueFamilyIndexSupport;
211 // Array of VkBool32's that is intialized by the
212 // vkGetPhysicalDeviceSurfaceSupportKHR() function. First call for a given
213 // surface allocates and initializes this array to false for all
214 // queueFamilyIndex's (and sets numQueueFamilyIndexSupport to non-zero).
215 // All calls set the entry for a given queueFamilyIndex:
216 VkBool32 *pQueueFamilyIndexSupport;
Ian Elliott1f6bb802016-01-20 16:33:34 -0700217};
Ian Elliott0b4d6242015-09-22 10:51:24 -0600218
219// Create one of these for each VkPhysicalDevice within a VkInstance:
220struct _SwpPhysicalDevice {
221 // The actual handle for this VkPhysicalDevice:
222 VkPhysicalDevice physicalDevice;
223
224 // Corresponding VkDevice (and info) to this VkPhysicalDevice:
225 SwpDevice *pDevice;
226
227 // VkInstance that this VkPhysicalDevice is associated with:
228 SwpInstance *pInstance;
229
Ian Elliottaeafe232016-01-20 10:50:33 -0700230 // Records results of vkGetPhysicalDeviceQueueFamilyProperties()'s
Ian Elliottc4db6952016-01-21 14:29:45 -0700231 // numOfQueueFamilies parameter when pQueueFamilyProperties is NULL:
Ian Elliottaeafe232016-01-20 10:50:33 -0700232 bool gotQueueFamilyPropertyCount;
Ian Elliottc4db6952016-01-21 14:29:45 -0700233 uint32_t numOfQueueFamilies;
Ian Elliottaeafe232016-01-20 10:50:33 -0700234
Ian Elliottc4db6952016-01-21 14:29:45 -0700235 // Record all surfaces that vkGetPhysicalDeviceSurfaceSupportKHR() was
236 // called for:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 unordered_map<VkSurfaceKHR, SwpSurface *> supportedSurfaces;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600238
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700239 // TODO: Record/use this info per-surface, not per-device, once a
240 // non-dispatchable surface object is added to WSI:
Ian Elliott1dcd1092015-11-17 17:29:40 -0700241 // Results of vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
Ian Elliott27d39c72015-11-20 16:39:34 -0700242 bool gotSurfaceCapabilities;
243 VkSurfaceCapabilitiesKHR surfaceCapabilities;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600244
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700245 // TODO: Record/use this info per-surface, not per-device, once a
246 // non-dispatchable surface object is added to WSI:
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700247 // Count and VkSurfaceFormatKHR's returned by vkGetPhysicalDeviceSurfaceFormatsKHR():
Ian Elliott0b4d6242015-09-22 10:51:24 -0600248 uint32_t surfaceFormatCount;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700249 VkSurfaceFormatKHR *pSurfaceFormats;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600250
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700251 // TODO: Record/use this info per-surface, not per-device, once a
252 // non-dispatchable surface object is added to WSI:
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700253 // Count and VkPresentModeKHR's returned by vkGetPhysicalDeviceSurfacePresentModesKHR():
Ian Elliott0b4d6242015-09-22 10:51:24 -0600254 uint32_t presentModeCount;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700255 VkPresentModeKHR *pPresentModes;
Ian Elliott27d39c72015-11-20 16:39:34 -0700256};
257
258// Create one of these for each VkDevice within a VkInstance:
259struct _SwpDevice {
260 // The actual handle for this VkDevice:
261 VkDevice device;
262
263 // Corresponding VkPhysicalDevice (and info) to this VkDevice:
264 SwpPhysicalDevice *pPhysicalDevice;
265
266 // Set to true if VK_KHR_SWAPCHAIN_EXTENSION_NAME was enabled:
Ian Elliott427058f2015-12-29 16:45:49 -0700267 bool swapchainExtensionEnabled;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600268
269 // When vkCreateSwapchainKHR is called, the VkSwapchainKHR's are
270 // remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700271 unordered_map<VkSwapchainKHR, SwpSwapchain *> swapchains;
Ian Elliottc4db6952016-01-21 14:29:45 -0700272
273 // When vkGetDeviceQueue is called, the VkQueue's are remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700274 unordered_map<VkQueue, SwpQueue *> queues;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600275};
276
277// Create one of these for each VkImage within a VkSwapchainKHR:
278struct _SwpImage {
279 // The actual handle for this VkImage:
280 VkImage image;
281
282 // Corresponding VkSwapchainKHR (and info) to this VkImage:
283 SwpSwapchain *pSwapchain;
284
Ian Elliotta5d13a92016-04-07 09:05:45 -0600285 // true if application acquired this image from vkAcquireNextImageKHR(),
286 // and hasn't yet called vkQueuePresentKHR() for it; otherwise false:
287 bool acquiredByApp;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600288};
289
290// Create one of these for each VkSwapchainKHR within a VkDevice:
291struct _SwpSwapchain {
292 // The actual handle for this VkSwapchainKHR:
293 VkSwapchainKHR swapchain;
294
295 // Corresponding VkDevice (and info) to this VkSwapchainKHR:
296 SwpDevice *pDevice;
297
Ian Elliottf7f8ff02015-12-30 14:55:41 -0700298 // Corresponding VkSurfaceKHR to this VkSwapchainKHR:
Ian Elliott1f6bb802016-01-20 16:33:34 -0700299 SwpSurface *pSurface;
Ian Elliottf7f8ff02015-12-30 14:55:41 -0700300
Ian Elliott0b4d6242015-09-22 10:51:24 -0600301 // When vkGetSwapchainImagesKHR is called, the VkImage's are
302 // remembered:
303 uint32_t imageCount;
304 unordered_map<int, SwpImage> images;
Ian Elliott680825b2016-01-21 12:42:19 -0700305
306 // 'true' if pAllocator was non-NULL when vkCreateSwapchainKHR was called:
307 bool usedAllocatorToCreate;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600308};
309
Ian Elliottc4db6952016-01-21 14:29:45 -0700310// Create one of these for each VkQueue within a VkDevice:
311struct _SwpQueue {
312 // The actual handle for this VkQueue:
313 VkQueue queue;
314
315 // Corresponding VkDevice (and info) to this VkSwapchainKHR:
316 SwpDevice *pDevice;
317
318 // Which queueFamilyIndex this VkQueue is associated with:
319 uint32_t queueFamilyIndex;
320};
321
Tobin Ehlis711ff312015-10-29 12:58:13 -0600322struct layer_data {
323 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700324 std::vector<VkDebugReportCallbackEXT> logging_callback;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700325 VkLayerDispatchTable *device_dispatch_table;
326 VkLayerInstanceDispatchTable *instance_dispatch_table;
Ian Elliotted6b5ac2016-04-28 09:08:13 -0600327
328 // The following are for keeping track of the temporary callbacks that can
329 // be used in vkCreateInstance and vkDestroyInstance:
330 uint32_t num_tmp_callbacks;
331 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
332 VkDebugReportCallbackEXT *tmp_callbacks;
333
Tobin Ehlis711ff312015-10-29 12:58:13 -0600334 // NOTE: The following are for keeping track of info that is used for
335 // validating the WSI extensions.
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700336 std::unordered_map<void *, SwpInstance> instanceMap;
337 std::unordered_map<VkSurfaceKHR, SwpSurface> surfaceMap;
Tobin Ehlis711ff312015-10-29 12:58:13 -0600338 std::unordered_map<void *, SwpPhysicalDevice> physicalDeviceMap;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700339 std::unordered_map<void *, SwpDevice> deviceMap;
340 std::unordered_map<VkSwapchainKHR, SwpSwapchain> swapchainMap;
341 std::unordered_map<void *, SwpQueue> queueMap;
Tobin Ehlis711ff312015-10-29 12:58:13 -0600342
Ian Elliotted6b5ac2016-04-28 09:08:13 -0600343 layer_data()
344 : report_data(nullptr), device_dispatch_table(nullptr), instance_dispatch_table(nullptr), num_tmp_callbacks(0),
345 tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr){};
Tobin Ehlis711ff312015-10-29 12:58:13 -0600346};
347
Ian Elliott0b4d6242015-09-22 10:51:24 -0600348#endif // SWAPCHAIN_H