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 
GrVkInterface()10 GrVkInterface::GrVkInterface() {
11 }
12 
13 #define GET_PROC(F) functions->f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk" #F)
14 
GrVkCreateInterface(VkInstance instance)15 const 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 
validate() const181 bool 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