Home | History | Annotate | Download | only in vulkan
      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