blob: 9ca095b76657e2e9bf1fce6b315da59cf5527fc1 [file] [log] [blame]
Peter Lohrmannc8094e92015-03-24 16:14:01 -07001/*
2 * GLAVE & vulkan
3 *
4 * Copyright (C) 2015 LunarG, Inc. and Valve Corporation
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
Courtney Goeltzenleuchtera8c06282015-04-14 14:55:44 -060025#include "vkLayer.h"
Peter Lohrmannff6dd1e2015-03-24 17:15:03 -070026
27// Glave Snapshot ERROR codes
28typedef enum _GLAVE_SNAPSHOT_ERROR
Peter Lohrmannc8094e92015-03-24 16:14:01 -070029{
Peter Lohrmannff6dd1e2015-03-24 17:15:03 -070030 GLVSNAPSHOT_NONE, // Used for INFO & other non-error messages
31 GLVSNAPSHOT_UNKNOWN_OBJECT, // Updating uses of object that's not in global object list
32 GLVSNAPSHOT_INTERNAL_ERROR, // Bug with data tracking within the layer
33 GLVSNAPSHOT_DESTROY_OBJECT_FAILED, // Couldn't find object to be destroyed
34 GLVSNAPSHOT_MISSING_OBJECT, // Attempted look-up on object that isn't in global object list
35 GLVSNAPSHOT_OBJECT_LEAK, // OBJECT was not correctly freed/destroyed
36 GLVSNAPSHOT_OBJCOUNT_MAX_EXCEEDED, // Request for Object data in excess of max obj count
37 GLVSNAPSHOT_INVALID_FENCE, // Requested status of unsubmitted fence object
38 GLVSNAPSHOT_VIEWPORT_NOT_BOUND, // Draw submitted with no viewport state object bound
39 GLVSNAPSHOT_RASTER_NOT_BOUND, // Draw submitted with no raster state object bound
40 GLVSNAPSHOT_COLOR_BLEND_NOT_BOUND, // Draw submitted with no color blend state object bound
41 GLVSNAPSHOT_DEPTH_STENCIL_NOT_BOUND, // Draw submitted with no depth-stencil state object bound
42 GLVSNAPSHOT_GPU_MEM_MAPPED, // Mem object ref'd in cmd buff is still mapped
43 GLVSNAPSHOT_GETGPUINFO_NOT_CALLED, // Gpu Information has not been requested before drawing
44 GLVSNAPSHOT_MEMREFCOUNT_MAX_EXCEEDED, // Number of QueueSubmit memory references exceeds GPU maximum
Peter Lohrmann143760f2015-03-25 10:35:03 -070045 GLVSNAPSHOT_SNAPSHOT_DATA, // Message being printed is actually snapshot data
Peter Lohrmannff6dd1e2015-03-24 17:15:03 -070046} GLAVE_SNAPSHOT_ERROR;
Peter Lohrmannc8094e92015-03-24 16:14:01 -070047
48// Object Status -- used to track state of individual objects
49typedef enum _OBJECT_STATUS
50{
51 OBJSTATUS_NONE = 0x00000000, // No status is set
52 OBJSTATUS_FENCE_IS_SUBMITTED = 0x00000001, // Fence has been submitted
53 OBJSTATUS_VIEWPORT_BOUND = 0x00000002, // Viewport state object has been bound
54 OBJSTATUS_RASTER_BOUND = 0x00000004, // Viewport state object has been bound
55 OBJSTATUS_COLOR_BLEND_BOUND = 0x00000008, // Viewport state object has been bound
56 OBJSTATUS_DEPTH_STENCIL_BOUND = 0x00000010, // Viewport state object has been bound
57 OBJSTATUS_GPU_MEM_MAPPED = 0x00000020, // Memory object is currently mapped
58} OBJECT_STATUS;
Peter Lohrmannff6dd1e2015-03-24 17:15:03 -070059
Peter Lohrmannc8094e92015-03-24 16:14:01 -070060// Object type enum
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060061typedef enum _VK_OBJECT_TYPE
Peter Lohrmannc8094e92015-03-24 16:14:01 -070062{
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060063 VK_OBJECT_TYPE_UNKNOWN,
64 VK_OBJECT_TYPE_SAMPLER,
65 VK_OBJECT_TYPE_DYNAMIC_DS_STATE_OBJECT,
66 VK_OBJECT_TYPE_DESCRIPTOR_SET,
67 VK_OBJECT_TYPE_DESCRIPTOR_POOL,
68 VK_OBJECT_TYPE_DYNAMIC_CB_STATE_OBJECT,
69 VK_OBJECT_TYPE_IMAGE_VIEW,
70 VK_OBJECT_TYPE_QUEUE_SEMAPHORE,
71 VK_OBJECT_TYPE_SHADER,
72 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
73 VK_OBJECT_TYPE_BUFFER,
74 VK_OBJECT_TYPE_PIPELINE,
75 VK_OBJECT_TYPE_DEVICE,
76 VK_OBJECT_TYPE_QUERY_POOL,
77 VK_OBJECT_TYPE_EVENT,
78 VK_OBJECT_TYPE_QUEUE,
79 VK_OBJECT_TYPE_PHYSICAL_GPU,
80 VK_OBJECT_TYPE_RENDER_PASS,
81 VK_OBJECT_TYPE_FRAMEBUFFER,
82 VK_OBJECT_TYPE_IMAGE,
83 VK_OBJECT_TYPE_BUFFER_VIEW,
84 VK_OBJECT_TYPE_DEPTH_STENCIL_VIEW,
85 VK_OBJECT_TYPE_INSTANCE,
86 VK_OBJECT_TYPE_PIPELINE_DELTA,
87 VK_OBJECT_TYPE_DYNAMIC_VP_STATE_OBJECT,
88 VK_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW,
89 VK_OBJECT_TYPE_GPU_MEMORY,
90 VK_OBJECT_TYPE_DYNAMIC_RS_STATE_OBJECT,
91 VK_OBJECT_TYPE_FENCE,
92 VK_OBJECT_TYPE_CMD_BUFFER,
Chia-I Wu5b66aa52015-04-16 22:02:10 +080093
94 VK_OBJECT_TYPE_DISPLAY_WSI,
95 VK_OBJECT_TYPE_SWAP_CHAIN_WSI,
96 VK_OBJECT_TYPE_SWAP_CHAIN_IMAGE_WSI,
97 VK_OBJECT_TYPE_SWAP_CHAIN_MEMORY_WSI,
Peter Lohrmannc8094e92015-03-24 16:14:01 -070098
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060099 VK_NUM_OBJECT_TYPE,
100 VK_OBJECT_TYPE_ANY, // Allow global object list to be queried/retrieved
101} VK_OBJECT_TYPE;
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700102
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600103static const char* string_VK_OBJECT_TYPE(VK_OBJECT_TYPE type) {
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700104 switch (type)
105 {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600106 case VK_OBJECT_TYPE_DEVICE:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700107 return "DEVICE";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600108 case VK_OBJECT_TYPE_PIPELINE:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700109 return "PIPELINE";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600110 case VK_OBJECT_TYPE_FENCE:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700111 return "FENCE";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600112 case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700113 return "DESCRIPTOR_SET_LAYOUT";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600114 case VK_OBJECT_TYPE_GPU_MEMORY:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700115 return "GPU_MEMORY";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600116 case VK_OBJECT_TYPE_QUEUE:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700117 return "QUEUE";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600118 case VK_OBJECT_TYPE_IMAGE:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700119 return "IMAGE";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600120 case VK_OBJECT_TYPE_CMD_BUFFER:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700121 return "CMD_BUFFER";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600122 case VK_OBJECT_TYPE_QUEUE_SEMAPHORE:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700123 return "QUEUE_SEMAPHORE";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600124 case VK_OBJECT_TYPE_FRAMEBUFFER:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700125 return "FRAMEBUFFER";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600126 case VK_OBJECT_TYPE_SAMPLER:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700127 return "SAMPLER";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600128 case VK_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700129 return "COLOR_ATTACHMENT_VIEW";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600130 case VK_OBJECT_TYPE_BUFFER_VIEW:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700131 return "BUFFER_VIEW";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600132 case VK_OBJECT_TYPE_DESCRIPTOR_SET:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700133 return "DESCRIPTOR_SET";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600134 case VK_OBJECT_TYPE_PHYSICAL_GPU:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700135 return "PHYSICAL_GPU";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600136 case VK_OBJECT_TYPE_IMAGE_VIEW:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700137 return "IMAGE_VIEW";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600138 case VK_OBJECT_TYPE_BUFFER:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700139 return "BUFFER";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600140 case VK_OBJECT_TYPE_PIPELINE_DELTA:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700141 return "PIPELINE_DELTA";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600142 case VK_OBJECT_TYPE_DYNAMIC_RS_STATE_OBJECT:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700143 return "DYNAMIC_RS_STATE_OBJECT";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600144 case VK_OBJECT_TYPE_EVENT:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700145 return "EVENT";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600146 case VK_OBJECT_TYPE_DEPTH_STENCIL_VIEW:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700147 return "DEPTH_STENCIL_VIEW";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600148 case VK_OBJECT_TYPE_SHADER:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700149 return "SHADER";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600150 case VK_OBJECT_TYPE_DYNAMIC_DS_STATE_OBJECT:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700151 return "DYNAMIC_DS_STATE_OBJECT";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600152 case VK_OBJECT_TYPE_DYNAMIC_VP_STATE_OBJECT:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700153 return "DYNAMIC_VP_STATE_OBJECT";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600154 case VK_OBJECT_TYPE_DYNAMIC_CB_STATE_OBJECT:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700155 return "DYNAMIC_CB_STATE_OBJECT";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600156 case VK_OBJECT_TYPE_INSTANCE:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700157 return "INSTANCE";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600158 case VK_OBJECT_TYPE_RENDER_PASS:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700159 return "RENDER_PASS";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600160 case VK_OBJECT_TYPE_QUERY_POOL:
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700161 return "QUERY_POOL";
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600162 case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
Jon Ashburnba8ccb62015-04-01 13:30:06 -0600163 return "DESCRIPTOR_POOL";
Chia-I Wu5b66aa52015-04-16 22:02:10 +0800164 case VK_OBJECT_TYPE_DISPLAY_WSI:
165 return "DISPLAY_WSI";
166 case VK_OBJECT_TYPE_SWAP_CHAIN_WSI:
167 return "SWAP_CHAIN_WSI";
168 case VK_OBJECT_TYPE_SWAP_CHAIN_IMAGE_WSI:
169 return "SWAP_CHAIN_IMAGE_WSI";
170 case VK_OBJECT_TYPE_SWAP_CHAIN_MEMORY_WSI:
171 return "SWAP_CHAIN_MEMORY_WSI";
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700172 default:
173 return "UNKNOWN";
174 }
175}
176
Peter Lohrmann7494f892015-04-01 13:54:18 -0700177//=============================================================================
178// Helper structure for a GLAVE vulkan snapshot.
179// These can probably be auto-generated at some point.
180//=============================================================================
181
182void glv_vk_malloc_and_copy(void** ppDest, size_t size, const void* pSrc);
183
184typedef struct _GLV_VK_SNAPSHOT_CREATEDEVICE_PARAMS
185{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600186 VkPhysicalGpu gpu;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600187 VkDeviceCreateInfo* pCreateInfo;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600188 VkDevice* pDevice;
Peter Lohrmann7494f892015-04-01 13:54:18 -0700189} GLV_VK_SNAPSHOT_CREATEDEVICE_PARAMS;
190
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600191VkDeviceCreateInfo* glv_deepcopy_xgl_device_create_info(const VkDeviceCreateInfo* pSrcCreateInfo);void glv_deepfree_xgl_device_create_info(VkDeviceCreateInfo* pCreateInfo);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600192void glv_vk_snapshot_copy_createdevice_params(GLV_VK_SNAPSHOT_CREATEDEVICE_PARAMS* pDest, VkPhysicalGpu gpu, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice);
Peter Lohrmann7494f892015-04-01 13:54:18 -0700193void glv_vk_snapshot_destroy_createdevice_params(GLV_VK_SNAPSHOT_CREATEDEVICE_PARAMS* pSrc);
194
195//=============================================================================
196// Glave Snapshot helper structs
197//=============================================================================
198
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700199// Node that stores information about an object
200typedef struct _GLV_VK_SNAPSHOT_OBJECT_NODE {
Peter Lohrmannc5425bb2015-03-30 12:58:50 -0700201 void* pVkObject;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600202 VK_OBJECT_TYPE objType;
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700203 uint64_t numUses;
204 OBJECT_STATUS status;
Peter Lohrmannc5425bb2015-03-30 12:58:50 -0700205 void* pStruct; //< optionally points to a device-specific struct (ie, GLV_VK_SNAPSHOT_DEVICE_NODE)
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700206} GLV_VK_SNAPSHOT_OBJECT_NODE;
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700207
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600208// Node that stores information about an VkDevice
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700209typedef struct _GLV_VK_SNAPSHOT_DEVICE_NODE {
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700210 // This object
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600211 VkDevice device;
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700212
213 // CreateDevice parameters
Peter Lohrmann7494f892015-04-01 13:54:18 -0700214 GLV_VK_SNAPSHOT_CREATEDEVICE_PARAMS params;
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700215
216 // Other information a device needs to store.
217 // TODO: anything?
218} GLV_VK_SNAPSHOT_DEVICE_NODE;
219
220// Linked-List node that stores information about an object
221// We maintain a "Global" list which links every object and a
222// per-Object list which just links objects of a given type
223// The object node has both pointers so the actual nodes are shared between the two lists
224typedef struct _GLV_VK_SNAPSHOT_LL_NODE {
225 struct _GLV_VK_SNAPSHOT_LL_NODE *pNextObj;
226 struct _GLV_VK_SNAPSHOT_LL_NODE *pNextGlobal;
227 GLV_VK_SNAPSHOT_OBJECT_NODE obj;
228} GLV_VK_SNAPSHOT_LL_NODE;
229
Peter Lohrmannc5425bb2015-03-30 12:58:50 -0700230// Linked-List node to identify an object that has been deleted,
231// but the delta snapshot never saw it get created.
232typedef struct _GLV_VK_SNAPSHOT_DELETED_OBJ_NODE {
233 struct _GLV_VK_SNAPSHOT_DELETED_OBJ_NODE* pNextObj;
234 void* pVkObject;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600235 VK_OBJECT_TYPE objType;
Peter Lohrmannc5425bb2015-03-30 12:58:50 -0700236} GLV_VK_SNAPSHOT_DELETED_OBJ_NODE;
237
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700238//=============================================================================
239// Main structure for a GLAVE vulkan snapshot.
240//=============================================================================
241typedef struct _GLV_VK_SNAPSHOT {
242 // Stores a list of all the objects known by this snapshot.
243 // This may be used as a shortcut to more easily find objects.
244 uint64_t globalObjCount;
245 GLV_VK_SNAPSHOT_LL_NODE* pGlobalObjs;
246
247 // TEMPORARY: Keep track of all objects of each type
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600248 uint64_t numObjs[VK_NUM_OBJECT_TYPE];
249 GLV_VK_SNAPSHOT_LL_NODE *pObjectHead[VK_NUM_OBJECT_TYPE];
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700250
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700251 // List of created devices and [potentially] hierarchical tree of the objects on it.
252 // This is used to represent ownership of the objects
253 uint64_t deviceCount;
Peter Lohrmannc5425bb2015-03-30 12:58:50 -0700254 GLV_VK_SNAPSHOT_LL_NODE* pDevices;
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700255
256 // This is used to support snapshot deltas.
257 uint64_t deltaDeletedObjectCount;
Peter Lohrmannc5425bb2015-03-30 12:58:50 -0700258 GLV_VK_SNAPSHOT_DELETED_OBJ_NODE* pDeltaDeletedObjects;
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700259} GLV_VK_SNAPSHOT;
260
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700261//=============================================================================
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700262// prototype for extension functions
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700263//=============================================================================
264// The snapshot functionality should work similar to a stopwatch.
265// 1) 'StartTracking()' is like starting the stopwatch. This causes the snapshot
266// to start tracking the creation of objects and state. In general, this
267// should happen at the very beginning, to track all objects. During this
268// tracking time, all creations and deletions are tracked on the
269// 'deltaSnapshot'.
270// NOTE: This entrypoint currently does nothing, as tracking is implied
271// by enabling the layer.
272// 2) 'GetDelta()' is analogous to looking at the stopwatch and seeing the
273// current lap time - A copy of the 'deltaSnapshot' will be returned to the
274// caller, but nothings changes within the snapshot layer. All creations
275// and deletions continue to be applied to the 'deltaSnapshot'.
276// NOTE: This will involve a deep copy of the delta, so there may be a
277// performance hit.
278// 3) 'GetSnapshot()' is similar to hitting the 'Lap' button on a stopwatch.
279// The 'deltaSnapshot' is merged into the 'masterSnapshot', the 'deltaSnapshot'
280// is cleared, and the 'masterSnapshot' is returned. All creations and
281// deletions continue to be applied to the 'deltaSnapshot'.
282// NOTE: This will involve a deep copy of the snapshot, so there may be a
283// performance hit.
284// 4) 'PrintDelta()' will cause the delta to be output by the layer's msgCallback.
285// 5) Steps 2, 3, and 4 can happen as often as needed.
286// 6) 'StopTracking()' is like stopping the stopwatch.
287// NOTE: This entrypoint currently does nothing, as tracking is implied
288// by disabling the layer.
289// 7) 'Clear()' will clear the 'deltaSnapshot' and the 'masterSnapshot'.
290//=============================================================================
291
292void glvSnapshotStartTracking(void);
293GLV_VK_SNAPSHOT glvSnapshotGetDelta(void);
294GLV_VK_SNAPSHOT glvSnapshotGetSnapshot(void);
295void glvSnapshotPrintDelta(void);
296void glvSnapshotStopTracking(void);
297void glvSnapshotClear(void);
298
299// utility
300// merge a delta into a snapshot and return the updated snapshot
301GLV_VK_SNAPSHOT glvSnapshotMerge(const GLV_VK_SNAPSHOT * const pDelta, const GLV_VK_SNAPSHOT * const pSnapshot);
302
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600303uint64_t glvSnapshotGetObjectCount(VK_OBJECT_TYPE type);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600304VkResult glvSnapshotGetObjects(VK_OBJECT_TYPE type, uint64_t objCount, GLV_VK_SNAPSHOT_OBJECT_NODE* pObjNodeArray);
Peter Lohrmannff6dd1e2015-03-24 17:15:03 -0700305void glvSnapshotPrintObjects(void);
Peter Lohrmannc8094e92015-03-24 16:14:01 -0700306
307// Func ptr typedefs
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600308typedef uint64_t (*GLVSNAPSHOT_GET_OBJECT_COUNT)(VK_OBJECT_TYPE);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600309typedef VkResult (*GLVSNAPSHOT_GET_OBJECTS)(VK_OBJECT_TYPE, uint64_t, GLV_VK_SNAPSHOT_OBJECT_NODE*);
Peter Lohrmannff6dd1e2015-03-24 17:15:03 -0700310typedef void (*GLVSNAPSHOT_PRINT_OBJECTS)(void);
Peter Lohrmann4f19d972015-03-26 20:38:12 -0700311typedef void (*GLVSNAPSHOT_START_TRACKING)(void);
312typedef GLV_VK_SNAPSHOT (*GLVSNAPSHOT_GET_DELTA)(void);
313typedef GLV_VK_SNAPSHOT (*GLVSNAPSHOT_GET_SNAPSHOT)(void);
314typedef void (*GLVSNAPSHOT_PRINT_DELTA)(void);
315typedef void (*GLVSNAPSHOT_STOP_TRACKING)(void);
316typedef void (*GLVSNAPSHOT_CLEAR)(void);