diff options
| author | 2020-03-27 02:52:31 -0300 | |
|---|---|---|
| committer | 2020-03-27 03:21:04 -0300 | |
| commit | a9e4528d103d7d8f5cc912450a9bf071994a6044 (patch) | |
| tree | 7bbec0a9a7b223422a3cc1e17481790c193f961a /src | |
| parent | renderer_vulkan/wrapper: Add exception class (diff) | |
| download | yuzu-a9e4528d103d7d8f5cc912450a9bf071994a6044.tar.gz yuzu-a9e4528d103d7d8f5cc912450a9bf071994a6044.tar.xz yuzu-a9e4528d103d7d8f5cc912450a9bf071994a6044.zip | |
renderer_vulkan/wrapper: Add dispatch table and loaders
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.cpp | 146 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.h | 137 |
2 files changed, 283 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp index 1adf1b8c2..6d7e141e1 100644 --- a/src/video_core/renderer_vulkan/wrapper.cpp +++ b/src/video_core/renderer_vulkan/wrapper.cpp | |||
| @@ -14,6 +14,152 @@ | |||
| 14 | 14 | ||
| 15 | namespace Vulkan::vk { | 15 | namespace Vulkan::vk { |
| 16 | 16 | ||
| 17 | namespace { | ||
| 18 | |||
| 19 | template <typename T> | ||
| 20 | bool Proc(T& result, const InstanceDispatch& dld, const char* proc_name, | ||
| 21 | VkInstance instance = nullptr) noexcept { | ||
| 22 | result = reinterpret_cast<T>(dld.vkGetInstanceProcAddr(instance, proc_name)); | ||
| 23 | return result != nullptr; | ||
| 24 | } | ||
| 25 | |||
| 26 | template <typename T> | ||
| 27 | void Proc(T& result, const DeviceDispatch& dld, const char* proc_name, VkDevice device) noexcept { | ||
| 28 | result = reinterpret_cast<T>(dld.vkGetDeviceProcAddr(device, proc_name)); | ||
| 29 | } | ||
| 30 | |||
| 31 | void Load(VkDevice device, DeviceDispatch& dld) noexcept { | ||
| 32 | #define X(name) Proc(dld.name, dld, #name, device) | ||
| 33 | X(vkAcquireNextImageKHR); | ||
| 34 | X(vkAllocateCommandBuffers); | ||
| 35 | X(vkAllocateDescriptorSets); | ||
| 36 | X(vkAllocateMemory); | ||
| 37 | X(vkBeginCommandBuffer); | ||
| 38 | X(vkBindBufferMemory); | ||
| 39 | X(vkBindImageMemory); | ||
| 40 | X(vkCmdBeginQuery); | ||
| 41 | X(vkCmdBeginRenderPass); | ||
| 42 | X(vkCmdBeginTransformFeedbackEXT); | ||
| 43 | X(vkCmdBindDescriptorSets); | ||
| 44 | X(vkCmdBindIndexBuffer); | ||
| 45 | X(vkCmdBindPipeline); | ||
| 46 | X(vkCmdBindTransformFeedbackBuffersEXT); | ||
| 47 | X(vkCmdBindVertexBuffers); | ||
| 48 | X(vkCmdBlitImage); | ||
| 49 | X(vkCmdClearAttachments); | ||
| 50 | X(vkCmdCopyBuffer); | ||
| 51 | X(vkCmdCopyBufferToImage); | ||
| 52 | X(vkCmdCopyImage); | ||
| 53 | X(vkCmdCopyImageToBuffer); | ||
| 54 | X(vkCmdDispatch); | ||
| 55 | X(vkCmdDraw); | ||
| 56 | X(vkCmdDrawIndexed); | ||
| 57 | X(vkCmdEndQuery); | ||
| 58 | X(vkCmdEndRenderPass); | ||
| 59 | X(vkCmdEndTransformFeedbackEXT); | ||
| 60 | X(vkCmdFillBuffer); | ||
| 61 | X(vkCmdPipelineBarrier); | ||
| 62 | X(vkCmdPushConstants); | ||
| 63 | X(vkCmdSetBlendConstants); | ||
| 64 | X(vkCmdSetCheckpointNV); | ||
| 65 | X(vkCmdSetDepthBias); | ||
| 66 | X(vkCmdSetDepthBounds); | ||
| 67 | X(vkCmdSetScissor); | ||
| 68 | X(vkCmdSetStencilCompareMask); | ||
| 69 | X(vkCmdSetStencilReference); | ||
| 70 | X(vkCmdSetStencilWriteMask); | ||
| 71 | X(vkCmdSetViewport); | ||
| 72 | X(vkCreateBuffer); | ||
| 73 | X(vkCreateBufferView); | ||
| 74 | X(vkCreateCommandPool); | ||
| 75 | X(vkCreateComputePipelines); | ||
| 76 | X(vkCreateDescriptorPool); | ||
| 77 | X(vkCreateDescriptorSetLayout); | ||
| 78 | X(vkCreateDescriptorUpdateTemplateKHR); | ||
| 79 | X(vkCreateFence); | ||
| 80 | X(vkCreateFramebuffer); | ||
| 81 | X(vkCreateGraphicsPipelines); | ||
| 82 | X(vkCreateImage); | ||
| 83 | X(vkCreateImageView); | ||
| 84 | X(vkCreatePipelineLayout); | ||
| 85 | X(vkCreateQueryPool); | ||
| 86 | X(vkCreateRenderPass); | ||
| 87 | X(vkCreateSampler); | ||
| 88 | X(vkCreateSemaphore); | ||
| 89 | X(vkCreateShaderModule); | ||
| 90 | X(vkCreateSwapchainKHR); | ||
| 91 | X(vkDestroyBuffer); | ||
| 92 | X(vkDestroyBufferView); | ||
| 93 | X(vkDestroyCommandPool); | ||
| 94 | X(vkDestroyDescriptorPool); | ||
| 95 | X(vkDestroyDescriptorSetLayout); | ||
| 96 | X(vkDestroyDescriptorUpdateTemplateKHR); | ||
| 97 | X(vkDestroyFence); | ||
| 98 | X(vkDestroyFramebuffer); | ||
| 99 | X(vkDestroyImage); | ||
| 100 | X(vkDestroyImageView); | ||
| 101 | X(vkDestroyPipeline); | ||
| 102 | X(vkDestroyPipelineLayout); | ||
| 103 | X(vkDestroyQueryPool); | ||
| 104 | X(vkDestroyRenderPass); | ||
| 105 | X(vkDestroySampler); | ||
| 106 | X(vkDestroySemaphore); | ||
| 107 | X(vkDestroyShaderModule); | ||
| 108 | X(vkDestroySwapchainKHR); | ||
| 109 | X(vkDeviceWaitIdle); | ||
| 110 | X(vkEndCommandBuffer); | ||
| 111 | X(vkFreeCommandBuffers); | ||
| 112 | X(vkFreeDescriptorSets); | ||
| 113 | X(vkFreeMemory); | ||
| 114 | X(vkGetBufferMemoryRequirements); | ||
| 115 | X(vkGetDeviceQueue); | ||
| 116 | X(vkGetFenceStatus); | ||
| 117 | X(vkGetImageMemoryRequirements); | ||
| 118 | X(vkGetQueryPoolResults); | ||
| 119 | X(vkGetQueueCheckpointDataNV); | ||
| 120 | X(vkMapMemory); | ||
| 121 | X(vkQueueSubmit); | ||
| 122 | X(vkResetFences); | ||
| 123 | X(vkResetQueryPoolEXT); | ||
| 124 | X(vkUnmapMemory); | ||
| 125 | X(vkUpdateDescriptorSetWithTemplateKHR); | ||
| 126 | X(vkUpdateDescriptorSets); | ||
| 127 | X(vkWaitForFences); | ||
| 128 | #undef X | ||
| 129 | } | ||
| 130 | |||
| 131 | } // Anonymous namespace | ||
| 132 | |||
| 133 | bool Load(InstanceDispatch& dld) noexcept { | ||
| 134 | #define X(name) Proc(dld.name, dld, #name) | ||
| 135 | return X(vkCreateInstance) && X(vkEnumerateInstanceExtensionProperties); | ||
| 136 | #undef X | ||
| 137 | } | ||
| 138 | |||
| 139 | bool Load(VkInstance instance, InstanceDispatch& dld) noexcept { | ||
| 140 | #define X(name) Proc(dld.name, dld, #name, instance) | ||
| 141 | // These functions may fail to load depending on the enabled extensions. | ||
| 142 | // Don't return a failure on these. | ||
| 143 | X(vkCreateDebugUtilsMessengerEXT); | ||
| 144 | X(vkDestroyDebugUtilsMessengerEXT); | ||
| 145 | X(vkDestroySurfaceKHR); | ||
| 146 | X(vkGetPhysicalDeviceFeatures2KHR); | ||
| 147 | X(vkGetPhysicalDeviceProperties2KHR); | ||
| 148 | X(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); | ||
| 149 | X(vkGetPhysicalDeviceSurfaceFormatsKHR); | ||
| 150 | X(vkGetPhysicalDeviceSurfacePresentModesKHR); | ||
| 151 | X(vkGetPhysicalDeviceSurfaceSupportKHR); | ||
| 152 | X(vkGetSwapchainImagesKHR); | ||
| 153 | X(vkQueuePresentKHR); | ||
| 154 | |||
| 155 | return X(vkCreateDevice) && X(vkDestroyDevice) && X(vkDestroyDevice) && | ||
| 156 | X(vkEnumerateDeviceExtensionProperties) && X(vkEnumeratePhysicalDevices) && | ||
| 157 | X(vkGetDeviceProcAddr) && X(vkGetPhysicalDeviceFormatProperties) && | ||
| 158 | X(vkGetPhysicalDeviceMemoryProperties) && X(vkGetPhysicalDeviceProperties) && | ||
| 159 | X(vkGetPhysicalDeviceQueueFamilyProperties); | ||
| 160 | #undef X | ||
| 161 | } | ||
| 162 | |||
| 17 | const char* Exception::what() const noexcept { | 163 | const char* Exception::what() const noexcept { |
| 18 | return ToString(result); | 164 | return ToString(result); |
| 19 | } | 165 | } |
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h index b13d3882e..f5f868233 100644 --- a/src/video_core/renderer_vulkan/wrapper.h +++ b/src/video_core/renderer_vulkan/wrapper.h | |||
| @@ -113,4 +113,141 @@ inline VkResult Filter(VkResult result) { | |||
| 113 | return result; | 113 | return result; |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | /// Table holding Vulkan instance function pointers. | ||
| 117 | struct InstanceDispatch { | ||
| 118 | PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; | ||
| 119 | |||
| 120 | PFN_vkCreateInstance vkCreateInstance; | ||
| 121 | PFN_vkDestroyInstance vkDestroyInstance; | ||
| 122 | PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; | ||
| 123 | |||
| 124 | PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; | ||
| 125 | PFN_vkCreateDevice vkCreateDevice; | ||
| 126 | PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; | ||
| 127 | PFN_vkDestroyDevice vkDestroyDevice; | ||
| 128 | PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; | ||
| 129 | PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; | ||
| 130 | PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; | ||
| 131 | PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; | ||
| 132 | PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR; | ||
| 133 | PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; | ||
| 134 | PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; | ||
| 135 | PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; | ||
| 136 | PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR; | ||
| 137 | PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; | ||
| 138 | PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; | ||
| 139 | PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; | ||
| 140 | PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; | ||
| 141 | PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; | ||
| 142 | PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; | ||
| 143 | PFN_vkQueuePresentKHR vkQueuePresentKHR; | ||
| 144 | }; | ||
| 145 | |||
| 146 | /// Table holding Vulkan device function pointers. | ||
| 147 | struct DeviceDispatch : public InstanceDispatch { | ||
| 148 | PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; | ||
| 149 | PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; | ||
| 150 | PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; | ||
| 151 | PFN_vkAllocateMemory vkAllocateMemory; | ||
| 152 | PFN_vkBeginCommandBuffer vkBeginCommandBuffer; | ||
| 153 | PFN_vkBindBufferMemory vkBindBufferMemory; | ||
| 154 | PFN_vkBindImageMemory vkBindImageMemory; | ||
| 155 | PFN_vkCmdBeginQuery vkCmdBeginQuery; | ||
| 156 | PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; | ||
| 157 | PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT; | ||
| 158 | PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; | ||
| 159 | PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; | ||
| 160 | PFN_vkCmdBindPipeline vkCmdBindPipeline; | ||
| 161 | PFN_vkCmdBindTransformFeedbackBuffersEXT vkCmdBindTransformFeedbackBuffersEXT; | ||
| 162 | PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; | ||
| 163 | PFN_vkCmdBlitImage vkCmdBlitImage; | ||
| 164 | PFN_vkCmdClearAttachments vkCmdClearAttachments; | ||
| 165 | PFN_vkCmdCopyBuffer vkCmdCopyBuffer; | ||
| 166 | PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; | ||
| 167 | PFN_vkCmdCopyImage vkCmdCopyImage; | ||
| 168 | PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; | ||
| 169 | PFN_vkCmdDispatch vkCmdDispatch; | ||
| 170 | PFN_vkCmdDraw vkCmdDraw; | ||
| 171 | PFN_vkCmdDrawIndexed vkCmdDrawIndexed; | ||
| 172 | PFN_vkCmdEndQuery vkCmdEndQuery; | ||
| 173 | PFN_vkCmdEndRenderPass vkCmdEndRenderPass; | ||
| 174 | PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT; | ||
| 175 | PFN_vkCmdFillBuffer vkCmdFillBuffer; | ||
| 176 | PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; | ||
| 177 | PFN_vkCmdPushConstants vkCmdPushConstants; | ||
| 178 | PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; | ||
| 179 | PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV; | ||
| 180 | PFN_vkCmdSetDepthBias vkCmdSetDepthBias; | ||
| 181 | PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; | ||
| 182 | PFN_vkCmdSetScissor vkCmdSetScissor; | ||
| 183 | PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; | ||
| 184 | PFN_vkCmdSetStencilReference vkCmdSetStencilReference; | ||
| 185 | PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; | ||
| 186 | PFN_vkCmdSetViewport vkCmdSetViewport; | ||
| 187 | PFN_vkCreateBuffer vkCreateBuffer; | ||
| 188 | PFN_vkCreateBufferView vkCreateBufferView; | ||
| 189 | PFN_vkCreateCommandPool vkCreateCommandPool; | ||
| 190 | PFN_vkCreateComputePipelines vkCreateComputePipelines; | ||
| 191 | PFN_vkCreateDescriptorPool vkCreateDescriptorPool; | ||
| 192 | PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; | ||
| 193 | PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR; | ||
| 194 | PFN_vkCreateFence vkCreateFence; | ||
| 195 | PFN_vkCreateFramebuffer vkCreateFramebuffer; | ||
| 196 | PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; | ||
| 197 | PFN_vkCreateImage vkCreateImage; | ||
| 198 | PFN_vkCreateImageView vkCreateImageView; | ||
| 199 | PFN_vkCreatePipelineLayout vkCreatePipelineLayout; | ||
| 200 | PFN_vkCreateQueryPool vkCreateQueryPool; | ||
| 201 | PFN_vkCreateRenderPass vkCreateRenderPass; | ||
| 202 | PFN_vkCreateSampler vkCreateSampler; | ||
| 203 | PFN_vkCreateSemaphore vkCreateSemaphore; | ||
| 204 | PFN_vkCreateShaderModule vkCreateShaderModule; | ||
| 205 | PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; | ||
| 206 | PFN_vkDestroyBuffer vkDestroyBuffer; | ||
| 207 | PFN_vkDestroyBufferView vkDestroyBufferView; | ||
| 208 | PFN_vkDestroyCommandPool vkDestroyCommandPool; | ||
| 209 | PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; | ||
| 210 | PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; | ||
| 211 | PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR; | ||
| 212 | PFN_vkDestroyFence vkDestroyFence; | ||
| 213 | PFN_vkDestroyFramebuffer vkDestroyFramebuffer; | ||
| 214 | PFN_vkDestroyImage vkDestroyImage; | ||
| 215 | PFN_vkDestroyImageView vkDestroyImageView; | ||
| 216 | PFN_vkDestroyPipeline vkDestroyPipeline; | ||
| 217 | PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; | ||
| 218 | PFN_vkDestroyQueryPool vkDestroyQueryPool; | ||
| 219 | PFN_vkDestroyRenderPass vkDestroyRenderPass; | ||
| 220 | PFN_vkDestroySampler vkDestroySampler; | ||
| 221 | PFN_vkDestroySemaphore vkDestroySemaphore; | ||
| 222 | PFN_vkDestroyShaderModule vkDestroyShaderModule; | ||
| 223 | PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; | ||
| 224 | PFN_vkDeviceWaitIdle vkDeviceWaitIdle; | ||
| 225 | PFN_vkEndCommandBuffer vkEndCommandBuffer; | ||
| 226 | PFN_vkFreeCommandBuffers vkFreeCommandBuffers; | ||
| 227 | PFN_vkFreeDescriptorSets vkFreeDescriptorSets; | ||
| 228 | PFN_vkFreeMemory vkFreeMemory; | ||
| 229 | PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; | ||
| 230 | PFN_vkGetDeviceQueue vkGetDeviceQueue; | ||
| 231 | PFN_vkGetFenceStatus vkGetFenceStatus; | ||
| 232 | PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; | ||
| 233 | PFN_vkGetQueryPoolResults vkGetQueryPoolResults; | ||
| 234 | PFN_vkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNV; | ||
| 235 | PFN_vkMapMemory vkMapMemory; | ||
| 236 | PFN_vkQueueSubmit vkQueueSubmit; | ||
| 237 | PFN_vkResetFences vkResetFences; | ||
| 238 | PFN_vkResetQueryPoolEXT vkResetQueryPoolEXT; | ||
| 239 | PFN_vkUnmapMemory vkUnmapMemory; | ||
| 240 | PFN_vkUpdateDescriptorSetWithTemplateKHR vkUpdateDescriptorSetWithTemplateKHR; | ||
| 241 | PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; | ||
| 242 | PFN_vkWaitForFences vkWaitForFences; | ||
| 243 | }; | ||
| 244 | |||
| 245 | /// Loads instance agnostic function pointers. | ||
| 246 | /// @return True on success, false on error. | ||
| 247 | bool Load(InstanceDispatch&) noexcept; | ||
| 248 | |||
| 249 | /// Loads instance function pointers. | ||
| 250 | /// @return True on success, false on error. | ||
| 251 | bool Load(VkInstance, InstanceDispatch&) noexcept; | ||
| 252 | |||
| 116 | } // namespace Vulkan::vk | 253 | } // namespace Vulkan::vk |