1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "vk/GrVkInterface.h"
9
10GrVkInterface::GrVkInterface() {
11}
12
13#define GET_PROC(F) functions->f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk" #F)
14
15const GrVkInterface* GrVkCreateInterface(VkInstance instance) {
16
17    GrVkInterface* interface = new GrVkInterface();
18    GrVkInterface::Functions* functions = &interface->fFunctions;
19
20    GET_PROC(CreateInstance);
21    GET_PROC(DestroyInstance);
22    GET_PROC(EnumeratePhysicalDevices);
23    GET_PROC(GetPhysicalDeviceFeatures);
24    GET_PROC(GetPhysicalDeviceFormatProperties);
25    GET_PROC(GetPhysicalDeviceImageFormatProperties);
26    GET_PROC(GetPhysicalDeviceProperties);
27    GET_PROC(GetPhysicalDeviceQueueFamilyProperties);
28    GET_PROC(GetPhysicalDeviceMemoryProperties);
29    GET_PROC(CreateDevice);
30    GET_PROC(DestroyDevice);
31    GET_PROC(EnumerateInstanceExtensionProperties);
32    GET_PROC(EnumerateDeviceExtensionProperties);
33    GET_PROC(EnumerateInstanceLayerProperties);
34    GET_PROC(EnumerateDeviceLayerProperties);
35    GET_PROC(GetDeviceQueue);
36    GET_PROC(QueueSubmit);
37    GET_PROC(QueueWaitIdle);
38    GET_PROC(DeviceWaitIdle);
39    GET_PROC(AllocateMemory);
40    GET_PROC(FreeMemory);
41    GET_PROC(MapMemory);
42    GET_PROC(UnmapMemory);
43    GET_PROC(FlushMappedMemoryRanges);
44    GET_PROC(InvalidateMappedMemoryRanges);
45    GET_PROC(GetDeviceMemoryCommitment);
46    GET_PROC(BindBufferMemory);
47    GET_PROC(BindImageMemory);
48    GET_PROC(GetBufferMemoryRequirements);
49    GET_PROC(GetImageMemoryRequirements);
50    GET_PROC(GetImageSparseMemoryRequirements);
51    GET_PROC(GetPhysicalDeviceSparseImageFormatProperties);
52    GET_PROC(QueueBindSparse);
53    GET_PROC(CreateFence);
54    GET_PROC(DestroyFence);
55    GET_PROC(ResetFences);
56    GET_PROC(GetFenceStatus);
57    GET_PROC(WaitForFences);
58    GET_PROC(CreateSemaphore);
59    GET_PROC(DestroySemaphore);
60    GET_PROC(CreateEvent);
61    GET_PROC(DestroyEvent);
62    GET_PROC(GetEventStatus);
63    GET_PROC(SetEvent);
64    GET_PROC(ResetEvent);
65    GET_PROC(CreateQueryPool);
66    GET_PROC(DestroyQueryPool);
67    GET_PROC(GetQueryPoolResults);
68    GET_PROC(CreateBuffer);
69    GET_PROC(DestroyBuffer);
70    GET_PROC(CreateBufferView);
71    GET_PROC(DestroyBufferView);
72    GET_PROC(CreateImage);
73    GET_PROC(DestroyImage);
74    GET_PROC(GetImageSubresourceLayout);
75    GET_PROC(CreateImageView);
76    GET_PROC(DestroyImageView);
77    GET_PROC(CreateShaderModule);
78    GET_PROC(DestroyShaderModule);
79    GET_PROC(CreatePipelineCache);
80    GET_PROC(DestroyPipelineCache);
81    GET_PROC(GetPipelineCacheData);
82    GET_PROC(MergePipelineCaches);
83    GET_PROC(CreateGraphicsPipelines);
84    GET_PROC(CreateComputePipelines);
85    GET_PROC(DestroyPipeline);
86    GET_PROC(CreatePipelineLayout);
87    GET_PROC(DestroyPipelineLayout);
88    GET_PROC(CreateSampler);
89    GET_PROC(DestroySampler);
90    GET_PROC(CreateDescriptorSetLayout);
91    GET_PROC(DestroyDescriptorSetLayout);
92    GET_PROC(CreateDescriptorPool);
93    GET_PROC(DestroyDescriptorPool);
94    GET_PROC(ResetDescriptorPool);
95    GET_PROC(AllocateDescriptorSets);
96    GET_PROC(FreeDescriptorSets);
97    GET_PROC(UpdateDescriptorSets);
98    GET_PROC(CreateFramebuffer);
99    GET_PROC(DestroyFramebuffer);
100    GET_PROC(CreateRenderPass);
101    GET_PROC(DestroyRenderPass);
102    GET_PROC(GetRenderAreaGranularity);
103    GET_PROC(CreateCommandPool);
104    GET_PROC(DestroyCommandPool);
105    GET_PROC(ResetCommandPool);
106    GET_PROC(AllocateCommandBuffers);
107    GET_PROC(FreeCommandBuffers);
108    GET_PROC(BeginCommandBuffer);
109    GET_PROC(EndCommandBuffer);
110    GET_PROC(ResetCommandBuffer);
111    GET_PROC(CmdBindPipeline);
112    GET_PROC(CmdSetViewport);
113    GET_PROC(CmdSetScissor);
114    GET_PROC(CmdSetLineWidth);
115    GET_PROC(CmdSetDepthBias);
116    GET_PROC(CmdSetBlendConstants);
117    GET_PROC(CmdSetDepthBounds);
118    GET_PROC(CmdSetStencilCompareMask);
119    GET_PROC(CmdSetStencilWriteMask);
120    GET_PROC(CmdSetStencilReference);
121    GET_PROC(CmdBindDescriptorSets);
122    GET_PROC(CmdBindIndexBuffer);
123    GET_PROC(CmdBindVertexBuffers);
124    GET_PROC(CmdDraw);
125    GET_PROC(CmdDrawIndexed);
126    GET_PROC(CmdDrawIndirect);
127    GET_PROC(CmdDrawIndexedIndirect);
128    GET_PROC(CmdDispatch);
129    GET_PROC(CmdDispatchIndirect);
130    GET_PROC(CmdCopyBuffer);
131    GET_PROC(CmdCopyImage);
132    GET_PROC(CmdBlitImage);
133    GET_PROC(CmdCopyBufferToImage);
134    GET_PROC(CmdCopyImageToBuffer);
135    GET_PROC(CmdUpdateBuffer);
136    GET_PROC(CmdFillBuffer);
137    GET_PROC(CmdClearColorImage);
138    GET_PROC(CmdClearDepthStencilImage);
139    GET_PROC(CmdClearAttachments);
140    GET_PROC(CmdResolveImage);
141    GET_PROC(CmdSetEvent);
142    GET_PROC(CmdResetEvent);
143    GET_PROC(CmdWaitEvents);
144    GET_PROC(CmdPipelineBarrier);
145    GET_PROC(CmdBeginQuery);
146    GET_PROC(CmdEndQuery);
147    GET_PROC(CmdResetQueryPool);
148    GET_PROC(CmdWriteTimestamp);
149    GET_PROC(CmdCopyQueryPoolResults);
150    GET_PROC(CmdPushConstants);
151    GET_PROC(CmdBeginRenderPass);
152    GET_PROC(CmdNextSubpass);
153    GET_PROC(CmdEndRenderPass);
154    GET_PROC(CmdExecuteCommands);
155    GET_PROC(DestroySurfaceKHR);
156    GET_PROC(GetPhysicalDeviceSurfaceSupportKHR);
157    GET_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
158    GET_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
159    GET_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
160    GET_PROC(CreateSwapchainKHR);
161    GET_PROC(DestroySwapchainKHR);
162    GET_PROC(GetSwapchainImagesKHR);
163    GET_PROC(AcquireNextImageKHR);
164    GET_PROC(QueuePresentKHR);
165    GET_PROC(GetPhysicalDeviceDisplayPropertiesKHR);
166    GET_PROC(GetPhysicalDeviceDisplayPlanePropertiesKHR);
167    GET_PROC(GetDisplayPlaneSupportedDisplaysKHR);
168    GET_PROC(GetDisplayModePropertiesKHR);
169    GET_PROC(CreateDisplayModeKHR);
170    GET_PROC(GetDisplayPlaneCapabilitiesKHR);
171    GET_PROC(CreateDisplayPlaneSurfaceKHR);
172    GET_PROC(CreateSharedSwapchainsKHR);
173
174    return interface;
175}
176
177#define RETURN_FALSE_INTERFACE                                                                   \
178    if (kIsDebug) { SkDebugf("%s:%d GrVkInterface::validate() failed.\n", __FILE__, __LINE__); } \
179    return false;
180
181bool GrVkInterface::validate() const {
182    // functions that are always required
183    if (NULL == fFunctions.fCreateInstance ||
184        NULL == fFunctions.fDestroyInstance ||
185        NULL == fFunctions.fEnumeratePhysicalDevices ||
186        NULL == fFunctions.fGetPhysicalDeviceFeatures ||
187        NULL == fFunctions.fGetPhysicalDeviceFormatProperties ||
188        NULL == fFunctions.fGetPhysicalDeviceImageFormatProperties ||
189        NULL == fFunctions.fGetPhysicalDeviceProperties ||
190        NULL == fFunctions.fGetPhysicalDeviceQueueFamilyProperties ||
191        NULL == fFunctions.fGetPhysicalDeviceMemoryProperties ||
192        NULL == fFunctions.fCreateDevice ||
193        NULL == fFunctions.fDestroyDevice ||
194        NULL == fFunctions.fEnumerateInstanceExtensionProperties ||
195        NULL == fFunctions.fEnumerateDeviceExtensionProperties ||
196        NULL == fFunctions.fEnumerateInstanceLayerProperties ||
197        NULL == fFunctions.fEnumerateDeviceLayerProperties ||
198        NULL == fFunctions.fGetDeviceQueue ||
199        NULL == fFunctions.fQueueSubmit ||
200        NULL == fFunctions.fQueueWaitIdle ||
201        NULL == fFunctions.fDeviceWaitIdle ||
202        NULL == fFunctions.fAllocateMemory ||
203        NULL == fFunctions.fFreeMemory ||
204        NULL == fFunctions.fMapMemory ||
205        NULL == fFunctions.fUnmapMemory ||
206        NULL == fFunctions.fFlushMappedMemoryRanges ||
207        NULL == fFunctions.fInvalidateMappedMemoryRanges ||
208        NULL == fFunctions.fGetDeviceMemoryCommitment ||
209        NULL == fFunctions.fBindBufferMemory ||
210        NULL == fFunctions.fBindImageMemory ||
211        NULL == fFunctions.fGetBufferMemoryRequirements ||
212        NULL == fFunctions.fGetImageMemoryRequirements ||
213        NULL == fFunctions.fGetImageSparseMemoryRequirements ||
214        NULL == fFunctions.fGetPhysicalDeviceSparseImageFormatProperties ||
215        NULL == fFunctions.fQueueBindSparse ||
216        NULL == fFunctions.fCreateFence ||
217        NULL == fFunctions.fDestroyFence ||
218        NULL == fFunctions.fResetFences ||
219        NULL == fFunctions.fGetFenceStatus ||
220        NULL == fFunctions.fWaitForFences ||
221        NULL == fFunctions.fCreateSemaphore ||
222        NULL == fFunctions.fDestroySemaphore ||
223        NULL == fFunctions.fCreateEvent ||
224        NULL == fFunctions.fDestroyEvent ||
225        NULL == fFunctions.fGetEventStatus ||
226        NULL == fFunctions.fSetEvent ||
227        NULL == fFunctions.fResetEvent ||
228        NULL == fFunctions.fCreateQueryPool ||
229        NULL == fFunctions.fDestroyQueryPool ||
230        NULL == fFunctions.fGetQueryPoolResults ||
231        NULL == fFunctions.fCreateBuffer ||
232        NULL == fFunctions.fDestroyBuffer ||
233        NULL == fFunctions.fCreateBufferView ||
234        NULL == fFunctions.fDestroyBufferView ||
235        NULL == fFunctions.fCreateImage ||
236        NULL == fFunctions.fDestroyImage ||
237        NULL == fFunctions.fGetImageSubresourceLayout ||
238        NULL == fFunctions.fCreateImageView ||
239        NULL == fFunctions.fDestroyImageView ||
240        NULL == fFunctions.fCreateShaderModule ||
241        NULL == fFunctions.fDestroyShaderModule ||
242        NULL == fFunctions.fCreatePipelineCache ||
243        NULL == fFunctions.fDestroyPipelineCache ||
244        NULL == fFunctions.fGetPipelineCacheData ||
245        NULL == fFunctions.fMergePipelineCaches ||
246        NULL == fFunctions.fCreateGraphicsPipelines ||
247        NULL == fFunctions.fCreateComputePipelines ||
248        NULL == fFunctions.fDestroyPipeline ||
249        NULL == fFunctions.fCreatePipelineLayout ||
250        NULL == fFunctions.fDestroyPipelineLayout ||
251        NULL == fFunctions.fCreateSampler ||
252        NULL == fFunctions.fDestroySampler ||
253        NULL == fFunctions.fCreateDescriptorSetLayout ||
254        NULL == fFunctions.fDestroyDescriptorSetLayout ||
255        NULL == fFunctions.fCreateDescriptorPool ||
256        NULL == fFunctions.fDestroyDescriptorPool ||
257        NULL == fFunctions.fResetDescriptorPool ||
258        NULL == fFunctions.fAllocateDescriptorSets ||
259        NULL == fFunctions.fFreeDescriptorSets ||
260        NULL == fFunctions.fUpdateDescriptorSets ||
261        NULL == fFunctions.fCreateFramebuffer ||
262        NULL == fFunctions.fDestroyFramebuffer ||
263        NULL == fFunctions.fCreateRenderPass ||
264        NULL == fFunctions.fDestroyRenderPass ||
265        NULL == fFunctions.fGetRenderAreaGranularity ||
266        NULL == fFunctions.fCreateCommandPool ||
267        NULL == fFunctions.fDestroyCommandPool ||
268        NULL == fFunctions.fResetCommandPool ||
269        NULL == fFunctions.fAllocateCommandBuffers ||
270        NULL == fFunctions.fFreeCommandBuffers ||
271        NULL == fFunctions.fBeginCommandBuffer ||
272        NULL == fFunctions.fEndCommandBuffer ||
273        NULL == fFunctions.fResetCommandBuffer ||
274        NULL == fFunctions.fCmdBindPipeline ||
275        NULL == fFunctions.fCmdSetViewport ||
276        NULL == fFunctions.fCmdSetScissor ||
277        NULL == fFunctions.fCmdSetLineWidth ||
278        NULL == fFunctions.fCmdSetDepthBias ||
279        NULL == fFunctions.fCmdSetBlendConstants ||
280        NULL == fFunctions.fCmdSetDepthBounds ||
281        NULL == fFunctions.fCmdSetStencilCompareMask ||
282        NULL == fFunctions.fCmdSetStencilWriteMask ||
283        NULL == fFunctions.fCmdSetStencilReference ||
284        NULL == fFunctions.fCmdBindDescriptorSets ||
285        NULL == fFunctions.fCmdBindIndexBuffer ||
286        NULL == fFunctions.fCmdBindVertexBuffers ||
287        NULL == fFunctions.fCmdDraw ||
288        NULL == fFunctions.fCmdDrawIndexed ||
289        NULL == fFunctions.fCmdDrawIndirect ||
290        NULL == fFunctions.fCmdDrawIndexedIndirect ||
291        NULL == fFunctions.fCmdDispatch ||
292        NULL == fFunctions.fCmdDispatchIndirect ||
293        NULL == fFunctions.fCmdCopyBuffer ||
294        NULL == fFunctions.fCmdCopyImage ||
295        NULL == fFunctions.fCmdBlitImage ||
296        NULL == fFunctions.fCmdCopyBufferToImage ||
297        NULL == fFunctions.fCmdCopyImageToBuffer ||
298        NULL == fFunctions.fCmdUpdateBuffer ||
299        NULL == fFunctions.fCmdFillBuffer ||
300        NULL == fFunctions.fCmdClearColorImage ||
301        NULL == fFunctions.fCmdClearDepthStencilImage ||
302        NULL == fFunctions.fCmdClearAttachments ||
303        NULL == fFunctions.fCmdResolveImage ||
304        NULL == fFunctions.fCmdSetEvent ||
305        NULL == fFunctions.fCmdResetEvent ||
306        NULL == fFunctions.fCmdWaitEvents ||
307        NULL == fFunctions.fCmdPipelineBarrier ||
308        NULL == fFunctions.fCmdBeginQuery ||
309        NULL == fFunctions.fCmdEndQuery ||
310        NULL == fFunctions.fCmdResetQueryPool ||
311        NULL == fFunctions.fCmdWriteTimestamp ||
312        NULL == fFunctions.fCmdCopyQueryPoolResults ||
313        NULL == fFunctions.fCmdPushConstants ||
314        NULL == fFunctions.fCmdBeginRenderPass ||
315        NULL == fFunctions.fCmdNextSubpass ||
316        NULL == fFunctions.fCmdEndRenderPass ||
317        NULL == fFunctions.fCmdExecuteCommands ||
318        NULL == fFunctions.fDestroySurfaceKHR ||
319        NULL == fFunctions.fGetPhysicalDeviceSurfaceSupportKHR ||
320        NULL == fFunctions.fGetPhysicalDeviceSurfaceCapabilitiesKHR ||
321        NULL == fFunctions.fGetPhysicalDeviceSurfaceFormatsKHR ||
322        NULL == fFunctions.fGetPhysicalDeviceSurfacePresentModesKHR ||
323        NULL == fFunctions.fCreateSwapchainKHR ||
324        NULL == fFunctions.fDestroySwapchainKHR ||
325        NULL == fFunctions.fGetSwapchainImagesKHR ||
326        NULL == fFunctions.fAcquireNextImageKHR ||
327        NULL == fFunctions.fQueuePresentKHR ||
328        NULL == fFunctions.fGetPhysicalDeviceDisplayPropertiesKHR ||
329        NULL == fFunctions.fGetPhysicalDeviceDisplayPlanePropertiesKHR ||
330        NULL == fFunctions.fGetDisplayPlaneSupportedDisplaysKHR ||
331        NULL == fFunctions.fGetDisplayModePropertiesKHR ||
332        NULL == fFunctions.fCreateDisplayModeKHR ||
333        NULL == fFunctions.fGetDisplayPlaneCapabilitiesKHR ||
334        NULL == fFunctions.fCreateDisplayPlaneSurfaceKHR ||
335        NULL == fFunctions.fCreateSharedSwapchainsKHR) {
336        return false;
337    }
338    return true;
339}
340
341