1*b7893ccfSSadaf Ebrahimi /*
2*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2018 The Khronos Group Inc.
3*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2018 Valve Corporation
4*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2018 LunarG, Inc.
5*b7893ccfSSadaf Ebrahimi * Copyright (C) 2015-2018 Google Inc.
6*b7893ccfSSadaf Ebrahimi *
7*b7893ccfSSadaf Ebrahimi * Licensed under the Apache License, Version 2.0 (the "License");
8*b7893ccfSSadaf Ebrahimi * you may not use this file except in compliance with the License.
9*b7893ccfSSadaf Ebrahimi * You may obtain a copy of the License at
10*b7893ccfSSadaf Ebrahimi *
11*b7893ccfSSadaf Ebrahimi * http://www.apache.org/licenses/LICENSE-2.0
12*b7893ccfSSadaf Ebrahimi *
13*b7893ccfSSadaf Ebrahimi * Unless required by applicable law or agreed to in writing, software
14*b7893ccfSSadaf Ebrahimi * distributed under the License is distributed on an "AS IS" BASIS,
15*b7893ccfSSadaf Ebrahimi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*b7893ccfSSadaf Ebrahimi * See the License for the specific language governing permissions and
17*b7893ccfSSadaf Ebrahimi * limitations under the License.
18*b7893ccfSSadaf Ebrahimi *
19*b7893ccfSSadaf Ebrahimi * Author: Arda Coskunses <[email protected]>
20*b7893ccfSSadaf Ebrahimi * Author: Tony Barbour <[email protected]>
21*b7893ccfSSadaf Ebrahimi * Author: Mark Lobodzinski <[email protected]>
22*b7893ccfSSadaf Ebrahimi */
23*b7893ccfSSadaf Ebrahimi #include <string.h>
24*b7893ccfSSadaf Ebrahimi #include <stdlib.h>
25*b7893ccfSSadaf Ebrahimi #include <assert.h>
26*b7893ccfSSadaf Ebrahimi #include <unordered_map>
27*b7893ccfSSadaf Ebrahimi #include <mutex>
28*b7893ccfSSadaf Ebrahimi
29*b7893ccfSSadaf Ebrahimi #include "vk_layer_data.h"
30*b7893ccfSSadaf Ebrahimi #include "vk_dispatch_table_helper.h"
31*b7893ccfSSadaf Ebrahimi #include "vk_layer_utils.h"
32*b7893ccfSSadaf Ebrahimi #include "vk_lunarg_device_profile_api_layer.h"
33*b7893ccfSSadaf Ebrahimi #include "vk_device_profile_api_layer.h"
34*b7893ccfSSadaf Ebrahimi
35*b7893ccfSSadaf Ebrahimi namespace device_profile_api {
36*b7893ccfSSadaf Ebrahimi
37*b7893ccfSSadaf Ebrahimi static std::mutex global_lock;
38*b7893ccfSSadaf Ebrahimi
39*b7893ccfSSadaf Ebrahimi static uint32_t loader_layer_if_version = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
40*b7893ccfSSadaf Ebrahimi
41*b7893ccfSSadaf Ebrahimi struct layer_data {
42*b7893ccfSSadaf Ebrahimi VkInstance instance;
43*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceProperties phy_device_props;
44*b7893ccfSSadaf Ebrahimi std::unordered_map<VkFormat, VkFormatProperties, std::hash<int> > format_properties_map;
45*b7893ccfSSadaf Ebrahimi VkLayerInstanceDispatchTable dispatch_table;
46*b7893ccfSSadaf Ebrahimi };
47*b7893ccfSSadaf Ebrahimi
48*b7893ccfSSadaf Ebrahimi static std::unordered_map<void *, layer_data *> device_profile_api_dev_data_map;
49*b7893ccfSSadaf Ebrahimi
50*b7893ccfSSadaf Ebrahimi // device_profile_api Layer EXT APIs
51*b7893ccfSSadaf Ebrahimi typedef void(VKAPI_PTR *PFN_vkGetOriginalPhysicalDeviceLimitsEXT)(VkPhysicalDevice physicalDevice,
52*b7893ccfSSadaf Ebrahimi const VkPhysicalDeviceLimits *limits);
53*b7893ccfSSadaf Ebrahimi typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceLimitsEXT)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceLimits *newLimits);
54*b7893ccfSSadaf Ebrahimi typedef void(VKAPI_PTR *PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT)(VkPhysicalDevice physicalDevice, VkFormat format,
55*b7893ccfSSadaf Ebrahimi const VkFormatProperties *properties);
56*b7893ccfSSadaf Ebrahimi typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceFormatPropertiesEXT)(VkPhysicalDevice physicalDevice, VkFormat format,
57*b7893ccfSSadaf Ebrahimi const VkFormatProperties newProperties);
58*b7893ccfSSadaf Ebrahimi
GetOriginalPhysicalDeviceLimitsEXT(VkPhysicalDevice physicalDevice,VkPhysicalDeviceLimits * orgLimits)59*b7893ccfSSadaf Ebrahimi VKAPI_ATTR void VKAPI_CALL GetOriginalPhysicalDeviceLimitsEXT(VkPhysicalDevice physicalDevice, VkPhysicalDeviceLimits *orgLimits) {
60*b7893ccfSSadaf Ebrahimi std::lock_guard<std::mutex> lock(global_lock);
61*b7893ccfSSadaf Ebrahimi layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
62*b7893ccfSSadaf Ebrahimi layer_data *instance_data = GetLayerDataPtr(phy_dev_data->instance, device_profile_api_dev_data_map);
63*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceProperties props;
64*b7893ccfSSadaf Ebrahimi instance_data->dispatch_table.GetPhysicalDeviceProperties(physicalDevice, &props);
65*b7893ccfSSadaf Ebrahimi memcpy(orgLimits, &props.limits, sizeof(VkPhysicalDeviceLimits));
66*b7893ccfSSadaf Ebrahimi }
67*b7893ccfSSadaf Ebrahimi
SetPhysicalDeviceLimitsEXT(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceLimits * newLimits)68*b7893ccfSSadaf Ebrahimi VKAPI_ATTR void VKAPI_CALL SetPhysicalDeviceLimitsEXT(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceLimits *newLimits) {
69*b7893ccfSSadaf Ebrahimi std::lock_guard<std::mutex> lock(global_lock);
70*b7893ccfSSadaf Ebrahimi layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
71*b7893ccfSSadaf Ebrahimi memcpy(&(phy_dev_data->phy_device_props.limits), newLimits, sizeof(VkPhysicalDeviceLimits));
72*b7893ccfSSadaf Ebrahimi }
73*b7893ccfSSadaf Ebrahimi
GetOriginalPhysicalDeviceFormatPropertiesEXT(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties * properties)74*b7893ccfSSadaf Ebrahimi VKAPI_ATTR void VKAPI_CALL GetOriginalPhysicalDeviceFormatPropertiesEXT(VkPhysicalDevice physicalDevice, VkFormat format,
75*b7893ccfSSadaf Ebrahimi VkFormatProperties *properties) {
76*b7893ccfSSadaf Ebrahimi std::lock_guard<std::mutex> lock(global_lock);
77*b7893ccfSSadaf Ebrahimi layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
78*b7893ccfSSadaf Ebrahimi layer_data *instance_data = GetLayerDataPtr(phy_dev_data->instance, device_profile_api_dev_data_map);
79*b7893ccfSSadaf Ebrahimi instance_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, properties);
80*b7893ccfSSadaf Ebrahimi }
81*b7893ccfSSadaf Ebrahimi
SetPhysicalDeviceFormatPropertiesEXT(VkPhysicalDevice physicalDevice,VkFormat format,const VkFormatProperties newProperties)82*b7893ccfSSadaf Ebrahimi VKAPI_ATTR void VKAPI_CALL SetPhysicalDeviceFormatPropertiesEXT(VkPhysicalDevice physicalDevice, VkFormat format,
83*b7893ccfSSadaf Ebrahimi const VkFormatProperties newProperties) {
84*b7893ccfSSadaf Ebrahimi std::lock_guard<std::mutex> lock(global_lock);
85*b7893ccfSSadaf Ebrahimi layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
86*b7893ccfSSadaf Ebrahimi
87*b7893ccfSSadaf Ebrahimi memcpy(&(phy_dev_data->format_properties_map[format]), &newProperties, sizeof(VkFormatProperties));
88*b7893ccfSSadaf Ebrahimi }
89*b7893ccfSSadaf Ebrahimi
CreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance)90*b7893ccfSSadaf Ebrahimi VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
91*b7893ccfSSadaf Ebrahimi VkInstance *pInstance) {
92*b7893ccfSSadaf Ebrahimi VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
93*b7893ccfSSadaf Ebrahimi std::lock_guard<std::mutex> lock(global_lock);
94*b7893ccfSSadaf Ebrahimi
95*b7893ccfSSadaf Ebrahimi assert(chain_info->u.pLayerInfo);
96*b7893ccfSSadaf Ebrahimi PFN_vkGetInstanceProcAddr fp_get_instance_proc_addr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
97*b7893ccfSSadaf Ebrahimi PFN_vkCreateInstance fp_create_instance = (PFN_vkCreateInstance)fp_get_instance_proc_addr(NULL, "vkCreateInstance");
98*b7893ccfSSadaf Ebrahimi if (fp_create_instance == NULL) return VK_ERROR_INITIALIZATION_FAILED;
99*b7893ccfSSadaf Ebrahimi
100*b7893ccfSSadaf Ebrahimi // Advance the link info for the next element on the chain
101*b7893ccfSSadaf Ebrahimi chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
102*b7893ccfSSadaf Ebrahimi
103*b7893ccfSSadaf Ebrahimi VkResult result = fp_create_instance(pCreateInfo, pAllocator, pInstance);
104*b7893ccfSSadaf Ebrahimi if (result != VK_SUCCESS) return result;
105*b7893ccfSSadaf Ebrahimi
106*b7893ccfSSadaf Ebrahimi layer_data *instance_data = GetLayerDataPtr(*pInstance, device_profile_api_dev_data_map);
107*b7893ccfSSadaf Ebrahimi instance_data->instance = *pInstance;
108*b7893ccfSSadaf Ebrahimi layer_init_instance_dispatch_table(*pInstance, &instance_data->dispatch_table, fp_get_instance_proc_addr);
109*b7893ccfSSadaf Ebrahimi instance_data->dispatch_table.GetPhysicalDeviceProcAddr =
110*b7893ccfSSadaf Ebrahimi (PFN_GetPhysicalDeviceProcAddr)fp_get_instance_proc_addr(*pInstance, "vk_layerGetPhysicalDeviceProcAddr");
111*b7893ccfSSadaf Ebrahimi
112*b7893ccfSSadaf Ebrahimi uint32_t physical_device_count = 0;
113*b7893ccfSSadaf Ebrahimi instance_data->dispatch_table.EnumeratePhysicalDevices(*pInstance, &physical_device_count, NULL);
114*b7893ccfSSadaf Ebrahimi
115*b7893ccfSSadaf Ebrahimi VkPhysicalDevice *physical_devices = (VkPhysicalDevice *)malloc(sizeof(physical_devices[0]) * physical_device_count);
116*b7893ccfSSadaf Ebrahimi result = instance_data->dispatch_table.EnumeratePhysicalDevices(*pInstance, &physical_device_count, physical_devices);
117*b7893ccfSSadaf Ebrahimi
118*b7893ccfSSadaf Ebrahimi for (uint8_t i = 0; i < physical_device_count; i++) {
119*b7893ccfSSadaf Ebrahimi layer_data *phy_dev_data = GetLayerDataPtr(physical_devices[i], device_profile_api_dev_data_map);
120*b7893ccfSSadaf Ebrahimi instance_data->dispatch_table.GetPhysicalDeviceProperties(physical_devices[i], &phy_dev_data->phy_device_props);
121*b7893ccfSSadaf Ebrahimi phy_dev_data->instance = *pInstance;
122*b7893ccfSSadaf Ebrahimi }
123*b7893ccfSSadaf Ebrahimi return result;
124*b7893ccfSSadaf Ebrahimi }
125*b7893ccfSSadaf Ebrahimi
GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,VkPhysicalDeviceProperties * pProperties)126*b7893ccfSSadaf Ebrahimi VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
127*b7893ccfSSadaf Ebrahimi std::lock_guard<std::mutex> lock(global_lock);
128*b7893ccfSSadaf Ebrahimi layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
129*b7893ccfSSadaf Ebrahimi memcpy(pProperties, &phy_dev_data->phy_device_props, sizeof(VkPhysicalDeviceProperties));
130*b7893ccfSSadaf Ebrahimi }
131*b7893ccfSSadaf Ebrahimi
GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties * pProperties)132*b7893ccfSSadaf Ebrahimi VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
133*b7893ccfSSadaf Ebrahimi VkFormatProperties *pProperties) {
134*b7893ccfSSadaf Ebrahimi std::lock_guard<std::mutex> lock(global_lock);
135*b7893ccfSSadaf Ebrahimi layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
136*b7893ccfSSadaf Ebrahimi layer_data *instance_data = GetLayerDataPtr(phy_dev_data->instance, device_profile_api_dev_data_map);
137*b7893ccfSSadaf Ebrahimi auto device_format_map_it = phy_dev_data->format_properties_map.find(format);
138*b7893ccfSSadaf Ebrahimi if (device_format_map_it != phy_dev_data->format_properties_map.end()) {
139*b7893ccfSSadaf Ebrahimi memcpy(pProperties, &phy_dev_data->format_properties_map[format], sizeof(VkFormatProperties));
140*b7893ccfSSadaf Ebrahimi } else {
141*b7893ccfSSadaf Ebrahimi instance_data->dispatch_table.GetPhysicalDeviceFormatProperties(physicalDevice, format, pProperties);
142*b7893ccfSSadaf Ebrahimi }
143*b7893ccfSSadaf Ebrahimi }
144*b7893ccfSSadaf Ebrahimi
145*b7893ccfSSadaf Ebrahimi static const VkLayerProperties device_profile_api_LayerProps = {
146*b7893ccfSSadaf Ebrahimi "VK_LAYER_LUNARG_device_profile_api",
147*b7893ccfSSadaf Ebrahimi VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION), // specVersion
148*b7893ccfSSadaf Ebrahimi 1, // implementationVersion
149*b7893ccfSSadaf Ebrahimi "LunarG device profile api Layer",
150*b7893ccfSSadaf Ebrahimi };
151*b7893ccfSSadaf Ebrahimi
152*b7893ccfSSadaf Ebrahimi template <typename T>
EnumerateProperties(uint32_t src_count,const T * src_props,uint32_t * dst_count,T * dst_props)153*b7893ccfSSadaf Ebrahimi VkResult EnumerateProperties(uint32_t src_count, const T *src_props, uint32_t *dst_count, T *dst_props) {
154*b7893ccfSSadaf Ebrahimi if (!dst_props || !src_props) {
155*b7893ccfSSadaf Ebrahimi *dst_count = src_count;
156*b7893ccfSSadaf Ebrahimi return VK_SUCCESS;
157*b7893ccfSSadaf Ebrahimi }
158*b7893ccfSSadaf Ebrahimi
159*b7893ccfSSadaf Ebrahimi uint32_t copy_count = (*dst_count < src_count) ? *dst_count : src_count;
160*b7893ccfSSadaf Ebrahimi memcpy(dst_props, src_props, sizeof(T) * copy_count);
161*b7893ccfSSadaf Ebrahimi *dst_count = copy_count;
162*b7893ccfSSadaf Ebrahimi
163*b7893ccfSSadaf Ebrahimi return (copy_count == src_count) ? VK_SUCCESS : VK_INCOMPLETE;
164*b7893ccfSSadaf Ebrahimi }
165*b7893ccfSSadaf Ebrahimi
EnumerateInstanceLayerProperties(uint32_t * pCount,VkLayerProperties * pProperties)166*b7893ccfSSadaf Ebrahimi VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
167*b7893ccfSSadaf Ebrahimi return EnumerateProperties(1, &device_profile_api_LayerProps, pCount, pProperties);
168*b7893ccfSSadaf Ebrahimi }
169*b7893ccfSSadaf Ebrahimi
EnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pCount,VkExtensionProperties * pProperties)170*b7893ccfSSadaf Ebrahimi VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
171*b7893ccfSSadaf Ebrahimi VkExtensionProperties *pProperties) {
172*b7893ccfSSadaf Ebrahimi if (pLayerName && !strcmp(pLayerName, device_profile_api_LayerProps.layerName))
173*b7893ccfSSadaf Ebrahimi return EnumerateProperties<VkExtensionProperties>(0, NULL, pCount, pProperties);
174*b7893ccfSSadaf Ebrahimi
175*b7893ccfSSadaf Ebrahimi return VK_ERROR_LAYER_NOT_PRESENT;
176*b7893ccfSSadaf Ebrahimi }
177*b7893ccfSSadaf Ebrahimi
GetPhysicalDeviceProcAddr(VkInstance instance,const char * name)178*b7893ccfSSadaf Ebrahimi VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *name) {
179*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkSetPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceLimitsEXT;
180*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkGetOriginalPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceLimitsEXT;
181*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkSetPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatPropertiesEXT;
182*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatPropertiesEXT"))
183*b7893ccfSSadaf Ebrahimi return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatPropertiesEXT;
184*b7893ccfSSadaf Ebrahimi layer_data *instance_data = GetLayerDataPtr(instance, device_profile_api_dev_data_map);
185*b7893ccfSSadaf Ebrahimi auto &table = instance_data->dispatch_table;
186*b7893ccfSSadaf Ebrahimi if (!table.GetPhysicalDeviceProcAddr) return nullptr;
187*b7893ccfSSadaf Ebrahimi return table.GetPhysicalDeviceProcAddr(instance, name);
188*b7893ccfSSadaf Ebrahimi }
189*b7893ccfSSadaf Ebrahimi
GetInstanceProcAddr(VkInstance instance,const char * name)190*b7893ccfSSadaf Ebrahimi VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *name) {
191*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkCreateInstance")) return (PFN_vkVoidFunction)CreateInstance;
192*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkGetPhysicalDeviceProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
193*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkGetPhysicalDeviceFormatProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
194*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkGetInstanceProcAddr")) return (PFN_vkVoidFunction)GetInstanceProcAddr;
195*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkEnumerateInstanceExtensionProperties")) return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
196*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkEnumerateInstanceLayerProperties")) return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
197*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkSetPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceLimitsEXT;
198*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkGetOriginalPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceLimitsEXT;
199*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkSetPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatPropertiesEXT;
200*b7893ccfSSadaf Ebrahimi if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatPropertiesEXT"))
201*b7893ccfSSadaf Ebrahimi return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatPropertiesEXT;
202*b7893ccfSSadaf Ebrahimi assert(instance);
203*b7893ccfSSadaf Ebrahimi layer_data *instance_data = GetLayerDataPtr(instance, device_profile_api_dev_data_map);
204*b7893ccfSSadaf Ebrahimi auto &table = instance_data->dispatch_table;
205*b7893ccfSSadaf Ebrahimi if (!table.GetInstanceProcAddr) return nullptr;
206*b7893ccfSSadaf Ebrahimi return table.GetInstanceProcAddr(instance, name);
207*b7893ccfSSadaf Ebrahimi }
208*b7893ccfSSadaf Ebrahimi
209*b7893ccfSSadaf Ebrahimi } // namespace device_profile_api
210*b7893ccfSSadaf Ebrahimi
vkEnumerateInstanceLayerProperties(uint32_t * pCount,VkLayerProperties * pProperties)211*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
212*b7893ccfSSadaf Ebrahimi VkLayerProperties *pProperties) {
213*b7893ccfSSadaf Ebrahimi return device_profile_api::EnumerateInstanceLayerProperties(pCount, pProperties);
214*b7893ccfSSadaf Ebrahimi }
215*b7893ccfSSadaf Ebrahimi
vkEnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pCount,VkExtensionProperties * pProperties)216*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
217*b7893ccfSSadaf Ebrahimi VkExtensionProperties *pProperties) {
218*b7893ccfSSadaf Ebrahimi return device_profile_api::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
219*b7893ccfSSadaf Ebrahimi }
220*b7893ccfSSadaf Ebrahimi
vkGetInstanceProcAddr(VkInstance instance,const char * funcName)221*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
222*b7893ccfSSadaf Ebrahimi return device_profile_api::GetInstanceProcAddr(instance, funcName);
223*b7893ccfSSadaf Ebrahimi }
224*b7893ccfSSadaf Ebrahimi
vk_layerGetPhysicalDeviceProcAddr(VkInstance instance,const char * funcName)225*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_layerGetPhysicalDeviceProcAddr(VkInstance instance,
226*b7893ccfSSadaf Ebrahimi const char *funcName) {
227*b7893ccfSSadaf Ebrahimi return device_profile_api::GetPhysicalDeviceProcAddr(instance, funcName);
228*b7893ccfSSadaf Ebrahimi }
229*b7893ccfSSadaf Ebrahimi
vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface * pVersionStruct)230*b7893ccfSSadaf Ebrahimi VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct) {
231*b7893ccfSSadaf Ebrahimi assert(pVersionStruct != NULL);
232*b7893ccfSSadaf Ebrahimi assert(pVersionStruct->sType == LAYER_NEGOTIATE_INTERFACE_STRUCT);
233*b7893ccfSSadaf Ebrahimi
234*b7893ccfSSadaf Ebrahimi // Fill in the function pointers if our version is at least capable of having the structure contain them.
235*b7893ccfSSadaf Ebrahimi if (pVersionStruct->loaderLayerInterfaceVersion >= 2) {
236*b7893ccfSSadaf Ebrahimi pVersionStruct->pfnGetInstanceProcAddr = vkGetInstanceProcAddr;
237*b7893ccfSSadaf Ebrahimi pVersionStruct->pfnGetDeviceProcAddr = nullptr;
238*b7893ccfSSadaf Ebrahimi pVersionStruct->pfnGetPhysicalDeviceProcAddr = vk_layerGetPhysicalDeviceProcAddr;
239*b7893ccfSSadaf Ebrahimi }
240*b7893ccfSSadaf Ebrahimi
241*b7893ccfSSadaf Ebrahimi if (pVersionStruct->loaderLayerInterfaceVersion < CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
242*b7893ccfSSadaf Ebrahimi device_profile_api::loader_layer_if_version = pVersionStruct->loaderLayerInterfaceVersion;
243*b7893ccfSSadaf Ebrahimi } else if (pVersionStruct->loaderLayerInterfaceVersion > CURRENT_LOADER_LAYER_INTERFACE_VERSION) {
244*b7893ccfSSadaf Ebrahimi pVersionStruct->loaderLayerInterfaceVersion = CURRENT_LOADER_LAYER_INTERFACE_VERSION;
245*b7893ccfSSadaf Ebrahimi }
246*b7893ccfSSadaf Ebrahimi
247*b7893ccfSSadaf Ebrahimi return VK_SUCCESS;
248*b7893ccfSSadaf Ebrahimi }
249