1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker *
4*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker *
8*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker *
10*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker */
16*b7c941bbSAndroid Build Coastguard Worker
17*b7c941bbSAndroid Build Coastguard Worker #include <cstring>
18*b7c941bbSAndroid Build Coastguard Worker #include <string>
19*b7c941bbSAndroid Build Coastguard Worker
20*b7c941bbSAndroid Build Coastguard Worker #include "vk_layer_interface.h"
21*b7c941bbSAndroid Build Coastguard Worker #include <android/log.h>
22*b7c941bbSAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
23*b7c941bbSAndroid Build Coastguard Worker
24*b7c941bbSAndroid Build Coastguard Worker #define xstr(a) str(a)
25*b7c941bbSAndroid Build Coastguard Worker #define str(a) #a
26*b7c941bbSAndroid Build Coastguard Worker
27*b7c941bbSAndroid Build Coastguard Worker #define LAYER_FULL_NAME "VK_LAYER_ANDROID_nullLayer" xstr(LAYERNAME)
28*b7c941bbSAndroid Build Coastguard Worker #define LOG_TAG LAYER_FULL_NAME
29*b7c941bbSAndroid Build Coastguard Worker
30*b7c941bbSAndroid Build Coastguard Worker #define ALOGI(msg, ...) \
31*b7c941bbSAndroid Build Coastguard Worker __android_log_print(ANDROID_LOG_INFO, LOG_TAG, (msg), __VA_ARGS__)
32*b7c941bbSAndroid Build Coastguard Worker
33*b7c941bbSAndroid Build Coastguard Worker #ifdef DEBUGUTILSPECVERSION
34*b7c941bbSAndroid Build Coastguard Worker const VkExtensionProperties debug_utils_extension = {
35*b7c941bbSAndroid Build Coastguard Worker "VK_EXT_debug_utils",
36*b7c941bbSAndroid Build Coastguard Worker static_cast<uint32_t>(std::atoi(xstr(DEBUGUTILSPECVERSION))),
37*b7c941bbSAndroid Build Coastguard Worker };
38*b7c941bbSAndroid Build Coastguard Worker #endif
39*b7c941bbSAndroid Build Coastguard Worker
40*b7c941bbSAndroid Build Coastguard Worker // Announce if anything loads this layer. LAYERNAME is defined in Android.mk
41*b7c941bbSAndroid Build Coastguard Worker class StaticLogMessage {
42*b7c941bbSAndroid Build Coastguard Worker public:
StaticLogMessage(const char * msg)43*b7c941bbSAndroid Build Coastguard Worker StaticLogMessage(const char* msg) {
44*b7c941bbSAndroid Build Coastguard Worker ALOGI("%s", msg);
45*b7c941bbSAndroid Build Coastguard Worker }
46*b7c941bbSAndroid Build Coastguard Worker };
47*b7c941bbSAndroid Build Coastguard Worker StaticLogMessage
48*b7c941bbSAndroid Build Coastguard Worker g_initMessage("VK_LAYER_ANDROID_nullLayer" xstr(LAYERNAME) " loaded");
49*b7c941bbSAndroid Build Coastguard Worker
50*b7c941bbSAndroid Build Coastguard Worker namespace {
51*b7c941bbSAndroid Build Coastguard Worker
52*b7c941bbSAndroid Build Coastguard Worker
53*b7c941bbSAndroid Build Coastguard Worker // Minimal dispatch table for this simple layer
54*b7c941bbSAndroid Build Coastguard Worker struct {
55*b7c941bbSAndroid Build Coastguard Worker PFN_vkGetDeviceProcAddr GetDeviceProcAddr;
56*b7c941bbSAndroid Build Coastguard Worker PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
57*b7c941bbSAndroid Build Coastguard Worker } g_VulkanDispatchTable;
58*b7c941bbSAndroid Build Coastguard Worker
59*b7c941bbSAndroid Build Coastguard Worker template<class T>
getProperties(const uint32_t count,const T * properties,uint32_t * pCount,T * pProperties)60*b7c941bbSAndroid Build Coastguard Worker VkResult getProperties(const uint32_t count, const T *properties, uint32_t *pCount,
61*b7c941bbSAndroid Build Coastguard Worker T *pProperties) {
62*b7c941bbSAndroid Build Coastguard Worker uint32_t copySize;
63*b7c941bbSAndroid Build Coastguard Worker
64*b7c941bbSAndroid Build Coastguard Worker if (pProperties == NULL || properties == NULL) {
65*b7c941bbSAndroid Build Coastguard Worker *pCount = count;
66*b7c941bbSAndroid Build Coastguard Worker return VK_SUCCESS;
67*b7c941bbSAndroid Build Coastguard Worker }
68*b7c941bbSAndroid Build Coastguard Worker
69*b7c941bbSAndroid Build Coastguard Worker copySize = *pCount < count ? *pCount : count;
70*b7c941bbSAndroid Build Coastguard Worker memcpy(pProperties, properties, copySize * sizeof(T));
71*b7c941bbSAndroid Build Coastguard Worker *pCount = copySize;
72*b7c941bbSAndroid Build Coastguard Worker if (copySize < count) {
73*b7c941bbSAndroid Build Coastguard Worker return VK_INCOMPLETE;
74*b7c941bbSAndroid Build Coastguard Worker }
75*b7c941bbSAndroid Build Coastguard Worker
76*b7c941bbSAndroid Build Coastguard Worker return VK_SUCCESS;
77*b7c941bbSAndroid Build Coastguard Worker }
78*b7c941bbSAndroid Build Coastguard Worker
79*b7c941bbSAndroid Build Coastguard Worker static const VkLayerProperties LAYER_PROPERTIES = {
80*b7c941bbSAndroid Build Coastguard Worker LAYER_FULL_NAME,
81*b7c941bbSAndroid Build Coastguard Worker VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION),
82*b7c941bbSAndroid Build Coastguard Worker 1,
83*b7c941bbSAndroid Build Coastguard Worker "Layer: nullLayer" xstr(LAYERNAME),
84*b7c941bbSAndroid Build Coastguard Worker };
85*b7c941bbSAndroid Build Coastguard Worker
EnumerateInstanceLayerProperties(uint32_t * pCount,VkLayerProperties * pProperties)86*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
87*b7c941bbSAndroid Build Coastguard Worker return getProperties<VkLayerProperties>(1, &LAYER_PROPERTIES, pCount, pProperties);
88*b7c941bbSAndroid Build Coastguard Worker }
89*b7c941bbSAndroid Build Coastguard Worker
EnumerateDeviceLayerProperties(VkPhysicalDevice,uint32_t * pCount,VkLayerProperties * pProperties)90*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice /* physicalDevice */, uint32_t *pCount,
91*b7c941bbSAndroid Build Coastguard Worker VkLayerProperties *pProperties) {
92*b7c941bbSAndroid Build Coastguard Worker return getProperties<VkLayerProperties>(0, NULL, pCount, pProperties);
93*b7c941bbSAndroid Build Coastguard Worker }
94*b7c941bbSAndroid Build Coastguard Worker
EnumerateInstanceExtensionProperties(const char *,uint32_t * pCount,VkExtensionProperties * pProperties)95*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char* /* pLayerName */, uint32_t *pCount,
96*b7c941bbSAndroid Build Coastguard Worker VkExtensionProperties *pProperties) {
97*b7c941bbSAndroid Build Coastguard Worker #ifdef DEBUGUTILSPECVERSION
98*b7c941bbSAndroid Build Coastguard Worker return getProperties<VkExtensionProperties>(1, &debug_utils_extension, pCount,
99*b7c941bbSAndroid Build Coastguard Worker pProperties);
100*b7c941bbSAndroid Build Coastguard Worker #else
101*b7c941bbSAndroid Build Coastguard Worker return getProperties<VkExtensionProperties>(0, NULL, pCount, pProperties);
102*b7c941bbSAndroid Build Coastguard Worker #endif
103*b7c941bbSAndroid Build Coastguard Worker }
104*b7c941bbSAndroid Build Coastguard Worker
EnumerateDeviceExtensionProperties(VkPhysicalDevice,const char *,uint32_t * pCount,VkExtensionProperties * pProperties)105*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice /* physicalDevice */, const char* /* pLayerName */,
106*b7c941bbSAndroid Build Coastguard Worker uint32_t *pCount, VkExtensionProperties *pProperties) {
107*b7c941bbSAndroid Build Coastguard Worker return getProperties<VkExtensionProperties>(0, NULL, pCount, pProperties);
108*b7c941bbSAndroid Build Coastguard Worker }
109*b7c941bbSAndroid Build Coastguard Worker
nullCreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice)110*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL nullCreateDevice(VkPhysicalDevice physicalDevice,
111*b7c941bbSAndroid Build Coastguard Worker const VkDeviceCreateInfo* pCreateInfo,
112*b7c941bbSAndroid Build Coastguard Worker const VkAllocationCallbacks* pAllocator,
113*b7c941bbSAndroid Build Coastguard Worker VkDevice* pDevice) {
114*b7c941bbSAndroid Build Coastguard Worker VkLayerDeviceCreateInfo *layerCreateInfo = (VkLayerDeviceCreateInfo*)pCreateInfo->pNext;
115*b7c941bbSAndroid Build Coastguard Worker const char *msg = "nullCreateDevice called in " LAYER_FULL_NAME;
116*b7c941bbSAndroid Build Coastguard Worker ALOGI("%s", msg);
117*b7c941bbSAndroid Build Coastguard Worker
118*b7c941bbSAndroid Build Coastguard Worker // Step through the pNext chain until we get to the link function
119*b7c941bbSAndroid Build Coastguard Worker while(layerCreateInfo && (layerCreateInfo->sType != VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO ||
120*b7c941bbSAndroid Build Coastguard Worker layerCreateInfo->function != VK_LAYER_FUNCTION_LINK)) {
121*b7c941bbSAndroid Build Coastguard Worker layerCreateInfo = (VkLayerDeviceCreateInfo *)layerCreateInfo->pNext;
122*b7c941bbSAndroid Build Coastguard Worker }
123*b7c941bbSAndroid Build Coastguard Worker
124*b7c941bbSAndroid Build Coastguard Worker if(layerCreateInfo == NULL)
125*b7c941bbSAndroid Build Coastguard Worker return VK_ERROR_INITIALIZATION_FAILED;
126*b7c941bbSAndroid Build Coastguard Worker
127*b7c941bbSAndroid Build Coastguard Worker // Grab GDPA and GIPA for the next layer
128*b7c941bbSAndroid Build Coastguard Worker PFN_vkGetDeviceProcAddr gdpa = layerCreateInfo->u.pLayerInfo->pfnNextGetDeviceProcAddr;
129*b7c941bbSAndroid Build Coastguard Worker PFN_vkGetInstanceProcAddr gipa = layerCreateInfo->u.pLayerInfo->pfnNextGetInstanceProcAddr;
130*b7c941bbSAndroid Build Coastguard Worker
131*b7c941bbSAndroid Build Coastguard Worker // Track them in our dispatch table
132*b7c941bbSAndroid Build Coastguard Worker g_VulkanDispatchTable.GetDeviceProcAddr = gdpa;
133*b7c941bbSAndroid Build Coastguard Worker g_VulkanDispatchTable.GetInstanceProcAddr = gipa;
134*b7c941bbSAndroid Build Coastguard Worker
135*b7c941bbSAndroid Build Coastguard Worker // Advance the chain for next layer
136*b7c941bbSAndroid Build Coastguard Worker layerCreateInfo->u.pLayerInfo = layerCreateInfo->u.pLayerInfo->pNext;
137*b7c941bbSAndroid Build Coastguard Worker
138*b7c941bbSAndroid Build Coastguard Worker // Call the next layer
139*b7c941bbSAndroid Build Coastguard Worker PFN_vkCreateDevice createFunc = (PFN_vkCreateDevice)gipa(VK_NULL_HANDLE, "vkCreateDevice");
140*b7c941bbSAndroid Build Coastguard Worker VkResult ret = createFunc(physicalDevice, pCreateInfo, pAllocator, pDevice);
141*b7c941bbSAndroid Build Coastguard Worker
142*b7c941bbSAndroid Build Coastguard Worker return ret;
143*b7c941bbSAndroid Build Coastguard Worker }
144*b7c941bbSAndroid Build Coastguard Worker
nullCreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance)145*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL nullCreateInstance(const VkInstanceCreateInfo* pCreateInfo,
146*b7c941bbSAndroid Build Coastguard Worker const VkAllocationCallbacks* pAllocator,
147*b7c941bbSAndroid Build Coastguard Worker VkInstance* pInstance) {
148*b7c941bbSAndroid Build Coastguard Worker VkLayerInstanceCreateInfo *layerCreateInfo = (VkLayerInstanceCreateInfo *)pCreateInfo->pNext;
149*b7c941bbSAndroid Build Coastguard Worker const char *msg = "nullCreateInstance called in " LAYER_FULL_NAME;
150*b7c941bbSAndroid Build Coastguard Worker ALOGI("%s", msg);
151*b7c941bbSAndroid Build Coastguard Worker
152*b7c941bbSAndroid Build Coastguard Worker // Step through the pNext chain until we get to the link function
153*b7c941bbSAndroid Build Coastguard Worker while(layerCreateInfo && (layerCreateInfo->sType != VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO ||
154*b7c941bbSAndroid Build Coastguard Worker layerCreateInfo->function != VK_LAYER_FUNCTION_LINK)) {
155*b7c941bbSAndroid Build Coastguard Worker layerCreateInfo = (VkLayerInstanceCreateInfo *)layerCreateInfo->pNext;
156*b7c941bbSAndroid Build Coastguard Worker }
157*b7c941bbSAndroid Build Coastguard Worker
158*b7c941bbSAndroid Build Coastguard Worker if(layerCreateInfo == NULL)
159*b7c941bbSAndroid Build Coastguard Worker return VK_ERROR_INITIALIZATION_FAILED;
160*b7c941bbSAndroid Build Coastguard Worker
161*b7c941bbSAndroid Build Coastguard Worker // Grab GIPA for the next layer
162*b7c941bbSAndroid Build Coastguard Worker PFN_vkGetInstanceProcAddr gpa = layerCreateInfo->u.pLayerInfo->pfnNextGetInstanceProcAddr;
163*b7c941bbSAndroid Build Coastguard Worker
164*b7c941bbSAndroid Build Coastguard Worker // Track it in our dispatch table
165*b7c941bbSAndroid Build Coastguard Worker g_VulkanDispatchTable.GetInstanceProcAddr = gpa;
166*b7c941bbSAndroid Build Coastguard Worker
167*b7c941bbSAndroid Build Coastguard Worker // Advance the chain for next layer
168*b7c941bbSAndroid Build Coastguard Worker layerCreateInfo->u.pLayerInfo = layerCreateInfo->u.pLayerInfo->pNext;
169*b7c941bbSAndroid Build Coastguard Worker
170*b7c941bbSAndroid Build Coastguard Worker // Call the next layer
171*b7c941bbSAndroid Build Coastguard Worker PFN_vkCreateInstance createFunc = (PFN_vkCreateInstance)gpa(VK_NULL_HANDLE, "vkCreateInstance");
172*b7c941bbSAndroid Build Coastguard Worker VkResult ret = createFunc(pCreateInfo, pAllocator, pInstance);
173*b7c941bbSAndroid Build Coastguard Worker
174*b7c941bbSAndroid Build Coastguard Worker return ret;
175*b7c941bbSAndroid Build Coastguard Worker }
176*b7c941bbSAndroid Build Coastguard Worker
GetDeviceProcAddr(VkDevice dev,const char * funcName)177*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice dev, const char* funcName) {
178*b7c941bbSAndroid Build Coastguard Worker
179*b7c941bbSAndroid Build Coastguard Worker const char* targetFunc = "vkCreateDevice";
180*b7c941bbSAndroid Build Coastguard Worker if (!strncmp(targetFunc, funcName, sizeof("vkCreateDevice"))) {
181*b7c941bbSAndroid Build Coastguard Worker return (PFN_vkVoidFunction)nullCreateDevice;
182*b7c941bbSAndroid Build Coastguard Worker }
183*b7c941bbSAndroid Build Coastguard Worker
184*b7c941bbSAndroid Build Coastguard Worker return (PFN_vkVoidFunction)g_VulkanDispatchTable.GetDeviceProcAddr(dev, funcName);
185*b7c941bbSAndroid Build Coastguard Worker }
186*b7c941bbSAndroid Build Coastguard Worker
GetInstanceProcAddr(VkInstance instance,const char * funcName)187*b7c941bbSAndroid Build Coastguard Worker VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char* funcName) {
188*b7c941bbSAndroid Build Coastguard Worker
189*b7c941bbSAndroid Build Coastguard Worker const char* targetFunc = "vkCreateInstance";
190*b7c941bbSAndroid Build Coastguard Worker if (!strncmp(targetFunc, funcName, sizeof("vkCreateInstance"))) {
191*b7c941bbSAndroid Build Coastguard Worker return (PFN_vkVoidFunction)nullCreateInstance;
192*b7c941bbSAndroid Build Coastguard Worker }
193*b7c941bbSAndroid Build Coastguard Worker
194*b7c941bbSAndroid Build Coastguard Worker return (PFN_vkVoidFunction)g_VulkanDispatchTable.GetInstanceProcAddr(instance, funcName);
195*b7c941bbSAndroid Build Coastguard Worker }
196*b7c941bbSAndroid Build Coastguard Worker
197*b7c941bbSAndroid Build Coastguard Worker } // namespace
198*b7c941bbSAndroid Build Coastguard Worker
199*b7c941bbSAndroid Build Coastguard Worker // loader-layer interface v0, just wrappers since there is only a layer
200*b7c941bbSAndroid Build Coastguard Worker
vkEnumerateInstanceLayerProperties(uint32_t * pCount,VkLayerProperties * pProperties)201*b7c941bbSAndroid Build Coastguard Worker __attribute((visibility("default"))) VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount,
202*b7c941bbSAndroid Build Coastguard Worker VkLayerProperties *pProperties) {
203*b7c941bbSAndroid Build Coastguard Worker return EnumerateInstanceLayerProperties(pCount, pProperties);
204*b7c941bbSAndroid Build Coastguard Worker }
205*b7c941bbSAndroid Build Coastguard Worker
vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,uint32_t * pCount,VkLayerProperties * pProperties)206*b7c941bbSAndroid Build Coastguard Worker __attribute((visibility("default"))) VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount,
207*b7c941bbSAndroid Build Coastguard Worker VkLayerProperties *pProperties) {
208*b7c941bbSAndroid Build Coastguard Worker return EnumerateDeviceLayerProperties(physicalDevice, pCount, pProperties);
209*b7c941bbSAndroid Build Coastguard Worker }
210*b7c941bbSAndroid Build Coastguard Worker
vkEnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pCount,VkExtensionProperties * pProperties)211*b7c941bbSAndroid Build Coastguard Worker __attribute((visibility("default"))) VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount,
212*b7c941bbSAndroid Build Coastguard Worker VkExtensionProperties *pProperties) {
213*b7c941bbSAndroid Build Coastguard Worker return EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
214*b7c941bbSAndroid Build Coastguard Worker }
215*b7c941bbSAndroid Build Coastguard Worker
vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,const char * pLayerName,uint32_t * pCount,VkExtensionProperties * pProperties)216*b7c941bbSAndroid Build Coastguard Worker __attribute((visibility("default"))) VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
217*b7c941bbSAndroid Build Coastguard Worker const char *pLayerName, uint32_t *pCount,
218*b7c941bbSAndroid Build Coastguard Worker VkExtensionProperties *pProperties) {
219*b7c941bbSAndroid Build Coastguard Worker return EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties);
220*b7c941bbSAndroid Build Coastguard Worker }
221*b7c941bbSAndroid Build Coastguard Worker
vkGetDeviceProcAddr(VkDevice dev,const char * funcName)222*b7c941bbSAndroid Build Coastguard Worker __attribute((visibility("default"))) VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) {
223*b7c941bbSAndroid Build Coastguard Worker return GetDeviceProcAddr(dev, funcName);
224*b7c941bbSAndroid Build Coastguard Worker }
225*b7c941bbSAndroid Build Coastguard Worker
vkGetInstanceProcAddr(VkInstance instance,const char * funcName)226*b7c941bbSAndroid Build Coastguard Worker __attribute((visibility("default"))) VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
227*b7c941bbSAndroid Build Coastguard Worker return GetInstanceProcAddr(instance, funcName);
228*b7c941bbSAndroid Build Coastguard Worker }
229