1 // 2 // File: vk_layer.h 3 // 4 /* 5 * Copyright (c) 2015-2016 The Khronos Group Inc. 6 * Copyright (c) 2015-2016 Valve Corporation 7 * Copyright (c) 2015-2016 LunarG, Inc. 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a copy 10 * of this software and/or associated documentation files (the "Materials"), to 11 * deal in the Materials without restriction, including without limitation the 12 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 13 * sell copies of the Materials, and to permit persons to whom the Materials are 14 * furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice(s) and this permission notice shall be included in 17 * all copies or substantial portions of the Materials. 18 * 19 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 22 * 23 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 24 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 25 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 26 * USE OR OTHER DEALINGS IN THE MATERIALS. 27 * 28 */ 29 30 /* Need to define dispatch table 31 * Core struct can then have ptr to dispatch table at the top 32 * Along with object ptrs for current and next OBJ 33 */ 34 #pragma once 35 36 #include "vulkan.h" 37 #if defined(__GNUC__) && __GNUC__ >= 4 38 #define VK_LAYER_EXPORT __attribute__((visibility("default"))) 39 #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) 40 #define VK_LAYER_EXPORT __attribute__((visibility("default"))) 41 #else 42 #define VK_LAYER_EXPORT 43 #endif 44 45 typedef struct VkLayerDispatchTable_ { 46 PFN_vkGetDeviceProcAddr GetDeviceProcAddr; 47 PFN_vkDestroyDevice DestroyDevice; 48 PFN_vkGetDeviceQueue GetDeviceQueue; 49 PFN_vkQueueSubmit QueueSubmit; 50 PFN_vkQueueWaitIdle QueueWaitIdle; 51 PFN_vkDeviceWaitIdle DeviceWaitIdle; 52 PFN_vkAllocateMemory AllocateMemory; 53 PFN_vkFreeMemory FreeMemory; 54 PFN_vkMapMemory MapMemory; 55 PFN_vkUnmapMemory UnmapMemory; 56 PFN_vkFlushMappedMemoryRanges FlushMappedMemoryRanges; 57 PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges; 58 PFN_vkGetDeviceMemoryCommitment GetDeviceMemoryCommitment; 59 PFN_vkGetImageSparseMemoryRequirements GetImageSparseMemoryRequirements; 60 PFN_vkGetImageMemoryRequirements GetImageMemoryRequirements; 61 PFN_vkGetBufferMemoryRequirements GetBufferMemoryRequirements; 62 PFN_vkBindImageMemory BindImageMemory; 63 PFN_vkBindBufferMemory BindBufferMemory; 64 PFN_vkQueueBindSparse QueueBindSparse; 65 PFN_vkCreateFence CreateFence; 66 PFN_vkDestroyFence DestroyFence; 67 PFN_vkGetFenceStatus GetFenceStatus; 68 PFN_vkResetFences ResetFences; 69 PFN_vkWaitForFences WaitForFences; 70 PFN_vkCreateSemaphore CreateSemaphore; 71 PFN_vkDestroySemaphore DestroySemaphore; 72 PFN_vkCreateEvent CreateEvent; 73 PFN_vkDestroyEvent DestroyEvent; 74 PFN_vkGetEventStatus GetEventStatus; 75 PFN_vkSetEvent SetEvent; 76 PFN_vkResetEvent ResetEvent; 77 PFN_vkCreateQueryPool CreateQueryPool; 78 PFN_vkDestroyQueryPool DestroyQueryPool; 79 PFN_vkGetQueryPoolResults GetQueryPoolResults; 80 PFN_vkCreateBuffer CreateBuffer; 81 PFN_vkDestroyBuffer DestroyBuffer; 82 PFN_vkCreateBufferView CreateBufferView; 83 PFN_vkDestroyBufferView DestroyBufferView; 84 PFN_vkCreateImage CreateImage; 85 PFN_vkDestroyImage DestroyImage; 86 PFN_vkGetImageSubresourceLayout GetImageSubresourceLayout; 87 PFN_vkCreateImageView CreateImageView; 88 PFN_vkDestroyImageView DestroyImageView; 89 PFN_vkCreateShaderModule CreateShaderModule; 90 PFN_vkDestroyShaderModule DestroyShaderModule; 91 PFN_vkCreatePipelineCache CreatePipelineCache; 92 PFN_vkDestroyPipelineCache DestroyPipelineCache; 93 PFN_vkGetPipelineCacheData GetPipelineCacheData; 94 PFN_vkMergePipelineCaches MergePipelineCaches; 95 PFN_vkCreateGraphicsPipelines CreateGraphicsPipelines; 96 PFN_vkCreateComputePipelines CreateComputePipelines; 97 PFN_vkDestroyPipeline DestroyPipeline; 98 PFN_vkCreatePipelineLayout CreatePipelineLayout; 99 PFN_vkDestroyPipelineLayout DestroyPipelineLayout; 100 PFN_vkCreateSampler CreateSampler; 101 PFN_vkDestroySampler DestroySampler; 102 PFN_vkCreateDescriptorSetLayout CreateDescriptorSetLayout; 103 PFN_vkDestroyDescriptorSetLayout DestroyDescriptorSetLayout; 104 PFN_vkCreateDescriptorPool CreateDescriptorPool; 105 PFN_vkDestroyDescriptorPool DestroyDescriptorPool; 106 PFN_vkResetDescriptorPool ResetDescriptorPool; 107 PFN_vkAllocateDescriptorSets AllocateDescriptorSets; 108 PFN_vkFreeDescriptorSets FreeDescriptorSets; 109 PFN_vkUpdateDescriptorSets UpdateDescriptorSets; 110 PFN_vkCreateFramebuffer CreateFramebuffer; 111 PFN_vkDestroyFramebuffer DestroyFramebuffer; 112 PFN_vkCreateRenderPass CreateRenderPass; 113 PFN_vkDestroyRenderPass DestroyRenderPass; 114 PFN_vkGetRenderAreaGranularity GetRenderAreaGranularity; 115 PFN_vkCreateCommandPool CreateCommandPool; 116 PFN_vkDestroyCommandPool DestroyCommandPool; 117 PFN_vkResetCommandPool ResetCommandPool; 118 PFN_vkAllocateCommandBuffers AllocateCommandBuffers; 119 PFN_vkFreeCommandBuffers FreeCommandBuffers; 120 PFN_vkBeginCommandBuffer BeginCommandBuffer; 121 PFN_vkEndCommandBuffer EndCommandBuffer; 122 PFN_vkResetCommandBuffer ResetCommandBuffer; 123 PFN_vkCmdBindPipeline CmdBindPipeline; 124 PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets; 125 PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers; 126 PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer; 127 PFN_vkCmdSetViewport CmdSetViewport; 128 PFN_vkCmdSetScissor CmdSetScissor; 129 PFN_vkCmdSetLineWidth CmdSetLineWidth; 130 PFN_vkCmdSetDepthBias CmdSetDepthBias; 131 PFN_vkCmdSetBlendConstants CmdSetBlendConstants; 132 PFN_vkCmdSetDepthBounds CmdSetDepthBounds; 133 PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask; 134 PFN_vkCmdSetStencilWriteMask CmdSetStencilWriteMask; 135 PFN_vkCmdSetStencilReference CmdSetStencilReference; 136 PFN_vkCmdDraw CmdDraw; 137 PFN_vkCmdDrawIndexed CmdDrawIndexed; 138 PFN_vkCmdDrawIndirect CmdDrawIndirect; 139 PFN_vkCmdDrawIndexedIndirect CmdDrawIndexedIndirect; 140 PFN_vkCmdDispatch CmdDispatch; 141 PFN_vkCmdDispatchIndirect CmdDispatchIndirect; 142 PFN_vkCmdCopyBuffer CmdCopyBuffer; 143 PFN_vkCmdCopyImage CmdCopyImage; 144 PFN_vkCmdBlitImage CmdBlitImage; 145 PFN_vkCmdCopyBufferToImage CmdCopyBufferToImage; 146 PFN_vkCmdCopyImageToBuffer CmdCopyImageToBuffer; 147 PFN_vkCmdUpdateBuffer CmdUpdateBuffer; 148 PFN_vkCmdFillBuffer CmdFillBuffer; 149 PFN_vkCmdClearColorImage CmdClearColorImage; 150 PFN_vkCmdClearDepthStencilImage CmdClearDepthStencilImage; 151 PFN_vkCmdClearAttachments CmdClearAttachments; 152 PFN_vkCmdResolveImage CmdResolveImage; 153 PFN_vkCmdSetEvent CmdSetEvent; 154 PFN_vkCmdResetEvent CmdResetEvent; 155 PFN_vkCmdWaitEvents CmdWaitEvents; 156 PFN_vkCmdPipelineBarrier CmdPipelineBarrier; 157 PFN_vkCmdBeginQuery CmdBeginQuery; 158 PFN_vkCmdEndQuery CmdEndQuery; 159 PFN_vkCmdResetQueryPool CmdResetQueryPool; 160 PFN_vkCmdWriteTimestamp CmdWriteTimestamp; 161 PFN_vkCmdCopyQueryPoolResults CmdCopyQueryPoolResults; 162 PFN_vkCmdPushConstants CmdPushConstants; 163 PFN_vkCmdBeginRenderPass CmdBeginRenderPass; 164 PFN_vkCmdNextSubpass CmdNextSubpass; 165 PFN_vkCmdEndRenderPass CmdEndRenderPass; 166 PFN_vkCmdExecuteCommands CmdExecuteCommands; 167 PFN_vkCreateSwapchainKHR CreateSwapchainKHR; 168 PFN_vkDestroySwapchainKHR DestroySwapchainKHR; 169 PFN_vkGetSwapchainImagesKHR GetSwapchainImagesKHR; 170 PFN_vkAcquireNextImageKHR AcquireNextImageKHR; 171 PFN_vkQueuePresentKHR QueuePresentKHR; 172 } VkLayerDispatchTable; 173 174 typedef struct VkLayerInstanceDispatchTable_ { 175 PFN_vkGetInstanceProcAddr GetInstanceProcAddr; 176 PFN_vkDestroyInstance DestroyInstance; 177 PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices; 178 PFN_vkGetPhysicalDeviceFeatures GetPhysicalDeviceFeatures; 179 PFN_vkGetPhysicalDeviceImageFormatProperties 180 GetPhysicalDeviceImageFormatProperties; 181 PFN_vkGetPhysicalDeviceFormatProperties GetPhysicalDeviceFormatProperties; 182 PFN_vkGetPhysicalDeviceSparseImageFormatProperties 183 GetPhysicalDeviceSparseImageFormatProperties; 184 PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties; 185 PFN_vkGetPhysicalDeviceQueueFamilyProperties 186 GetPhysicalDeviceQueueFamilyProperties; 187 PFN_vkGetPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties; 188 PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties; 189 PFN_vkEnumerateDeviceLayerProperties EnumerateDeviceLayerProperties; 190 PFN_vkDestroySurfaceKHR DestroySurfaceKHR; 191 PFN_vkGetPhysicalDeviceSurfaceSupportKHR GetPhysicalDeviceSurfaceSupportKHR; 192 PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR 193 GetPhysicalDeviceSurfaceCapabilitiesKHR; 194 PFN_vkGetPhysicalDeviceSurfaceFormatsKHR GetPhysicalDeviceSurfaceFormatsKHR; 195 PFN_vkGetPhysicalDeviceSurfacePresentModesKHR 196 GetPhysicalDeviceSurfacePresentModesKHR; 197 PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallbackEXT; 198 PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallbackEXT; 199 PFN_vkDebugReportMessageEXT DebugReportMessageEXT; 200 #ifdef VK_USE_PLATFORM_MIR_KHR 201 PFN_vkCreateMirSurfaceKHR CreateMirSurfaceKHR; 202 PFN_vkGetPhysicalDeviceMirPresentationSupportKHR 203 GetPhysicalDeviceMirPresentationSupportKHR; 204 #endif 205 #ifdef VK_USE_PLATFORM_WAYLAND_KHR 206 PFN_vkCreateWaylandSurfaceKHR CreateWaylandSurfaceKHR; 207 PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR 208 GetPhysicalDeviceWaylandPresentationSupportKHR; 209 #endif 210 #ifdef VK_USE_PLATFORM_WIN32_KHR 211 PFN_vkCreateWin32SurfaceKHR CreateWin32SurfaceKHR; 212 PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR 213 GetPhysicalDeviceWin32PresentationSupportKHR; 214 #endif 215 #ifdef VK_USE_PLATFORM_XCB_KHR 216 PFN_vkCreateXcbSurfaceKHR CreateXcbSurfaceKHR; 217 PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR 218 GetPhysicalDeviceXcbPresentationSupportKHR; 219 #endif 220 #ifdef VK_USE_PLATFORM_XLIB_KHR 221 PFN_vkCreateXlibSurfaceKHR CreateXlibSurfaceKHR; 222 PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR 223 GetPhysicalDeviceXlibPresentationSupportKHR; 224 #endif 225 #ifdef VK_USE_PLATFORM_ANDROID_KHR 226 PFN_vkCreateAndroidSurfaceKHR CreateAndroidSurfaceKHR; 227 #endif 228 PFN_vkGetPhysicalDeviceDisplayPropertiesKHR 229 GetPhysicalDeviceDisplayPropertiesKHR; 230 PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR 231 GetPhysicalDeviceDisplayPlanePropertiesKHR; 232 PFN_vkGetDisplayPlaneSupportedDisplaysKHR 233 GetDisplayPlaneSupportedDisplaysKHR; 234 PFN_vkGetDisplayModePropertiesKHR 235 GetDisplayModePropertiesKHR; 236 PFN_vkCreateDisplayModeKHR 237 CreateDisplayModeKHR; 238 PFN_vkGetDisplayPlaneCapabilitiesKHR 239 GetDisplayPlaneCapabilitiesKHR; 240 PFN_vkCreateDisplayPlaneSurfaceKHR 241 CreateDisplayPlaneSurfaceKHR; 242 } VkLayerInstanceDispatchTable; 243 244 // LL node for tree of dbg callback functions 245 typedef struct VkLayerDbgFunctionNode_ { 246 VkDebugReportCallbackEXT msgCallback; 247 PFN_vkDebugReportCallbackEXT pfnMsgCallback; 248 VkFlags msgFlags; 249 void *pUserData; 250 struct VkLayerDbgFunctionNode_ *pNext; 251 } VkLayerDbgFunctionNode; 252 253 typedef enum VkLayerDbgAction_ { 254 VK_DBG_LAYER_ACTION_IGNORE = 0x0, 255 VK_DBG_LAYER_ACTION_CALLBACK = 0x1, 256 VK_DBG_LAYER_ACTION_LOG_MSG = 0x2, 257 VK_DBG_LAYER_ACTION_BREAK = 0x4, 258 VK_DBG_LAYER_ACTION_DEBUG_OUTPUT = 0x8, 259 } VkLayerDbgAction; 260 261 // ------------------------------------------------------------------------------------------------ 262 // CreateInstance and CreateDevice support structures 263 264 typedef enum VkLayerFunction_ { 265 VK_LAYER_LINK_INFO = 0, 266 VK_LAYER_DEVICE_INFO = 1, 267 VK_LAYER_INSTANCE_INFO = 2 268 } VkLayerFunction; 269 270 /* 271 * When creating the device chain the loader needs to pass 272 * down information about it's device structure needed at 273 * the end of the chain. Passing the data via the 274 * VkLayerInstanceInfo avoids issues with finding the 275 * exact instance being used. 276 */ 277 typedef struct VkLayerInstanceInfo_ { 278 void *instance_info; 279 PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; 280 } VkLayerInstanceInfo; 281 282 typedef struct VkLayerInstanceLink_ { 283 struct VkLayerInstanceLink_ *pNext; 284 PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; 285 } VkLayerInstanceLink; 286 287 /* 288 * When creating the device chain the loader needs to pass 289 * down information about it's device structure needed at 290 * the end of the chain. Passing the data via the 291 * VkLayerDeviceInfo avoids issues with finding the 292 * exact instance being used. 293 */ 294 typedef struct VkLayerDeviceInfo_ { 295 void *device_info; 296 PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; 297 } VkLayerDeviceInfo; 298 299 typedef struct { 300 VkStructureType sType; // VK_STRUCTURE_TYPE_LAYER_INSTANCE_CREATE_INFO 301 const void *pNext; 302 VkLayerFunction function; 303 union { 304 VkLayerInstanceLink *pLayerInfo; 305 VkLayerInstanceInfo instanceInfo; 306 } u; 307 } VkLayerInstanceCreateInfo; 308 309 typedef struct VkLayerDeviceLink_ { 310 struct VkLayerDeviceLink_ *pNext; 311 PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; 312 PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr; 313 } VkLayerDeviceLink; 314 315 typedef struct { 316 VkStructureType sType; // VK_STRUCTURE_TYPE_LAYER_DEVICE_CREATE_INFO 317 const void *pNext; 318 VkLayerFunction function; 319 union { 320 VkLayerDeviceLink *pLayerInfo; 321 VkLayerDeviceInfo deviceInfo; 322 } u; 323 } VkLayerDeviceCreateInfo; 324 325 // ------------------------------------------------------------------------------------------------ 326 // API functions 327