summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-03-27 02:52:31 -0300
committerGravatar ReinUsesLisp2020-03-27 03:21:04 -0300
commita9e4528d103d7d8f5cc912450a9bf071994a6044 (patch)
tree7bbec0a9a7b223422a3cc1e17481790c193f961a /src
parentrenderer_vulkan/wrapper: Add exception class (diff)
downloadyuzu-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.cpp146
-rw-r--r--src/video_core/renderer_vulkan/wrapper.h137
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
15namespace Vulkan::vk { 15namespace Vulkan::vk {
16 16
17namespace {
18
19template <typename T>
20bool 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
26template <typename T>
27void 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
31void 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
133bool Load(InstanceDispatch& dld) noexcept {
134#define X(name) Proc(dld.name, dld, #name)
135 return X(vkCreateInstance) && X(vkEnumerateInstanceExtensionProperties);
136#undef X
137}
138
139bool 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
17const char* Exception::what() const noexcept { 163const 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.
117struct 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.
147struct 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.
247bool Load(InstanceDispatch&) noexcept;
248
249/// Loads instance function pointers.
250/// @return True on success, false on error.
251bool Load(VkInstance, InstanceDispatch&) noexcept;
252
116} // namespace Vulkan::vk 253} // namespace Vulkan::vk