blob: acbdaf48a9db9bbdb522471cbd76f3e9a22e8d8f [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)
Ian Elliottfdf3ffa2016-05-05 14:06:53 -060064 SWAPCHAIN_PRIOR_COUNT, // Query must be called first to get value of pCount, then called second time
Jon Ashburn5484e0c2016-03-08 17:48:44 -070065 SWAPCHAIN_INVALID_COUNT, // Second time a query called, the pCount value didn't match first time
66 SWAPCHAIN_WRONG_STYPE, // The sType for a struct has the wrong value
67 SWAPCHAIN_WRONG_NEXT, // The pNext for a struct is not NULL
68 SWAPCHAIN_ZERO_VALUE, // A value should be non-zero
69 SWAPCHAIN_INCOMPATIBLE_ALLOCATOR, // pAllocator must be compatible (i.e. NULL or not) when object is created and destroyed
70 SWAPCHAIN_DID_NOT_QUERY_QUEUE_FAMILIES, // A function using a queueFamilyIndex was called before
71 // vkGetPhysicalDeviceQueueFamilyProperties() was called
72 SWAPCHAIN_QUEUE_FAMILY_INDEX_TOO_LARGE, // A queueFamilyIndex value is not less than pQueueFamilyPropertyCount returned by
73 // vkGetPhysicalDeviceQueueFamilyProperties()
74 SWAPCHAIN_SURFACE_NOT_SUPPORTED_WITH_QUEUE, // A surface is not supported by a given queueFamilyIndex, as seen by
75 // vkGetPhysicalDeviceSurfaceSupportKHR()
Ian Elliottfa8f0322016-03-23 08:28:54 -060076 SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, // vkAcquireNextImageKHR should be called with a valid semaphore and/or fence
Ian Elliottb0f474c2015-09-25 15:50:55 -060077} SWAPCHAIN_ERROR;
78
Ian Elliott0b4d6242015-09-22 10:51:24 -060079// The following is for logging error messages:
Ian Elliott0b4d6242015-09-22 10:51:24 -060080#define LAYER_NAME (char *) "Swapchain"
Jon Ashburn5484e0c2016-03-08 17:48:44 -070081#define LOG_ERROR_NON_VALID_OBJ(objType, type, obj) \
82 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, \
83 SWAPCHAIN_INVALID_HANDLE, LAYER_NAME, "%s() called with a non-valid %s.", __FUNCTION__, (obj)) \
84 : VK_FALSE
85#define LOG_ERROR_NULL_POINTER(objType, type, obj) \
86 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, \
87 SWAPCHAIN_NULL_POINTER, LAYER_NAME, "%s() called with NULL pointer %s.", __FUNCTION__, (obj)) \
88 : VK_FALSE
89#define LOG_ERROR_INVALID_COUNT(objType, type, obj, obj2, val, val2) \
90 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, \
91 SWAPCHAIN_INVALID_COUNT, LAYER_NAME, "%s() called with non-NULL %s, and with %s set to a " \
92 "value (%d) that is greater than the value (%d) that " \
93 "was returned when %s was NULL.", \
94 __FUNCTION__, (obj2), (obj), (val), (val2), (obj2)) \
95 : VK_FALSE
Ian Elliottfdf3ffa2016-05-05 14:06:53 -060096#define LOG_ERROR_ZERO_PRIOR_COUNT(objType, type, obj, obj2) \
97 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, \
98 SWAPCHAIN_PRIOR_COUNT, LAYER_NAME, "%s() called with non-NULL %s; but no prior " \
99 "positive value has been seen for %s.", \
100 __FUNCTION__, (obj), (obj2)) \
101 : VK_FALSE
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700102#define LOG_ERROR_WRONG_STYPE(objType, type, obj, val) \
103 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, SWAPCHAIN_WRONG_STYPE, \
104 LAYER_NAME, "%s() called with the wrong value for %s->sType " \
105 "(expected %s).", \
106 __FUNCTION__, (obj), (val)) \
107 : VK_FALSE
108#define LOG_ERROR_ZERO_VALUE(objType, type, obj) \
109 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, SWAPCHAIN_ZERO_VALUE, \
110 LAYER_NAME, "%s() called with a zero value for %s.", __FUNCTION__, (obj)) \
111 : VK_FALSE
112#define LOG_ERROR(objType, type, obj, enm, fmt, ...) \
113 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, (enm), \
114 LAYER_NAME, (fmt), __VA_ARGS__) \
115 : VK_FALSE
116#define LOG_ERROR_QUEUE_FAMILY_INDEX_TOO_LARGE(objType, type, obj, val1, val2) \
117 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (objType), (uint64_t)(obj), 0, \
118 SWAPCHAIN_QUEUE_FAMILY_INDEX_TOO_LARGE, LAYER_NAME, "%s() called with a queueFamilyIndex that is too " \
119 "large (i.e. %d). The maximum value (returned " \
120 "by vkGetPhysicalDeviceQueueFamilyProperties) is " \
121 "only %d.\n", \
122 __FUNCTION__, (val1), (val2)) \
123 : VK_FALSE
124#define LOG_PERF_WARNING(objType, type, obj, enm, fmt, ...) \
125 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, \
126 (enm), LAYER_NAME, (fmt), __VA_ARGS__) \
127 : VK_FALSE
Ian Elliottfa8f0322016-03-23 08:28:54 -0600128#define LOG_WARNING(objType, type, obj, enm, fmt, ...) \
129 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (objType), (uint64_t)(obj), __LINE__, (enm), \
130 LAYER_NAME, (fmt), __VA_ARGS__) \
131 : VK_FALSE
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700132#define LOG_INFO_WRONG_NEXT(objType, type, obj) \
133 (my_data) ? log_msg(my_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, (objType), (uint64_t)(obj), 0, \
134 SWAPCHAIN_WRONG_NEXT, LAYER_NAME, "%s() called with non-NULL value for %s->pNext.", __FUNCTION__, (obj)) \
135 : VK_FALSE
Ian Elliott0b4d6242015-09-22 10:51:24 -0600136
137// NOTE: The following struct's/typedef's are for keeping track of
138// info that is used for validating the WSI extensions.
139
140// Forward declarations:
141struct _SwpInstance;
Ian Elliott1f6bb802016-01-20 16:33:34 -0700142struct _SwpSurface;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600143struct _SwpPhysicalDevice;
144struct _SwpDevice;
145struct _SwpSwapchain;
146struct _SwpImage;
Ian Elliottc4db6952016-01-21 14:29:45 -0700147struct _SwpQueue;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600148
149typedef _SwpInstance SwpInstance;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700150typedef _SwpSurface SwpSurface;
151;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600152typedef _SwpPhysicalDevice SwpPhysicalDevice;
153typedef _SwpDevice SwpDevice;
154typedef _SwpSwapchain SwpSwapchain;
155typedef _SwpImage SwpImage;
Ian Elliottc4db6952016-01-21 14:29:45 -0700156typedef _SwpQueue SwpQueue;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600157
158// Create one of these for each VkInstance:
159struct _SwpInstance {
160 // The actual handle for this VkInstance:
161 VkInstance instance;
162
Ian Elliott1f6bb802016-01-20 16:33:34 -0700163 // Remember the VkSurfaceKHR's that are created for this VkInstance:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700164 unordered_map<VkSurfaceKHR, SwpSurface *> surfaces;
Ian Elliott1f6bb802016-01-20 16:33:34 -0700165
Ian Elliott0b4d6242015-09-22 10:51:24 -0600166 // When vkEnumeratePhysicalDevices is called, the VkPhysicalDevice's are
167 // remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700168 unordered_map<const void *, SwpPhysicalDevice *> physicalDevices;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600169
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700170 // Set to true if VK_KHR_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott1cb77a62015-12-29 16:44:39 -0700171 bool surfaceExtensionEnabled;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600172
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700173// TODO: Add additional booleans for platform-specific extensions:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700174#ifdef VK_USE_PLATFORM_ANDROID_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700175 // Set to true if VK_KHR_ANDROID_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700176 bool androidSurfaceExtensionEnabled;
177#endif // VK_USE_PLATFORM_ANDROID_KHR
178#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700179 // Set to true if VK_KHR_MIR_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700180 bool mirSurfaceExtensionEnabled;
181#endif // VK_USE_PLATFORM_MIR_KHR
182#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700183 // Set to true if VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700184 bool waylandSurfaceExtensionEnabled;
185#endif // VK_USE_PLATFORM_WAYLAND_KHR
186#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700187 // Set to true if VK_KHR_WIN32_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700188 bool win32SurfaceExtensionEnabled;
189#endif // VK_USE_PLATFORM_WIN32_KHR
190#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700191 // Set to true if VK_KHR_XCB_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700192 bool xcbSurfaceExtensionEnabled;
193#endif // VK_USE_PLATFORM_XCB_KHR
194#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700195 // Set to true if VK_KHR_XLIB_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
Ian Elliott8dffaf32016-01-04 14:10:30 -0700196 bool xlibSurfaceExtensionEnabled;
197#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott0b4d6242015-09-22 10:51:24 -0600198};
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199
Ian Elliott1f6bb802016-01-20 16:33:34 -0700200// Create one of these for each VkSurfaceKHR:
201struct _SwpSurface {
202 // The actual handle for this VkSurfaceKHR:
203 VkSurfaceKHR surface;
204
205 // VkInstance that this VkSurfaceKHR is associated with:
206 SwpInstance *pInstance;
207
208 // When vkCreateSwapchainKHR is called, the VkSwapchainKHR's are
209 // remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700210 unordered_map<VkSwapchainKHR, SwpSwapchain *> swapchains;
Ian Elliott680825b2016-01-21 12:42:19 -0700211
212 // 'true' if pAllocator was non-NULL when vkCreate*SurfaceKHR was called:
213 bool usedAllocatorToCreate;
Ian Elliottc4db6952016-01-21 14:29:45 -0700214
215 // Value of pQueueFamilyPropertyCount that was returned by the
216 // vkGetPhysicalDeviceQueueFamilyProperties() function:
217 uint32_t numQueueFamilyIndexSupport;
218 // Array of VkBool32's that is intialized by the
219 // vkGetPhysicalDeviceSurfaceSupportKHR() function. First call for a given
220 // surface allocates and initializes this array to false for all
221 // queueFamilyIndex's (and sets numQueueFamilyIndexSupport to non-zero).
222 // All calls set the entry for a given queueFamilyIndex:
223 VkBool32 *pQueueFamilyIndexSupport;
Ian Elliott1f6bb802016-01-20 16:33:34 -0700224};
Ian Elliott0b4d6242015-09-22 10:51:24 -0600225
226// Create one of these for each VkPhysicalDevice within a VkInstance:
227struct _SwpPhysicalDevice {
228 // The actual handle for this VkPhysicalDevice:
229 VkPhysicalDevice physicalDevice;
230
231 // Corresponding VkDevice (and info) to this VkPhysicalDevice:
232 SwpDevice *pDevice;
233
234 // VkInstance that this VkPhysicalDevice is associated with:
235 SwpInstance *pInstance;
236
Ian Elliottaeafe232016-01-20 10:50:33 -0700237 // Records results of vkGetPhysicalDeviceQueueFamilyProperties()'s
Ian Elliottc4db6952016-01-21 14:29:45 -0700238 // numOfQueueFamilies parameter when pQueueFamilyProperties is NULL:
Ian Elliottaeafe232016-01-20 10:50:33 -0700239 bool gotQueueFamilyPropertyCount;
Ian Elliottc4db6952016-01-21 14:29:45 -0700240 uint32_t numOfQueueFamilies;
Ian Elliottaeafe232016-01-20 10:50:33 -0700241
Ian Elliottc4db6952016-01-21 14:29:45 -0700242 // Record all surfaces that vkGetPhysicalDeviceSurfaceSupportKHR() was
243 // called for:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700244 unordered_map<VkSurfaceKHR, SwpSurface *> supportedSurfaces;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600245
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700246 // TODO: Record/use this info per-surface, not per-device, once a
247 // non-dispatchable surface object is added to WSI:
Ian Elliott1dcd1092015-11-17 17:29:40 -0700248 // Results of vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
Ian Elliott27d39c72015-11-20 16:39:34 -0700249 bool gotSurfaceCapabilities;
250 VkSurfaceCapabilitiesKHR surfaceCapabilities;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600251
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700252 // TODO: Record/use this info per-surface, not per-device, once a
253 // non-dispatchable surface object is added to WSI:
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700254 // Count and VkSurfaceFormatKHR's returned by vkGetPhysicalDeviceSurfaceFormatsKHR():
Ian Elliott0b4d6242015-09-22 10:51:24 -0600255 uint32_t surfaceFormatCount;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700256 VkSurfaceFormatKHR *pSurfaceFormats;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600257
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700258 // TODO: Record/use this info per-surface, not per-device, once a
259 // non-dispatchable surface object is added to WSI:
Mark Lobodzinski1ed594e2016-02-03 09:57:14 -0700260 // Count and VkPresentModeKHR's returned by vkGetPhysicalDeviceSurfacePresentModesKHR():
Ian Elliott0b4d6242015-09-22 10:51:24 -0600261 uint32_t presentModeCount;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700262 VkPresentModeKHR *pPresentModes;
Ian Elliott27d39c72015-11-20 16:39:34 -0700263};
264
265// Create one of these for each VkDevice within a VkInstance:
266struct _SwpDevice {
267 // The actual handle for this VkDevice:
268 VkDevice device;
269
270 // Corresponding VkPhysicalDevice (and info) to this VkDevice:
271 SwpPhysicalDevice *pPhysicalDevice;
272
273 // Set to true if VK_KHR_SWAPCHAIN_EXTENSION_NAME was enabled:
Ian Elliott427058f2015-12-29 16:45:49 -0700274 bool swapchainExtensionEnabled;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600275
276 // When vkCreateSwapchainKHR is called, the VkSwapchainKHR's are
277 // remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700278 unordered_map<VkSwapchainKHR, SwpSwapchain *> swapchains;
Ian Elliottc4db6952016-01-21 14:29:45 -0700279
280 // When vkGetDeviceQueue is called, the VkQueue's are remembered:
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700281 unordered_map<VkQueue, SwpQueue *> queues;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600282};
283
284// Create one of these for each VkImage within a VkSwapchainKHR:
285struct _SwpImage {
286 // The actual handle for this VkImage:
287 VkImage image;
288
289 // Corresponding VkSwapchainKHR (and info) to this VkImage:
290 SwpSwapchain *pSwapchain;
291
Ian Elliotta5d13a92016-04-07 09:05:45 -0600292 // true if application acquired this image from vkAcquireNextImageKHR(),
293 // and hasn't yet called vkQueuePresentKHR() for it; otherwise false:
294 bool acquiredByApp;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600295};
296
297// Create one of these for each VkSwapchainKHR within a VkDevice:
298struct _SwpSwapchain {
299 // The actual handle for this VkSwapchainKHR:
300 VkSwapchainKHR swapchain;
301
302 // Corresponding VkDevice (and info) to this VkSwapchainKHR:
303 SwpDevice *pDevice;
304
Ian Elliottf7f8ff02015-12-30 14:55:41 -0700305 // Corresponding VkSurfaceKHR to this VkSwapchainKHR:
Ian Elliott1f6bb802016-01-20 16:33:34 -0700306 SwpSurface *pSurface;
Ian Elliottf7f8ff02015-12-30 14:55:41 -0700307
Ian Elliott0b4d6242015-09-22 10:51:24 -0600308 // When vkGetSwapchainImagesKHR is called, the VkImage's are
309 // remembered:
310 uint32_t imageCount;
311 unordered_map<int, SwpImage> images;
Ian Elliott680825b2016-01-21 12:42:19 -0700312
313 // 'true' if pAllocator was non-NULL when vkCreateSwapchainKHR was called:
314 bool usedAllocatorToCreate;
Ian Elliott0b4d6242015-09-22 10:51:24 -0600315};
316
Ian Elliottc4db6952016-01-21 14:29:45 -0700317// Create one of these for each VkQueue within a VkDevice:
318struct _SwpQueue {
319 // The actual handle for this VkQueue:
320 VkQueue queue;
321
322 // Corresponding VkDevice (and info) to this VkSwapchainKHR:
323 SwpDevice *pDevice;
324
325 // Which queueFamilyIndex this VkQueue is associated with:
326 uint32_t queueFamilyIndex;
327};
328
Tobin Ehlis711ff312015-10-29 12:58:13 -0600329struct layer_data {
330 debug_report_data *report_data;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700331 std::vector<VkDebugReportCallbackEXT> logging_callback;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700332 VkLayerDispatchTable *device_dispatch_table;
333 VkLayerInstanceDispatchTable *instance_dispatch_table;
Ian Elliotted6b5ac2016-04-28 09:08:13 -0600334
335 // The following are for keeping track of the temporary callbacks that can
336 // be used in vkCreateInstance and vkDestroyInstance:
337 uint32_t num_tmp_callbacks;
338 VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
339 VkDebugReportCallbackEXT *tmp_callbacks;
340
Tobin Ehlis711ff312015-10-29 12:58:13 -0600341 // NOTE: The following are for keeping track of info that is used for
342 // validating the WSI extensions.
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700343 std::unordered_map<void *, SwpInstance> instanceMap;
344 std::unordered_map<VkSurfaceKHR, SwpSurface> surfaceMap;
Tobin Ehlis711ff312015-10-29 12:58:13 -0600345 std::unordered_map<void *, SwpPhysicalDevice> physicalDeviceMap;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700346 std::unordered_map<void *, SwpDevice> deviceMap;
347 std::unordered_map<VkSwapchainKHR, SwpSwapchain> swapchainMap;
348 std::unordered_map<void *, SwpQueue> queueMap;
Tobin Ehlis711ff312015-10-29 12:58:13 -0600349
Ian Elliotted6b5ac2016-04-28 09:08:13 -0600350 layer_data()
351 : report_data(nullptr), device_dispatch_table(nullptr), instance_dispatch_table(nullptr), num_tmp_callbacks(0),
352 tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr){};
Tobin Ehlis711ff312015-10-29 12:58:13 -0600353};
354
Ian Elliott0b4d6242015-09-22 10:51:24 -0600355#endif // SWAPCHAIN_H