• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "vk/GrVkBackendContext.h"
10 #include "vk/GrVkUtil.h"
11 
GrVkInterface()12 GrVkInterface::GrVkInterface() {
13 }
14 
15 #define GET_PROC_GLOBAL(F) functions->f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(NULL, "vk" #F)
16 #define GET_PROC(F) functions->f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk" #F)
17 #define GET_PROC_LOCAL(inst, F) PFN_vk ## F F = (PFN_vk ## F) vkGetInstanceProcAddr(inst, "vk" #F)
18 #define GET_DEV_PROC(F) functions->f ## F = (PFN_vk ## F) vkGetDeviceProcAddr(device, "vk" #F)
19 
GrVkCreateInterface(VkInstance instance,VkDevice device,uint32_t extensionFlags)20 const GrVkInterface* GrVkCreateInterface(VkInstance instance, VkDevice device,
21                                          uint32_t extensionFlags) {
22 
23     GrVkInterface* interface = new GrVkInterface();
24     GrVkInterface::Functions* functions = &interface->fFunctions;
25 
26     GET_PROC_GLOBAL(CreateInstance);
27     GET_PROC_GLOBAL(EnumerateInstanceExtensionProperties);
28     GET_PROC_GLOBAL(EnumerateInstanceLayerProperties);
29     GET_PROC(DestroyInstance);
30     GET_PROC(EnumeratePhysicalDevices);
31     GET_PROC(GetPhysicalDeviceFeatures);
32     GET_PROC(GetPhysicalDeviceFormatProperties);
33     GET_PROC(GetPhysicalDeviceImageFormatProperties);
34     GET_PROC(GetPhysicalDeviceProperties);
35     GET_PROC(GetPhysicalDeviceQueueFamilyProperties);
36     GET_PROC(GetPhysicalDeviceMemoryProperties);
37     GET_PROC(CreateDevice);
38     GET_PROC(DestroyDevice);
39     GET_PROC(EnumerateDeviceExtensionProperties);
40     GET_PROC(EnumerateDeviceLayerProperties);
41     GET_DEV_PROC(GetDeviceQueue);
42     GET_DEV_PROC(QueueSubmit);
43     GET_DEV_PROC(QueueWaitIdle);
44     GET_DEV_PROC(DeviceWaitIdle);
45     GET_DEV_PROC(AllocateMemory);
46     GET_DEV_PROC(FreeMemory);
47     GET_DEV_PROC(MapMemory);
48     GET_DEV_PROC(UnmapMemory);
49     GET_DEV_PROC(FlushMappedMemoryRanges);
50     GET_DEV_PROC(InvalidateMappedMemoryRanges);
51     GET_DEV_PROC(GetDeviceMemoryCommitment);
52     GET_DEV_PROC(BindBufferMemory);
53     GET_DEV_PROC(BindImageMemory);
54     GET_DEV_PROC(GetBufferMemoryRequirements);
55     GET_DEV_PROC(GetImageMemoryRequirements);
56     GET_DEV_PROC(GetImageSparseMemoryRequirements);
57     GET_PROC(GetPhysicalDeviceSparseImageFormatProperties);
58     GET_DEV_PROC(QueueBindSparse);
59     GET_DEV_PROC(CreateFence);
60     GET_DEV_PROC(DestroyFence);
61     GET_DEV_PROC(ResetFences);
62     GET_DEV_PROC(GetFenceStatus);
63     GET_DEV_PROC(WaitForFences);
64     GET_DEV_PROC(CreateSemaphore);
65     GET_DEV_PROC(DestroySemaphore);
66     GET_DEV_PROC(CreateEvent);
67     GET_DEV_PROC(DestroyEvent);
68     GET_DEV_PROC(GetEventStatus);
69     GET_DEV_PROC(SetEvent);
70     GET_DEV_PROC(ResetEvent);
71     GET_DEV_PROC(CreateQueryPool);
72     GET_DEV_PROC(DestroyQueryPool);
73     GET_DEV_PROC(GetQueryPoolResults);
74     GET_DEV_PROC(CreateBuffer);
75     GET_DEV_PROC(DestroyBuffer);
76     GET_DEV_PROC(CreateBufferView);
77     GET_DEV_PROC(DestroyBufferView);
78     GET_DEV_PROC(CreateImage);
79     GET_DEV_PROC(DestroyImage);
80     GET_DEV_PROC(GetImageSubresourceLayout);
81     GET_DEV_PROC(CreateImageView);
82     GET_DEV_PROC(DestroyImageView);
83     GET_DEV_PROC(CreateShaderModule);
84     GET_DEV_PROC(DestroyShaderModule);
85     GET_DEV_PROC(CreatePipelineCache);
86     GET_DEV_PROC(DestroyPipelineCache);
87     GET_DEV_PROC(GetPipelineCacheData);
88     GET_DEV_PROC(MergePipelineCaches);
89     GET_DEV_PROC(CreateGraphicsPipelines);
90     GET_DEV_PROC(CreateComputePipelines);
91     GET_DEV_PROC(DestroyPipeline);
92     GET_DEV_PROC(CreatePipelineLayout);
93     GET_DEV_PROC(DestroyPipelineLayout);
94     GET_DEV_PROC(CreateSampler);
95     GET_DEV_PROC(DestroySampler);
96     GET_DEV_PROC(CreateDescriptorSetLayout);
97     GET_DEV_PROC(DestroyDescriptorSetLayout);
98     GET_DEV_PROC(CreateDescriptorPool);
99     GET_DEV_PROC(DestroyDescriptorPool);
100     GET_DEV_PROC(ResetDescriptorPool);
101     GET_DEV_PROC(AllocateDescriptorSets);
102     GET_DEV_PROC(FreeDescriptorSets);
103     GET_DEV_PROC(UpdateDescriptorSets);
104     GET_DEV_PROC(CreateFramebuffer);
105     GET_DEV_PROC(DestroyFramebuffer);
106     GET_DEV_PROC(CreateRenderPass);
107     GET_DEV_PROC(DestroyRenderPass);
108     GET_DEV_PROC(GetRenderAreaGranularity);
109     GET_DEV_PROC(CreateCommandPool);
110     GET_DEV_PROC(DestroyCommandPool);
111     GET_DEV_PROC(ResetCommandPool);
112     GET_DEV_PROC(AllocateCommandBuffers);
113     GET_DEV_PROC(FreeCommandBuffers);
114     GET_DEV_PROC(BeginCommandBuffer);
115     GET_DEV_PROC(EndCommandBuffer);
116     GET_DEV_PROC(ResetCommandBuffer);
117     GET_DEV_PROC(CmdBindPipeline);
118     GET_DEV_PROC(CmdSetViewport);
119     GET_DEV_PROC(CmdSetScissor);
120     GET_DEV_PROC(CmdSetLineWidth);
121     GET_DEV_PROC(CmdSetDepthBias);
122     GET_DEV_PROC(CmdSetBlendConstants);
123     GET_DEV_PROC(CmdSetDepthBounds);
124     GET_DEV_PROC(CmdSetStencilCompareMask);
125     GET_DEV_PROC(CmdSetStencilWriteMask);
126     GET_DEV_PROC(CmdSetStencilReference);
127     GET_DEV_PROC(CmdBindDescriptorSets);
128     GET_DEV_PROC(CmdBindIndexBuffer);
129     GET_DEV_PROC(CmdBindVertexBuffers);
130     GET_DEV_PROC(CmdDraw);
131     GET_DEV_PROC(CmdDrawIndexed);
132     GET_DEV_PROC(CmdDrawIndirect);
133     GET_DEV_PROC(CmdDrawIndexedIndirect);
134     GET_DEV_PROC(CmdDispatch);
135     GET_DEV_PROC(CmdDispatchIndirect);
136     GET_DEV_PROC(CmdCopyBuffer);
137     GET_DEV_PROC(CmdCopyImage);
138     GET_DEV_PROC(CmdBlitImage);
139     GET_DEV_PROC(CmdCopyBufferToImage);
140     GET_DEV_PROC(CmdCopyImageToBuffer);
141     GET_DEV_PROC(CmdUpdateBuffer);
142     GET_DEV_PROC(CmdFillBuffer);
143     GET_DEV_PROC(CmdClearColorImage);
144     GET_DEV_PROC(CmdClearDepthStencilImage);
145     GET_DEV_PROC(CmdClearAttachments);
146     GET_DEV_PROC(CmdResolveImage);
147     GET_DEV_PROC(CmdSetEvent);
148     GET_DEV_PROC(CmdResetEvent);
149     GET_DEV_PROC(CmdWaitEvents);
150     GET_DEV_PROC(CmdPipelineBarrier);
151     GET_DEV_PROC(CmdBeginQuery);
152     GET_DEV_PROC(CmdEndQuery);
153     GET_DEV_PROC(CmdResetQueryPool);
154     GET_DEV_PROC(CmdWriteTimestamp);
155     GET_DEV_PROC(CmdCopyQueryPoolResults);
156     GET_DEV_PROC(CmdPushConstants);
157     GET_DEV_PROC(CmdBeginRenderPass);
158     GET_DEV_PROC(CmdNextSubpass);
159     GET_DEV_PROC(CmdEndRenderPass);
160     GET_DEV_PROC(CmdExecuteCommands);
161 
162     if (extensionFlags & kEXT_debug_report_GrVkExtensionFlag) {
163         GET_PROC(CreateDebugReportCallbackEXT);
164         GET_PROC(DebugReportMessageEXT);
165         GET_PROC(DestroyDebugReportCallbackEXT);
166     }
167 
168     return interface;
169 }
170 
171 #ifdef SK_DEBUG
172     static int kIsDebug = 1;
173 #else
174     static int kIsDebug = 0;
175 #endif
176 
177 #define RETURN_FALSE_INTERFACE                                                                   \
178     if (kIsDebug) { SkDebugf("%s:%d GrVkInterface::validate() failed.\n", __FILE__, __LINE__); } \
179     return false;
180 
validate(uint32_t extensionFlags) const181 bool GrVkInterface::validate(uint32_t extensionFlags) 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         RETURN_FALSE_INTERFACE
319     }
320 
321     if (extensionFlags & kEXT_debug_report_GrVkExtensionFlag) {
322         if (NULL == fFunctions.fCreateDebugReportCallbackEXT ||
323             NULL == fFunctions.fDebugReportMessageEXT ||
324             NULL == fFunctions.fDestroyDebugReportCallbackEXT) {
325             RETURN_FALSE_INTERFACE
326         }
327     }
328     return true;
329 }
330 
331