| // |
| // File: vk_layer.h |
| // |
| /* |
| * Copyright (c) 2015-2016 The Khronos Group Inc. |
| * Copyright (c) 2015-2016 Valve Corporation |
| * Copyright (c) 2015-2016 LunarG, Inc. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy |
| * of this software and/or associated documentation files (the "Materials"), to |
| * deal in the Materials without restriction, including without limitation the |
| * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
| * sell copies of the Materials, and to permit persons to whom the Materials are |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice(s) and this permission notice shall be included in |
| * all copies or substantial portions of the Materials. |
| * |
| * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
| * |
| * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE |
| * USE OR OTHER DEALINGS IN THE MATERIALS. |
| * |
| */ |
| |
| /* Need to define dispatch table |
| * Core struct can then have ptr to dispatch table at the top |
| * Along with object ptrs for current and next OBJ |
| */ |
| #pragma once |
| |
| #include "vulkan.h" |
| #include "vk_lunarg_debug_marker.h" |
| #if defined(__GNUC__) && __GNUC__ >= 4 |
| #define VK_LAYER_EXPORT __attribute__((visibility("default"))) |
| #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) |
| #define VK_LAYER_EXPORT __attribute__((visibility("default"))) |
| #else |
| #define VK_LAYER_EXPORT |
| #endif |
| |
| typedef struct VkLayerDispatchTable_ { |
| PFN_vkGetDeviceProcAddr GetDeviceProcAddr; |
| PFN_vkDestroyDevice DestroyDevice; |
| PFN_vkGetDeviceQueue GetDeviceQueue; |
| PFN_vkQueueSubmit QueueSubmit; |
| PFN_vkQueueWaitIdle QueueWaitIdle; |
| PFN_vkDeviceWaitIdle DeviceWaitIdle; |
| PFN_vkAllocateMemory AllocateMemory; |
| PFN_vkFreeMemory FreeMemory; |
| PFN_vkMapMemory MapMemory; |
| PFN_vkUnmapMemory UnmapMemory; |
| PFN_vkFlushMappedMemoryRanges FlushMappedMemoryRanges; |
| PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges; |
| PFN_vkGetDeviceMemoryCommitment GetDeviceMemoryCommitment; |
| PFN_vkGetImageSparseMemoryRequirements GetImageSparseMemoryRequirements; |
| PFN_vkGetImageMemoryRequirements GetImageMemoryRequirements; |
| PFN_vkGetBufferMemoryRequirements GetBufferMemoryRequirements; |
| PFN_vkBindImageMemory BindImageMemory; |
| PFN_vkBindBufferMemory BindBufferMemory; |
| PFN_vkQueueBindSparse QueueBindSparse; |
| PFN_vkCreateFence CreateFence; |
| PFN_vkDestroyFence DestroyFence; |
| PFN_vkGetFenceStatus GetFenceStatus; |
| PFN_vkResetFences ResetFences; |
| PFN_vkWaitForFences WaitForFences; |
| PFN_vkCreateSemaphore CreateSemaphore; |
| PFN_vkDestroySemaphore DestroySemaphore; |
| PFN_vkCreateEvent CreateEvent; |
| PFN_vkDestroyEvent DestroyEvent; |
| PFN_vkGetEventStatus GetEventStatus; |
| PFN_vkSetEvent SetEvent; |
| PFN_vkResetEvent ResetEvent; |
| PFN_vkCreateQueryPool CreateQueryPool; |
| PFN_vkDestroyQueryPool DestroyQueryPool; |
| PFN_vkGetQueryPoolResults GetQueryPoolResults; |
| PFN_vkCreateBuffer CreateBuffer; |
| PFN_vkDestroyBuffer DestroyBuffer; |
| PFN_vkCreateBufferView CreateBufferView; |
| PFN_vkDestroyBufferView DestroyBufferView; |
| PFN_vkCreateImage CreateImage; |
| PFN_vkDestroyImage DestroyImage; |
| PFN_vkGetImageSubresourceLayout GetImageSubresourceLayout; |
| PFN_vkCreateImageView CreateImageView; |
| PFN_vkDestroyImageView DestroyImageView; |
| PFN_vkCreateShaderModule CreateShaderModule; |
| PFN_vkDestroyShaderModule DestroyShaderModule; |
| PFN_vkCreatePipelineCache CreatePipelineCache; |
| PFN_vkDestroyPipelineCache DestroyPipelineCache; |
| PFN_vkGetPipelineCacheData GetPipelineCacheData; |
| PFN_vkMergePipelineCaches MergePipelineCaches; |
| PFN_vkCreateGraphicsPipelines CreateGraphicsPipelines; |
| PFN_vkCreateComputePipelines CreateComputePipelines; |
| PFN_vkDestroyPipeline DestroyPipeline; |
| PFN_vkCreatePipelineLayout CreatePipelineLayout; |
| PFN_vkDestroyPipelineLayout DestroyPipelineLayout; |
| PFN_vkCreateSampler CreateSampler; |
| PFN_vkDestroySampler DestroySampler; |
| PFN_vkCreateDescriptorSetLayout CreateDescriptorSetLayout; |
| PFN_vkDestroyDescriptorSetLayout DestroyDescriptorSetLayout; |
| PFN_vkCreateDescriptorPool CreateDescriptorPool; |
| PFN_vkDestroyDescriptorPool DestroyDescriptorPool; |
| PFN_vkResetDescriptorPool ResetDescriptorPool; |
| PFN_vkAllocateDescriptorSets AllocateDescriptorSets; |
| PFN_vkFreeDescriptorSets FreeDescriptorSets; |
| PFN_vkUpdateDescriptorSets UpdateDescriptorSets; |
| PFN_vkCreateFramebuffer CreateFramebuffer; |
| PFN_vkDestroyFramebuffer DestroyFramebuffer; |
| PFN_vkCreateRenderPass CreateRenderPass; |
| PFN_vkDestroyRenderPass DestroyRenderPass; |
| PFN_vkGetRenderAreaGranularity GetRenderAreaGranularity; |
| PFN_vkCreateCommandPool CreateCommandPool; |
| PFN_vkDestroyCommandPool DestroyCommandPool; |
| PFN_vkResetCommandPool ResetCommandPool; |
| PFN_vkAllocateCommandBuffers AllocateCommandBuffers; |
| PFN_vkFreeCommandBuffers FreeCommandBuffers; |
| PFN_vkBeginCommandBuffer BeginCommandBuffer; |
| PFN_vkEndCommandBuffer EndCommandBuffer; |
| PFN_vkResetCommandBuffer ResetCommandBuffer; |
| PFN_vkCmdBindPipeline CmdBindPipeline; |
| PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets; |
| PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers; |
| PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer; |
| PFN_vkCmdSetViewport CmdSetViewport; |
| PFN_vkCmdSetScissor CmdSetScissor; |
| PFN_vkCmdSetLineWidth CmdSetLineWidth; |
| PFN_vkCmdSetDepthBias CmdSetDepthBias; |
| PFN_vkCmdSetBlendConstants CmdSetBlendConstants; |
| PFN_vkCmdSetDepthBounds CmdSetDepthBounds; |
| PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask; |
| PFN_vkCmdSetStencilWriteMask CmdSetStencilWriteMask; |
| PFN_vkCmdSetStencilReference CmdSetStencilReference; |
| PFN_vkCmdDraw CmdDraw; |
| PFN_vkCmdDrawIndexed CmdDrawIndexed; |
| PFN_vkCmdDrawIndirect CmdDrawIndirect; |
| PFN_vkCmdDrawIndexedIndirect CmdDrawIndexedIndirect; |
| PFN_vkCmdDispatch CmdDispatch; |
| PFN_vkCmdDispatchIndirect CmdDispatchIndirect; |
| PFN_vkCmdCopyBuffer CmdCopyBuffer; |
| PFN_vkCmdCopyImage CmdCopyImage; |
| PFN_vkCmdBlitImage CmdBlitImage; |
| PFN_vkCmdCopyBufferToImage CmdCopyBufferToImage; |
| PFN_vkCmdCopyImageToBuffer CmdCopyImageToBuffer; |
| PFN_vkCmdUpdateBuffer CmdUpdateBuffer; |
| PFN_vkCmdFillBuffer CmdFillBuffer; |
| PFN_vkCmdClearColorImage CmdClearColorImage; |
| PFN_vkCmdClearDepthStencilImage CmdClearDepthStencilImage; |
| PFN_vkCmdClearAttachments CmdClearAttachments; |
| PFN_vkCmdResolveImage CmdResolveImage; |
| PFN_vkCmdSetEvent CmdSetEvent; |
| PFN_vkCmdResetEvent CmdResetEvent; |
| PFN_vkCmdWaitEvents CmdWaitEvents; |
| PFN_vkCmdPipelineBarrier CmdPipelineBarrier; |
| PFN_vkCmdBeginQuery CmdBeginQuery; |
| PFN_vkCmdEndQuery CmdEndQuery; |
| PFN_vkCmdResetQueryPool CmdResetQueryPool; |
| PFN_vkCmdWriteTimestamp CmdWriteTimestamp; |
| PFN_vkCmdCopyQueryPoolResults CmdCopyQueryPoolResults; |
| PFN_vkCmdPushConstants CmdPushConstants; |
| PFN_vkCmdBeginRenderPass CmdBeginRenderPass; |
| PFN_vkCmdNextSubpass CmdNextSubpass; |
| PFN_vkCmdEndRenderPass CmdEndRenderPass; |
| PFN_vkCmdExecuteCommands CmdExecuteCommands; |
| PFN_vkCreateSwapchainKHR CreateSwapchainKHR; |
| PFN_vkDestroySwapchainKHR DestroySwapchainKHR; |
| PFN_vkGetSwapchainImagesKHR GetSwapchainImagesKHR; |
| PFN_vkAcquireNextImageKHR AcquireNextImageKHR; |
| PFN_vkQueuePresentKHR QueuePresentKHR; |
| } VkLayerDispatchTable; |
| |
| typedef struct VkLayerInstanceDispatchTable_ { |
| PFN_vkGetInstanceProcAddr GetInstanceProcAddr; |
| PFN_vkDestroyInstance DestroyInstance; |
| PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices; |
| PFN_vkGetPhysicalDeviceFeatures GetPhysicalDeviceFeatures; |
| PFN_vkGetPhysicalDeviceImageFormatProperties |
| GetPhysicalDeviceImageFormatProperties; |
| PFN_vkGetPhysicalDeviceFormatProperties GetPhysicalDeviceFormatProperties; |
| PFN_vkGetPhysicalDeviceSparseImageFormatProperties |
| GetPhysicalDeviceSparseImageFormatProperties; |
| PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties; |
| PFN_vkGetPhysicalDeviceQueueFamilyProperties |
| GetPhysicalDeviceQueueFamilyProperties; |
| PFN_vkGetPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties; |
| PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties; |
| PFN_vkEnumerateDeviceLayerProperties EnumerateDeviceLayerProperties; |
| PFN_vkDestroySurfaceKHR DestroySurfaceKHR; |
| PFN_vkGetPhysicalDeviceSurfaceSupportKHR GetPhysicalDeviceSurfaceSupportKHR; |
| PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR |
| GetPhysicalDeviceSurfaceCapabilitiesKHR; |
| PFN_vkGetPhysicalDeviceSurfaceFormatsKHR GetPhysicalDeviceSurfaceFormatsKHR; |
| PFN_vkGetPhysicalDeviceSurfacePresentModesKHR |
| GetPhysicalDeviceSurfacePresentModesKHR; |
| PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallbackEXT; |
| PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallbackEXT; |
| PFN_vkDebugReportMessageEXT DebugReportMessageEXT; |
| #ifdef VK_USE_PLATFORM_MIR_KHR |
| PFN_vkCreateMirSurfaceKHR CreateMirSurfaceKHR; |
| PFN_vkGetPhysicalDeviceMirPresentationSupportKHR |
| GetPhysicalDeviceMirPresentationSupportKHR; |
| #endif |
| #ifdef VK_USE_PLATFORM_WAYLAND_KHR |
| PFN_vkCreateWaylandSurfaceKHR CreateWaylandSurfaceKHR; |
| PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR |
| GetPhysicalDeviceWaylandPresentationSupportKHR; |
| #endif |
| #ifdef VK_USE_PLATFORM_WIN32_KHR |
| PFN_vkCreateWin32SurfaceKHR CreateWin32SurfaceKHR; |
| PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR |
| GetPhysicalDeviceWin32PresentationSupportKHR; |
| #endif |
| #ifdef VK_USE_PLATFORM_XCB_KHR |
| PFN_vkCreateXcbSurfaceKHR CreateXcbSurfaceKHR; |
| PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR |
| GetPhysicalDeviceXcbPresentationSupportKHR; |
| #endif |
| #ifdef VK_USE_PLATFORM_XLIB_KHR |
| PFN_vkCreateXlibSurfaceKHR CreateXlibSurfaceKHR; |
| PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR |
| GetPhysicalDeviceXlibPresentationSupportKHR; |
| #endif |
| #ifdef VK_USE_PLATFORM_ANDROID_KHR |
| PFN_vkCreateAndroidSurfaceKHR CreateAndroidSurfaceKHR; |
| #endif |
| } VkLayerInstanceDispatchTable; |
| |
| // LL node for tree of dbg callback functions |
| typedef struct VkLayerDbgFunctionNode_ { |
| VkDebugReportCallbackEXT msgCallback; |
| PFN_vkDebugReportCallbackEXT pfnMsgCallback; |
| VkFlags msgFlags; |
| void *pUserData; |
| struct VkLayerDbgFunctionNode_ *pNext; |
| } VkLayerDbgFunctionNode; |
| |
| typedef enum VkLayerDbgAction_ { |
| VK_DBG_LAYER_ACTION_IGNORE = 0x0, |
| VK_DBG_LAYER_ACTION_CALLBACK = 0x1, |
| VK_DBG_LAYER_ACTION_LOG_MSG = 0x2, |
| VK_DBG_LAYER_ACTION_BREAK = 0x4, |
| VK_DBG_LAYER_ACTION_DEBUG_OUTPUT = 0x8, |
| } VkLayerDbgAction; |
| |
| // ------------------------------------------------------------------------------------------------ |
| // CreateInstance and CreateDevice support structures |
| |
| typedef enum VkLayerFunction_ { |
| VK_LAYER_LINK_INFO = 0, |
| VK_LAYER_DEVICE_INFO = 1, |
| VK_LAYER_INSTANCE_INFO = 2 |
| } VkLayerFunction; |
| |
| /* |
| * When creating the device chain the loader needs to pass |
| * down information about it's device structure needed at |
| * the end of the chain. Passing the data via the |
| * VkLayerInstanceInfo avoids issues with finding the |
| * exact instance being used. |
| */ |
| typedef struct VkLayerInstanceInfo_ { |
| void *instance_info; |
| PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; |
| } VkLayerInstanceInfo; |
| |
| typedef struct VkLayerInstanceLink_ { |
| struct VkLayerInstanceLink_ *pNext; |
| PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; |
| } VkLayerInstanceLink; |
| |
| /* |
| * When creating the device chain the loader needs to pass |
| * down information about it's device structure needed at |
| * the end of the chain. Passing the data via the |
| * VkLayerDeviceInfo avoids issues with finding the |
| * exact instance being used. |
| */ |
| typedef struct VkLayerDeviceInfo_ { |
| void *device_info; |
| PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; |
| } VkLayerDeviceInfo; |
| |
| typedef struct { |
| VkStructureType sType; // VK_STRUCTURE_TYPE_LAYER_INSTANCE_CREATE_INFO |
| const void *pNext; |
| VkLayerFunction function; |
| union { |
| VkLayerInstanceLink *pLayerInfo; |
| VkLayerInstanceInfo instanceInfo; |
| } u; |
| } VkLayerInstanceCreateInfo; |
| |
| typedef struct VkLayerDeviceLink_ { |
| struct VkLayerDeviceLink_ *pNext; |
| PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; |
| PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr; |
| } VkLayerDeviceLink; |
| |
| typedef struct { |
| VkStructureType sType; // VK_STRUCTURE_TYPE_LAYER_DEVICE_CREATE_INFO |
| const void *pNext; |
| VkLayerFunction function; |
| union { |
| VkLayerDeviceLink *pLayerInfo; |
| VkLayerDeviceInfo deviceInfo; |
| } u; |
| } VkLayerDeviceCreateInfo; |
| |
| // ------------------------------------------------------------------------------------------------ |
| // API functions |