1 /* Copyright (c) 2015-2016 The Khronos Group Inc.
2  * Copyright (c) 2015-2016 Valve Corporation
3  * Copyright (c) 2015-2016 LunarG, Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and/or associated documentation files (the "Materials"), to
7  * deal in the Materials without restriction, including without limitation the
8  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9  * sell copies of the Materials, and to permit persons to whom the Materials
10  * are furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice(s) and this permission notice shall be included
13  * in all copies or substantial portions of the Materials.
14  *
15  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  *
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
22  * USE OR OTHER DEALINGS IN THE MATERIALS
23  *
24  * Author: Tobin Ehlis <tobin@lunarg.com>
25  * Author: Mark Lobodzinski <mark@lunarg.com>
26  */
27 
28 #include "vulkan/vk_layer.h"
29 #include <vector>
30 
31 using namespace std;
32 
33 // Device Limits ERROR codes
34 typedef enum _DEV_LIMITS_ERROR {
35     DEVLIMITS_NONE,                          // Used for INFO & other non-error messages
36     DEVLIMITS_INVALID_INSTANCE,              // Invalid instance used
37     DEVLIMITS_INVALID_PHYSICAL_DEVICE,       // Invalid physical device used
38     DEVLIMITS_INVALID_INHERITED_QUERY,       // Invalid use of inherited query
39     DEVLIMITS_MUST_QUERY_COUNT,              // Failed to make initial call to an API to query the count
40     DEVLIMITS_MUST_QUERY_PROPERTIES,         // Failed to make initial call to an API to query properties
41     DEVLIMITS_INVALID_CALL_SEQUENCE,         // Flag generic case of an invalid call sequence by the app
42     DEVLIMITS_INVALID_FEATURE_REQUESTED,     // App requested a feature not supported by physical device
43     DEVLIMITS_COUNT_MISMATCH,                // App requesting a count value different than actual value
44     DEVLIMITS_INVALID_QUEUE_CREATE_REQUEST,  // Invalid queue requested based on queue family properties
45     DEVLIMITS_LIMITS_VIOLATION,              // Driver-specified limits/properties were exceeded
46     DEVLIMITS_INVALID_UNIFORM_BUFFER_OFFSET, // Uniform buffer offset violates device limit granularity
47     DEVLIMITS_INVALID_STORAGE_BUFFER_OFFSET, // Storage buffer offset violates device limit granularity
48 } DEV_LIMITS_ERROR;
49 
50 typedef enum _CALL_STATE {
51     UNCALLED,      // Function has not been called
52     QUERY_COUNT,   // Function called once to query a count
53     QUERY_DETAILS, // Function called w/ a count to query details
54 } CALL_STATE;
55 
56 typedef struct _INSTANCE_STATE {
57     // Track the call state and array size for physical devices
58     CALL_STATE vkEnumeratePhysicalDevicesState;
59     uint32_t physicalDevicesCount;
_INSTANCE_STATE_INSTANCE_STATE60     _INSTANCE_STATE() : vkEnumeratePhysicalDevicesState(UNCALLED), physicalDevicesCount(0){};
61 } INSTANCE_STATE;
62 
63 typedef struct _PHYSICAL_DEVICE_STATE {
64     // Track the call state and array sizes for various query functions
65     CALL_STATE vkGetPhysicalDeviceQueueFamilyPropertiesState;
66     uint32_t queueFamilyPropertiesCount;
67     CALL_STATE vkGetPhysicalDeviceLayerPropertiesState;
68     uint32_t deviceLayerCount;
69     CALL_STATE vkGetPhysicalDeviceExtensionPropertiesState;
70     uint32_t deviceExtensionCount;
71     CALL_STATE vkGetPhysicalDeviceFeaturesState;
_PHYSICAL_DEVICE_STATE_PHYSICAL_DEVICE_STATE72     _PHYSICAL_DEVICE_STATE()
73         : vkGetPhysicalDeviceQueueFamilyPropertiesState(UNCALLED), queueFamilyPropertiesCount(0),
74           vkGetPhysicalDeviceLayerPropertiesState(UNCALLED), deviceLayerCount(0),
75           vkGetPhysicalDeviceExtensionPropertiesState(UNCALLED), deviceExtensionCount(0),
76           vkGetPhysicalDeviceFeaturesState(UNCALLED){};
77 } PHYSICAL_DEVICE_STATE;
78