314 lines
13 KiB
C
314 lines
13 KiB
C
//
|
|
// 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
|