blob: ceb76b9d63a59a4472cdab67c173d7d3e400274e [file] [log] [blame]
Jesse Hall04f4f472015-08-16 19:51:04 -07001/*
2* Copyright 2015 The Android Open Source Project
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17// This file is generated. Do not edit manually!
18// To regenerate: $ apic template ../api/vulkan.api get_proc_addr.cpp.tmpl
19// Requires apic from https://android.googlesource.com/platform/tools/gpu/.
20
21#include <algorithm>
22#include <log/log.h>
23#include "loader.h"
24using namespace vulkan;
25
26#define UNLIKELY(expr) __builtin_expect((expr), 0)
27
28namespace {
29
30struct NameProcEntry {
31 const char* name;
32 PFN_vkVoidFunction proc;
33};
34
35struct NameOffsetEntry {
36 const char* name;
37 size_t offset;
38};
39
40template <typename TEntry, size_t N>
41const TEntry* FindProcEntry(const TEntry(&table)[N], const char* name) {
42 auto entry = std::lower_bound(
43 table, table + N, name,
44 [](const TEntry& e, const char* n) { return strcmp(e.name, n) < 0; });
45 if (entry != (table + N) && strcmp(entry->name, name) == 0)
46 return entry;
47 return nullptr;
48}
49
50const NameProcEntry kInstanceProcTbl[] = {
51 // clang-format off
52 {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDevice)},
53 {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyInstance)},
54 {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(vkEnumeratePhysicalDevices)},
55 {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(vkGetInstanceProcAddr)},
56 {"vkGetPhysicalDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceExtensionProperties)},
57 {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceFeatures)},
58 {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceFormatProperties)},
59 {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceImageFormatProperties)},
60 {"vkGetPhysicalDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceLayerProperties)},
61 {"vkGetPhysicalDeviceLimits", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceLimits)},
62 {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceMemoryProperties)},
63 {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceProperties)},
64 {"vkGetPhysicalDeviceQueueCount", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceQueueCount)},
65 {"vkGetPhysicalDeviceQueueProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceQueueProperties)},
66 {"vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceSparseImageFormatProperties)},
67 // clang-format on
68};
69
70const NameProcEntry kDeviceProcTbl[] = {
71 // clang-format off
72 {"vkAllocDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(vkAllocDescriptorSets)},
73 {"vkAllocMemory", reinterpret_cast<PFN_vkVoidFunction>(vkAllocMemory)},
74 {"vkBeginCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkBeginCommandBuffer)},
75 {"vkBindBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(vkBindBufferMemory)},
76 {"vkBindImageMemory", reinterpret_cast<PFN_vkVoidFunction>(vkBindImageMemory)},
77 {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBeginQuery)},
78 {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBeginRenderPass)},
79 {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDescriptorSets)},
80 {"vkCmdBindDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicColorBlendState)},
81 {"vkCmdBindDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicDepthStencilState)},
82 {"vkCmdBindDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicRasterState)},
83 {"vkCmdBindDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicViewportState)},
84 {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindIndexBuffer)},
85 {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindPipeline)},
86 {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindVertexBuffers)},
87 {"vkCmdBlitImage", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBlitImage)},
88 {"vkCmdClearColorAttachment", reinterpret_cast<PFN_vkVoidFunction>(vkCmdClearColorAttachment)},
89 {"vkCmdClearColorImage", reinterpret_cast<PFN_vkVoidFunction>(vkCmdClearColorImage)},
90 {"vkCmdClearDepthStencilAttachment", reinterpret_cast<PFN_vkVoidFunction>(vkCmdClearDepthStencilAttachment)},
91 {"vkCmdClearDepthStencilImage", reinterpret_cast<PFN_vkVoidFunction>(vkCmdClearDepthStencilImage)},
92 {"vkCmdCopyBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCmdCopyBuffer)},
93 {"vkCmdCopyBufferToImage", reinterpret_cast<PFN_vkVoidFunction>(vkCmdCopyBufferToImage)},
94 {"vkCmdCopyImage", reinterpret_cast<PFN_vkVoidFunction>(vkCmdCopyImage)},
95 {"vkCmdCopyImageToBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCmdCopyImageToBuffer)},
96 {"vkCmdCopyQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(vkCmdCopyQueryPoolResults)},
97 {"vkCmdDispatch", reinterpret_cast<PFN_vkVoidFunction>(vkCmdDispatch)},
98 {"vkCmdDispatchIndirect", reinterpret_cast<PFN_vkVoidFunction>(vkCmdDispatchIndirect)},
99 {"vkCmdDraw", reinterpret_cast<PFN_vkVoidFunction>(vkCmdDraw)},
100 {"vkCmdDrawIndexed", reinterpret_cast<PFN_vkVoidFunction>(vkCmdDrawIndexed)},
101 {"vkCmdDrawIndexedIndirect", reinterpret_cast<PFN_vkVoidFunction>(vkCmdDrawIndexedIndirect)},
102 {"vkCmdDrawIndirect", reinterpret_cast<PFN_vkVoidFunction>(vkCmdDrawIndirect)},
103 {"vkCmdEndQuery", reinterpret_cast<PFN_vkVoidFunction>(vkCmdEndQuery)},
104 {"vkCmdEndRenderPass", reinterpret_cast<PFN_vkVoidFunction>(vkCmdEndRenderPass)},
105 {"vkCmdExecuteCommands", reinterpret_cast<PFN_vkVoidFunction>(vkCmdExecuteCommands)},
106 {"vkCmdFillBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCmdFillBuffer)},
107 {"vkCmdNextSubpass", reinterpret_cast<PFN_vkVoidFunction>(vkCmdNextSubpass)},
108 {"vkCmdPipelineBarrier", reinterpret_cast<PFN_vkVoidFunction>(vkCmdPipelineBarrier)},
109 {"vkCmdPushConstants", reinterpret_cast<PFN_vkVoidFunction>(vkCmdPushConstants)},
110 {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(vkCmdResetEvent)},
111 {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(vkCmdResetQueryPool)},
112 {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(vkCmdResolveImage)},
113 {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetEvent)},
114 {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCmdUpdateBuffer)},
115 {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(vkCmdWaitEvents)},
116 {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(vkCmdWriteTimestamp)},
117 {"vkCreateAttachmentView", reinterpret_cast<PFN_vkVoidFunction>(vkCreateAttachmentView)},
118 {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCreateBuffer)},
119 {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(vkCreateBufferView)},
120 {"vkCreateCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCreateCommandBuffer)},
121 {"vkCreateCommandPool", reinterpret_cast<PFN_vkVoidFunction>(vkCreateCommandPool)},
122 {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(vkCreateComputePipelines)},
123 {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDescriptorPool)},
124 {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDescriptorSetLayout)},
125 {"vkCreateDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicColorBlendState)},
126 {"vkCreateDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicDepthStencilState)},
127 {"vkCreateDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicRasterState)},
128 {"vkCreateDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicViewportState)},
129 {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(vkCreateEvent)},
130 {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(vkCreateFence)},
131 {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCreateFramebuffer)},
132 {"vkCreateGraphicsPipelines", reinterpret_cast<PFN_vkVoidFunction>(vkCreateGraphicsPipelines)},
133 {"vkCreateImage", reinterpret_cast<PFN_vkVoidFunction>(vkCreateImage)},
134 {"vkCreateImageView", reinterpret_cast<PFN_vkVoidFunction>(vkCreateImageView)},
135 {"vkCreatePipelineCache", reinterpret_cast<PFN_vkVoidFunction>(vkCreatePipelineCache)},
136 {"vkCreatePipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(vkCreatePipelineLayout)},
137 {"vkCreateQueryPool", reinterpret_cast<PFN_vkVoidFunction>(vkCreateQueryPool)},
138 {"vkCreateRenderPass", reinterpret_cast<PFN_vkVoidFunction>(vkCreateRenderPass)},
139 {"vkCreateSampler", reinterpret_cast<PFN_vkVoidFunction>(vkCreateSampler)},
140 {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(vkCreateSemaphore)},
141 {"vkCreateShader", reinterpret_cast<PFN_vkVoidFunction>(vkCreateShader)},
142 {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(vkCreateShaderModule)},
143 {"vkDestroyAttachmentView", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyAttachmentView)},
144 {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyBuffer)},
145 {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyBufferView)},
146 {"vkDestroyCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyCommandBuffer)},
147 {"vkDestroyCommandPool", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyCommandPool)},
148 {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDescriptorPool)},
149 {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDescriptorSetLayout)},
150 {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDevice)},
151 {"vkDestroyDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicColorBlendState)},
152 {"vkDestroyDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicDepthStencilState)},
153 {"vkDestroyDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicRasterState)},
154 {"vkDestroyDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicViewportState)},
155 {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyEvent)},
156 {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyFence)},
157 {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyFramebuffer)},
158 {"vkDestroyImage", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyImage)},
159 {"vkDestroyImageView", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyImageView)},
160 {"vkDestroyPipeline", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyPipeline)},
161 {"vkDestroyPipelineCache", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyPipelineCache)},
162 {"vkDestroyPipelineLayout", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyPipelineLayout)},
163 {"vkDestroyQueryPool", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyQueryPool)},
164 {"vkDestroyRenderPass", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyRenderPass)},
165 {"vkDestroySampler", reinterpret_cast<PFN_vkVoidFunction>(vkDestroySampler)},
166 {"vkDestroySemaphore", reinterpret_cast<PFN_vkVoidFunction>(vkDestroySemaphore)},
167 {"vkDestroyShader", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyShader)},
168 {"vkDestroyShaderModule", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyShaderModule)},
169 {"vkDeviceWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(vkDeviceWaitIdle)},
170 {"vkEndCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkEndCommandBuffer)},
171 {"vkFlushMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(vkFlushMappedMemoryRanges)},
172 {"vkFreeDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(vkFreeDescriptorSets)},
173 {"vkFreeMemory", reinterpret_cast<PFN_vkVoidFunction>(vkFreeMemory)},
174 {"vkGetBufferMemoryRequirements", reinterpret_cast<PFN_vkVoidFunction>(vkGetBufferMemoryRequirements)},
175 {"vkGetDeviceMemoryCommitment", reinterpret_cast<PFN_vkVoidFunction>(vkGetDeviceMemoryCommitment)},
176 {"vkGetDeviceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(vkGetDeviceProcAddr)},
177 {"vkGetDeviceQueue", reinterpret_cast<PFN_vkVoidFunction>(vkGetDeviceQueue)},
178 {"vkGetEventStatus", reinterpret_cast<PFN_vkVoidFunction>(vkGetEventStatus)},
179 {"vkGetFenceStatus", reinterpret_cast<PFN_vkVoidFunction>(vkGetFenceStatus)},
180 {"vkGetImageMemoryRequirements", reinterpret_cast<PFN_vkVoidFunction>(vkGetImageMemoryRequirements)},
181 {"vkGetImageSparseMemoryRequirements", reinterpret_cast<PFN_vkVoidFunction>(vkGetImageSparseMemoryRequirements)},
182 {"vkGetImageSubresourceLayout", reinterpret_cast<PFN_vkVoidFunction>(vkGetImageSubresourceLayout)},
183 {"vkGetPipelineCacheData", reinterpret_cast<PFN_vkVoidFunction>(vkGetPipelineCacheData)},
184 {"vkGetPipelineCacheSize", reinterpret_cast<PFN_vkVoidFunction>(vkGetPipelineCacheSize)},
185 {"vkGetQueryPoolResults", reinterpret_cast<PFN_vkVoidFunction>(vkGetQueryPoolResults)},
186 {"vkGetRenderAreaGranularity", reinterpret_cast<PFN_vkVoidFunction>(vkGetRenderAreaGranularity)},
187 {"vkInvalidateMappedMemoryRanges", reinterpret_cast<PFN_vkVoidFunction>(vkInvalidateMappedMemoryRanges)},
188 {"vkMapMemory", reinterpret_cast<PFN_vkVoidFunction>(vkMapMemory)},
189 {"vkMergePipelineCaches", reinterpret_cast<PFN_vkVoidFunction>(vkMergePipelineCaches)},
190 {"vkQueueBindSparseBufferMemory", reinterpret_cast<PFN_vkVoidFunction>(vkQueueBindSparseBufferMemory)},
191 {"vkQueueBindSparseImageMemory", reinterpret_cast<PFN_vkVoidFunction>(vkQueueBindSparseImageMemory)},
192 {"vkQueueBindSparseImageOpaqueMemory", reinterpret_cast<PFN_vkVoidFunction>(vkQueueBindSparseImageOpaqueMemory)},
193 {"vkQueueSignalSemaphore", reinterpret_cast<PFN_vkVoidFunction>(vkQueueSignalSemaphore)},
194 {"vkQueueSubmit", reinterpret_cast<PFN_vkVoidFunction>(vkQueueSubmit)},
195 {"vkQueueWaitIdle", reinterpret_cast<PFN_vkVoidFunction>(vkQueueWaitIdle)},
196 {"vkQueueWaitSemaphore", reinterpret_cast<PFN_vkVoidFunction>(vkQueueWaitSemaphore)},
197 {"vkResetCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkResetCommandBuffer)},
198 {"vkResetCommandPool", reinterpret_cast<PFN_vkVoidFunction>(vkResetCommandPool)},
199 {"vkResetDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(vkResetDescriptorPool)},
200 {"vkResetEvent", reinterpret_cast<PFN_vkVoidFunction>(vkResetEvent)},
201 {"vkResetFences", reinterpret_cast<PFN_vkVoidFunction>(vkResetFences)},
202 {"vkSetEvent", reinterpret_cast<PFN_vkVoidFunction>(vkSetEvent)},
203 {"vkUnmapMemory", reinterpret_cast<PFN_vkVoidFunction>(vkUnmapMemory)},
204 {"vkUpdateDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(vkUpdateDescriptorSets)},
205 {"vkWaitForFences", reinterpret_cast<PFN_vkVoidFunction>(vkWaitForFences)},
206 // clang-format on
207};
208
209const NameOffsetEntry kInstanceOffsetTbl[] = {
210 // clang-format off
211 {"vkCreateDevice", offsetof(InstanceVtbl, CreateDevice)},
212 {"vkDestroyInstance", offsetof(InstanceVtbl, DestroyInstance)},
213 {"vkEnumeratePhysicalDevices", offsetof(InstanceVtbl, EnumeratePhysicalDevices)},
214 {"vkGetInstanceProcAddr", offsetof(InstanceVtbl, GetInstanceProcAddr)},
215 {"vkGetPhysicalDeviceExtensionProperties", offsetof(InstanceVtbl, GetPhysicalDeviceExtensionProperties)},
216 {"vkGetPhysicalDeviceFeatures", offsetof(InstanceVtbl, GetPhysicalDeviceFeatures)},
217 {"vkGetPhysicalDeviceFormatProperties", offsetof(InstanceVtbl, GetPhysicalDeviceFormatProperties)},
218 {"vkGetPhysicalDeviceImageFormatProperties", offsetof(InstanceVtbl, GetPhysicalDeviceImageFormatProperties)},
219 {"vkGetPhysicalDeviceLayerProperties", offsetof(InstanceVtbl, GetPhysicalDeviceLayerProperties)},
220 {"vkGetPhysicalDeviceLimits", offsetof(InstanceVtbl, GetPhysicalDeviceLimits)},
221 {"vkGetPhysicalDeviceMemoryProperties", offsetof(InstanceVtbl, GetPhysicalDeviceMemoryProperties)},
222 {"vkGetPhysicalDeviceProperties", offsetof(InstanceVtbl, GetPhysicalDeviceProperties)},
223 {"vkGetPhysicalDeviceQueueCount", offsetof(InstanceVtbl, GetPhysicalDeviceQueueCount)},
224 {"vkGetPhysicalDeviceQueueProperties", offsetof(InstanceVtbl, GetPhysicalDeviceQueueProperties)},
225 {"vkGetPhysicalDeviceSparseImageFormatProperties", offsetof(InstanceVtbl, GetPhysicalDeviceSparseImageFormatProperties)},
226 // clang-format on
227};
228
229const NameOffsetEntry kDeviceOffsetTbl[] = {
230 // clang-format off
231 {"vkAllocDescriptorSets", offsetof(DeviceVtbl, AllocDescriptorSets)},
232 {"vkAllocMemory", offsetof(DeviceVtbl, AllocMemory)},
233 {"vkBeginCommandBuffer", offsetof(DeviceVtbl, BeginCommandBuffer)},
234 {"vkBindBufferMemory", offsetof(DeviceVtbl, BindBufferMemory)},
235 {"vkBindImageMemory", offsetof(DeviceVtbl, BindImageMemory)},
236 {"vkCmdBeginQuery", offsetof(DeviceVtbl, CmdBeginQuery)},
237 {"vkCmdBeginRenderPass", offsetof(DeviceVtbl, CmdBeginRenderPass)},
238 {"vkCmdBindDescriptorSets", offsetof(DeviceVtbl, CmdBindDescriptorSets)},
239 {"vkCmdBindDynamicColorBlendState", offsetof(DeviceVtbl, CmdBindDynamicColorBlendState)},
240 {"vkCmdBindDynamicDepthStencilState", offsetof(DeviceVtbl, CmdBindDynamicDepthStencilState)},
241 {"vkCmdBindDynamicRasterState", offsetof(DeviceVtbl, CmdBindDynamicRasterState)},
242 {"vkCmdBindDynamicViewportState", offsetof(DeviceVtbl, CmdBindDynamicViewportState)},
243 {"vkCmdBindIndexBuffer", offsetof(DeviceVtbl, CmdBindIndexBuffer)},
244 {"vkCmdBindPipeline", offsetof(DeviceVtbl, CmdBindPipeline)},
245 {"vkCmdBindVertexBuffers", offsetof(DeviceVtbl, CmdBindVertexBuffers)},
246 {"vkCmdBlitImage", offsetof(DeviceVtbl, CmdBlitImage)},
247 {"vkCmdClearColorAttachment", offsetof(DeviceVtbl, CmdClearColorAttachment)},
248 {"vkCmdClearColorImage", offsetof(DeviceVtbl, CmdClearColorImage)},
249 {"vkCmdClearDepthStencilAttachment", offsetof(DeviceVtbl, CmdClearDepthStencilAttachment)},
250 {"vkCmdClearDepthStencilImage", offsetof(DeviceVtbl, CmdClearDepthStencilImage)},
251 {"vkCmdCopyBuffer", offsetof(DeviceVtbl, CmdCopyBuffer)},
252 {"vkCmdCopyBufferToImage", offsetof(DeviceVtbl, CmdCopyBufferToImage)},
253 {"vkCmdCopyImage", offsetof(DeviceVtbl, CmdCopyImage)},
254 {"vkCmdCopyImageToBuffer", offsetof(DeviceVtbl, CmdCopyImageToBuffer)},
255 {"vkCmdCopyQueryPoolResults", offsetof(DeviceVtbl, CmdCopyQueryPoolResults)},
256 {"vkCmdDispatch", offsetof(DeviceVtbl, CmdDispatch)},
257 {"vkCmdDispatchIndirect", offsetof(DeviceVtbl, CmdDispatchIndirect)},
258 {"vkCmdDraw", offsetof(DeviceVtbl, CmdDraw)},
259 {"vkCmdDrawIndexed", offsetof(DeviceVtbl, CmdDrawIndexed)},
260 {"vkCmdDrawIndexedIndirect", offsetof(DeviceVtbl, CmdDrawIndexedIndirect)},
261 {"vkCmdDrawIndirect", offsetof(DeviceVtbl, CmdDrawIndirect)},
262 {"vkCmdEndQuery", offsetof(DeviceVtbl, CmdEndQuery)},
263 {"vkCmdEndRenderPass", offsetof(DeviceVtbl, CmdEndRenderPass)},
264 {"vkCmdExecuteCommands", offsetof(DeviceVtbl, CmdExecuteCommands)},
265 {"vkCmdFillBuffer", offsetof(DeviceVtbl, CmdFillBuffer)},
266 {"vkCmdNextSubpass", offsetof(DeviceVtbl, CmdNextSubpass)},
267 {"vkCmdPipelineBarrier", offsetof(DeviceVtbl, CmdPipelineBarrier)},
268 {"vkCmdPushConstants", offsetof(DeviceVtbl, CmdPushConstants)},
269 {"vkCmdResetEvent", offsetof(DeviceVtbl, CmdResetEvent)},
270 {"vkCmdResetQueryPool", offsetof(DeviceVtbl, CmdResetQueryPool)},
271 {"vkCmdResolveImage", offsetof(DeviceVtbl, CmdResolveImage)},
272 {"vkCmdSetEvent", offsetof(DeviceVtbl, CmdSetEvent)},
273 {"vkCmdUpdateBuffer", offsetof(DeviceVtbl, CmdUpdateBuffer)},
274 {"vkCmdWaitEvents", offsetof(DeviceVtbl, CmdWaitEvents)},
275 {"vkCmdWriteTimestamp", offsetof(DeviceVtbl, CmdWriteTimestamp)},
276 {"vkCreateAttachmentView", offsetof(DeviceVtbl, CreateAttachmentView)},
277 {"vkCreateBuffer", offsetof(DeviceVtbl, CreateBuffer)},
278 {"vkCreateBufferView", offsetof(DeviceVtbl, CreateBufferView)},
279 {"vkCreateCommandBuffer", offsetof(DeviceVtbl, CreateCommandBuffer)},
280 {"vkCreateCommandPool", offsetof(DeviceVtbl, CreateCommandPool)},
281 {"vkCreateComputePipelines", offsetof(DeviceVtbl, CreateComputePipelines)},
282 {"vkCreateDescriptorPool", offsetof(DeviceVtbl, CreateDescriptorPool)},
283 {"vkCreateDescriptorSetLayout", offsetof(DeviceVtbl, CreateDescriptorSetLayout)},
284 {"vkCreateDynamicColorBlendState", offsetof(DeviceVtbl, CreateDynamicColorBlendState)},
285 {"vkCreateDynamicDepthStencilState", offsetof(DeviceVtbl, CreateDynamicDepthStencilState)},
286 {"vkCreateDynamicRasterState", offsetof(DeviceVtbl, CreateDynamicRasterState)},
287 {"vkCreateDynamicViewportState", offsetof(DeviceVtbl, CreateDynamicViewportState)},
288 {"vkCreateEvent", offsetof(DeviceVtbl, CreateEvent)},
289 {"vkCreateFence", offsetof(DeviceVtbl, CreateFence)},
290 {"vkCreateFramebuffer", offsetof(DeviceVtbl, CreateFramebuffer)},
291 {"vkCreateGraphicsPipelines", offsetof(DeviceVtbl, CreateGraphicsPipelines)},
292 {"vkCreateImage", offsetof(DeviceVtbl, CreateImage)},
293 {"vkCreateImageView", offsetof(DeviceVtbl, CreateImageView)},
294 {"vkCreatePipelineCache", offsetof(DeviceVtbl, CreatePipelineCache)},
295 {"vkCreatePipelineLayout", offsetof(DeviceVtbl, CreatePipelineLayout)},
296 {"vkCreateQueryPool", offsetof(DeviceVtbl, CreateQueryPool)},
297 {"vkCreateRenderPass", offsetof(DeviceVtbl, CreateRenderPass)},
298 {"vkCreateSampler", offsetof(DeviceVtbl, CreateSampler)},
299 {"vkCreateSemaphore", offsetof(DeviceVtbl, CreateSemaphore)},
300 {"vkCreateShader", offsetof(DeviceVtbl, CreateShader)},
301 {"vkCreateShaderModule", offsetof(DeviceVtbl, CreateShaderModule)},
302 {"vkDestroyAttachmentView", offsetof(DeviceVtbl, DestroyAttachmentView)},
303 {"vkDestroyBuffer", offsetof(DeviceVtbl, DestroyBuffer)},
304 {"vkDestroyBufferView", offsetof(DeviceVtbl, DestroyBufferView)},
305 {"vkDestroyCommandBuffer", offsetof(DeviceVtbl, DestroyCommandBuffer)},
306 {"vkDestroyCommandPool", offsetof(DeviceVtbl, DestroyCommandPool)},
307 {"vkDestroyDescriptorPool", offsetof(DeviceVtbl, DestroyDescriptorPool)},
308 {"vkDestroyDescriptorSetLayout", offsetof(DeviceVtbl, DestroyDescriptorSetLayout)},
309 {"vkDestroyDevice", offsetof(DeviceVtbl, DestroyDevice)},
310 {"vkDestroyDynamicColorBlendState", offsetof(DeviceVtbl, DestroyDynamicColorBlendState)},
311 {"vkDestroyDynamicDepthStencilState", offsetof(DeviceVtbl, DestroyDynamicDepthStencilState)},
312 {"vkDestroyDynamicRasterState", offsetof(DeviceVtbl, DestroyDynamicRasterState)},
313 {"vkDestroyDynamicViewportState", offsetof(DeviceVtbl, DestroyDynamicViewportState)},
314 {"vkDestroyEvent", offsetof(DeviceVtbl, DestroyEvent)},
315 {"vkDestroyFence", offsetof(DeviceVtbl, DestroyFence)},
316 {"vkDestroyFramebuffer", offsetof(DeviceVtbl, DestroyFramebuffer)},
317 {"vkDestroyImage", offsetof(DeviceVtbl, DestroyImage)},
318 {"vkDestroyImageView", offsetof(DeviceVtbl, DestroyImageView)},
319 {"vkDestroyPipeline", offsetof(DeviceVtbl, DestroyPipeline)},
320 {"vkDestroyPipelineCache", offsetof(DeviceVtbl, DestroyPipelineCache)},
321 {"vkDestroyPipelineLayout", offsetof(DeviceVtbl, DestroyPipelineLayout)},
322 {"vkDestroyQueryPool", offsetof(DeviceVtbl, DestroyQueryPool)},
323 {"vkDestroyRenderPass", offsetof(DeviceVtbl, DestroyRenderPass)},
324 {"vkDestroySampler", offsetof(DeviceVtbl, DestroySampler)},
325 {"vkDestroySemaphore", offsetof(DeviceVtbl, DestroySemaphore)},
326 {"vkDestroyShader", offsetof(DeviceVtbl, DestroyShader)},
327 {"vkDestroyShaderModule", offsetof(DeviceVtbl, DestroyShaderModule)},
328 {"vkDeviceWaitIdle", offsetof(DeviceVtbl, DeviceWaitIdle)},
329 {"vkEndCommandBuffer", offsetof(DeviceVtbl, EndCommandBuffer)},
330 {"vkFlushMappedMemoryRanges", offsetof(DeviceVtbl, FlushMappedMemoryRanges)},
331 {"vkFreeDescriptorSets", offsetof(DeviceVtbl, FreeDescriptorSets)},
332 {"vkFreeMemory", offsetof(DeviceVtbl, FreeMemory)},
333 {"vkGetBufferMemoryRequirements", offsetof(DeviceVtbl, GetBufferMemoryRequirements)},
334 {"vkGetDeviceMemoryCommitment", offsetof(DeviceVtbl, GetDeviceMemoryCommitment)},
335 {"vkGetDeviceProcAddr", offsetof(DeviceVtbl, GetDeviceProcAddr)},
336 {"vkGetDeviceQueue", offsetof(DeviceVtbl, GetDeviceQueue)},
337 {"vkGetEventStatus", offsetof(DeviceVtbl, GetEventStatus)},
338 {"vkGetFenceStatus", offsetof(DeviceVtbl, GetFenceStatus)},
339 {"vkGetImageMemoryRequirements", offsetof(DeviceVtbl, GetImageMemoryRequirements)},
340 {"vkGetImageSparseMemoryRequirements", offsetof(DeviceVtbl, GetImageSparseMemoryRequirements)},
341 {"vkGetImageSubresourceLayout", offsetof(DeviceVtbl, GetImageSubresourceLayout)},
342 {"vkGetPipelineCacheData", offsetof(DeviceVtbl, GetPipelineCacheData)},
343 {"vkGetPipelineCacheSize", offsetof(DeviceVtbl, GetPipelineCacheSize)},
344 {"vkGetQueryPoolResults", offsetof(DeviceVtbl, GetQueryPoolResults)},
345 {"vkGetRenderAreaGranularity", offsetof(DeviceVtbl, GetRenderAreaGranularity)},
346 {"vkInvalidateMappedMemoryRanges", offsetof(DeviceVtbl, InvalidateMappedMemoryRanges)},
347 {"vkMapMemory", offsetof(DeviceVtbl, MapMemory)},
348 {"vkMergePipelineCaches", offsetof(DeviceVtbl, MergePipelineCaches)},
349 {"vkQueueBindSparseBufferMemory", offsetof(DeviceVtbl, QueueBindSparseBufferMemory)},
350 {"vkQueueBindSparseImageMemory", offsetof(DeviceVtbl, QueueBindSparseImageMemory)},
351 {"vkQueueBindSparseImageOpaqueMemory", offsetof(DeviceVtbl, QueueBindSparseImageOpaqueMemory)},
352 {"vkQueueSignalSemaphore", offsetof(DeviceVtbl, QueueSignalSemaphore)},
353 {"vkQueueSubmit", offsetof(DeviceVtbl, QueueSubmit)},
354 {"vkQueueWaitIdle", offsetof(DeviceVtbl, QueueWaitIdle)},
355 {"vkQueueWaitSemaphore", offsetof(DeviceVtbl, QueueWaitSemaphore)},
356 {"vkResetCommandBuffer", offsetof(DeviceVtbl, ResetCommandBuffer)},
357 {"vkResetCommandPool", offsetof(DeviceVtbl, ResetCommandPool)},
358 {"vkResetDescriptorPool", offsetof(DeviceVtbl, ResetDescriptorPool)},
359 {"vkResetEvent", offsetof(DeviceVtbl, ResetEvent)},
360 {"vkResetFences", offsetof(DeviceVtbl, ResetFences)},
361 {"vkSetEvent", offsetof(DeviceVtbl, SetEvent)},
362 {"vkUnmapMemory", offsetof(DeviceVtbl, UnmapMemory)},
363 {"vkUpdateDescriptorSets", offsetof(DeviceVtbl, UpdateDescriptorSets)},
364 {"vkWaitForFences", offsetof(DeviceVtbl, WaitForFences)},
365 // clang-format on
366};
367
368} // namespace
369
370namespace vulkan {
371
372PFN_vkVoidFunction GetGlobalInstanceProcAddr(const char* name) {
Jesse Hallb1352bc2015-09-04 16:12:33 -0700373 const NameProcEntry* entry = FindProcEntry(kInstanceProcTbl, name);
374 if (entry)
375 return entry->proc;
376 // vkGetDeviceProcAddr must be available at the global/instance level for
377 // bootstrapping
Jesse Hall04f4f472015-08-16 19:51:04 -0700378 if (strcmp(name, "vkGetDeviceProcAddr") == 0)
379 return reinterpret_cast<PFN_vkVoidFunction>(vkGetDeviceProcAddr);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700380 // special-case extension functions until they can be auto-generated
381 if (strcmp(name, "vkGetPhysicalDeviceSurfaceSupportKHR") == 0)
382 return reinterpret_cast<PFN_vkVoidFunction>(
383 vkGetPhysicalDeviceSurfaceSupportKHR);
384 return nullptr;
Jesse Hall04f4f472015-08-16 19:51:04 -0700385}
386
387PFN_vkVoidFunction GetGlobalDeviceProcAddr(const char* name) {
388 const NameProcEntry* entry = FindProcEntry(kDeviceProcTbl, name);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700389 if (entry)
390 return entry->proc;
391 // special-case extension functions until they can be auto-generated
392 if (strcmp(name, "vkGetSurfacePropertiesKHR") == 0)
393 return reinterpret_cast<PFN_vkVoidFunction>(vkGetSurfacePropertiesKHR);
394 if (strcmp(name, "vkGetSurfaceFormatsKHR") == 0)
395 return reinterpret_cast<PFN_vkVoidFunction>(vkGetSurfaceFormatsKHR);
396 if (strcmp(name, "vkGetSurfacePresentModesKHR") == 0)
397 return reinterpret_cast<PFN_vkVoidFunction>(
398 vkGetSurfacePresentModesKHR);
399 if (strcmp(name, "vkCreateSwapchainKHR") == 0)
400 return reinterpret_cast<PFN_vkVoidFunction>(vkCreateSwapchainKHR);
401 if (strcmp(name, "vkDestroySwapchainKHR") == 0)
402 return reinterpret_cast<PFN_vkVoidFunction>(vkDestroySwapchainKHR);
403 if (strcmp(name, "vkGetSwapchainImagesKHR") == 0)
404 return reinterpret_cast<PFN_vkVoidFunction>(vkGetSwapchainImagesKHR);
405 if (strcmp(name, "vkAcquireNextImageKHR") == 0)
406 return reinterpret_cast<PFN_vkVoidFunction>(vkAcquireNextImageKHR);
407 if (strcmp(name, "vkQueuePresentKHR") == 0)
408 return reinterpret_cast<PFN_vkVoidFunction>(vkQueuePresentKHR);
409 return nullptr;
Jesse Hall04f4f472015-08-16 19:51:04 -0700410}
411
412PFN_vkVoidFunction GetSpecificInstanceProcAddr(const InstanceVtbl* vtbl,
413 const char* name) {
Jesse Hallb1352bc2015-09-04 16:12:33 -0700414 size_t offset;
Jesse Hall04f4f472015-08-16 19:51:04 -0700415 const NameOffsetEntry* entry = FindProcEntry(kInstanceOffsetTbl, name);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700416 if (entry)
417 offset = entry->offset;
418 else if (strcmp(name, "vkGetPhysicalDeviceSurfaceSupportKHR") == 0)
419 offset = offsetof(InstanceVtbl, GetPhysicalDeviceSurfaceSupportKHR);
420 else
Jesse Hall04f4f472015-08-16 19:51:04 -0700421 return nullptr;
422 const unsigned char* base = reinterpret_cast<const unsigned char*>(vtbl);
Michael Lentine62270162015-09-15 13:25:36 -0500423 return *reinterpret_cast<PFN_vkVoidFunction*>(
Jesse Hall04f4f472015-08-16 19:51:04 -0700424 const_cast<unsigned char*>(base) + entry->offset);
425}
426
427PFN_vkVoidFunction GetSpecificDeviceProcAddr(const DeviceVtbl* vtbl,
428 const char* name) {
Jesse Hallb1352bc2015-09-04 16:12:33 -0700429 size_t offset;
Jesse Hall04f4f472015-08-16 19:51:04 -0700430 const NameOffsetEntry* entry = FindProcEntry(kDeviceOffsetTbl, name);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700431 if (entry)
432 offset = entry->offset;
433 else if (strcmp(name, "vkGetSurfacePropertiesKHR") == 0)
434 offset = offsetof(DeviceVtbl, GetSurfacePropertiesKHR);
435 else if (strcmp(name, "vkGetSurfaceFormatsKHR") == 0)
436 offset = offsetof(DeviceVtbl, GetSurfaceFormatsKHR);
437 else if (strcmp(name, "vkGetSurfacePresentModesKHR") == 0)
438 offset = offsetof(DeviceVtbl, GetSurfacePresentModesKHR);
439 else if (strcmp(name, "vkCreateSwapchainKHR") == 0)
440 offset = offsetof(DeviceVtbl, CreateSwapchainKHR);
441 else if (strcmp(name, "vkDestroySwapchainKHR") == 0)
442 offset = offsetof(DeviceVtbl, DestroySwapchainKHR);
443 else if (strcmp(name, "vkGetSwapchainImagesKHR") == 0)
444 offset = offsetof(DeviceVtbl, GetSwapchainImagesKHR);
445 else if (strcmp(name, "vkAcquireNextImageKHR") == 0)
446 offset = offsetof(DeviceVtbl, AcquireNextImageKHR);
447 else if (strcmp(name, "vkQueuePresentKHR") == 0)
448 offset = offsetof(DeviceVtbl, QueuePresentKHR);
449 else
Jesse Hall04f4f472015-08-16 19:51:04 -0700450 return nullptr;
451 const unsigned char* base = reinterpret_cast<const unsigned char*>(vtbl);
Michael Lentine62270162015-09-15 13:25:36 -0500452 return *reinterpret_cast<PFN_vkVoidFunction*>(
Jesse Hall04f4f472015-08-16 19:51:04 -0700453 const_cast<unsigned char*>(base) + entry->offset);
454}
455
Michael Lentine03c64b02015-08-26 18:27:26 -0500456// TODO: remove need for instance_next
Jesse Hall04f4f472015-08-16 19:51:04 -0700457bool LoadInstanceVtbl(VkInstance instance,
Michael Lentine03c64b02015-08-26 18:27:26 -0500458 VkInstance instance_next,
Jesse Hall04f4f472015-08-16 19:51:04 -0700459 PFN_vkGetInstanceProcAddr get_proc_addr,
460 InstanceVtbl& vtbl) {
461 bool success = true;
462 // clang-format off
Michael Lentine03c64b02015-08-26 18:27:26 -0500463 vtbl.GetInstanceProcAddr = reinterpret_cast<PFN_vkGetInstanceProcAddr>(get_proc_addr(instance_next, "vkGetInstanceProcAddr"));
464 if (UNLIKELY(!vtbl.GetInstanceProcAddr)) {
465 ALOGE("missing instance proc: %s", "vkGetInstanceProcAddr");
466 success = false;
467 }
468 vtbl.CreateInstance = reinterpret_cast<PFN_vkCreateInstance>(get_proc_addr(instance, "vkCreateInstance"));
469 if (UNLIKELY(!vtbl.CreateInstance)) {
470 // This is allowed to fail as the driver doesn't have to return vkCreateInstance when given an instance
471 }
Jesse Hall04f4f472015-08-16 19:51:04 -0700472 vtbl.DestroyInstance = reinterpret_cast<PFN_vkDestroyInstance>(get_proc_addr(instance, "vkDestroyInstance"));
473 if (UNLIKELY(!vtbl.DestroyInstance)) {
474 ALOGE("missing instance proc: %s", "vkDestroyInstance");
475 success = false;
476 }
477 vtbl.EnumeratePhysicalDevices = reinterpret_cast<PFN_vkEnumeratePhysicalDevices>(get_proc_addr(instance, "vkEnumeratePhysicalDevices"));
478 if (UNLIKELY(!vtbl.EnumeratePhysicalDevices)) {
479 ALOGE("missing instance proc: %s", "vkEnumeratePhysicalDevices");
480 success = false;
481 }
Jesse Hall04f4f472015-08-16 19:51:04 -0700482 vtbl.GetPhysicalDeviceProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceProperties"));
483 if (UNLIKELY(!vtbl.GetPhysicalDeviceProperties)) {
484 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceProperties");
485 success = false;
486 }
487 vtbl.GetPhysicalDeviceQueueCount = reinterpret_cast<PFN_vkGetPhysicalDeviceQueueCount>(get_proc_addr(instance, "vkGetPhysicalDeviceQueueCount"));
488 if (UNLIKELY(!vtbl.GetPhysicalDeviceQueueCount)) {
489 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceQueueCount");
490 success = false;
491 }
492 vtbl.GetPhysicalDeviceQueueProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceQueueProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceQueueProperties"));
493 if (UNLIKELY(!vtbl.GetPhysicalDeviceQueueProperties)) {
494 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceQueueProperties");
495 success = false;
496 }
497 vtbl.GetPhysicalDeviceMemoryProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceMemoryProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceMemoryProperties"));
498 if (UNLIKELY(!vtbl.GetPhysicalDeviceMemoryProperties)) {
499 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceMemoryProperties");
500 success = false;
501 }
502 vtbl.GetPhysicalDeviceFeatures = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures>(get_proc_addr(instance, "vkGetPhysicalDeviceFeatures"));
503 if (UNLIKELY(!vtbl.GetPhysicalDeviceFeatures)) {
504 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceFeatures");
505 success = false;
506 }
507 vtbl.GetPhysicalDeviceFormatProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceFormatProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceFormatProperties"));
508 if (UNLIKELY(!vtbl.GetPhysicalDeviceFormatProperties)) {
509 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceFormatProperties");
510 success = false;
511 }
512 vtbl.GetPhysicalDeviceImageFormatProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceImageFormatProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceImageFormatProperties"));
513 if (UNLIKELY(!vtbl.GetPhysicalDeviceImageFormatProperties)) {
514 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceImageFormatProperties");
515 success = false;
516 }
517 vtbl.GetPhysicalDeviceLimits = reinterpret_cast<PFN_vkGetPhysicalDeviceLimits>(get_proc_addr(instance, "vkGetPhysicalDeviceLimits"));
518 if (UNLIKELY(!vtbl.GetPhysicalDeviceLimits)) {
519 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceLimits");
520 success = false;
521 }
522 vtbl.CreateDevice = reinterpret_cast<PFN_vkCreateDevice>(get_proc_addr(instance, "vkCreateDevice"));
523 if (UNLIKELY(!vtbl.CreateDevice)) {
524 ALOGE("missing instance proc: %s", "vkCreateDevice");
525 success = false;
526 }
527 vtbl.GetPhysicalDeviceLayerProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceLayerProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceLayerProperties"));
528 if (UNLIKELY(!vtbl.GetPhysicalDeviceLayerProperties)) {
529 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceLayerProperties");
530 success = false;
531 }
532 vtbl.GetPhysicalDeviceExtensionProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceExtensionProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceExtensionProperties"));
533 if (UNLIKELY(!vtbl.GetPhysicalDeviceExtensionProperties)) {
534 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceExtensionProperties");
535 success = false;
536 }
537 vtbl.GetPhysicalDeviceSparseImageFormatProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceSparseImageFormatProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties"));
538 if (UNLIKELY(!vtbl.GetPhysicalDeviceSparseImageFormatProperties)) {
539 ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceSparseImageFormatProperties");
540 success = false;
541 }
542 // clang-format on
543 return success;
544}
545
546bool LoadDeviceVtbl(VkDevice device,
Michael Lentine03c64b02015-08-26 18:27:26 -0500547 VkDevice device_next,
Jesse Hall04f4f472015-08-16 19:51:04 -0700548 PFN_vkGetDeviceProcAddr get_proc_addr,
549 DeviceVtbl& vtbl) {
550 bool success = true;
551 // clang-format off
Michael Lentine03c64b02015-08-26 18:27:26 -0500552 vtbl.GetDeviceProcAddr = reinterpret_cast<PFN_vkGetDeviceProcAddr>(get_proc_addr(device_next, "vkGetDeviceProcAddr"));
Jesse Hall04f4f472015-08-16 19:51:04 -0700553 if (UNLIKELY(!vtbl.GetDeviceProcAddr)) {
554 ALOGE("missing device proc: %s", "vkGetDeviceProcAddr");
555 success = false;
556 }
557 vtbl.DestroyDevice = reinterpret_cast<PFN_vkDestroyDevice>(get_proc_addr(device, "vkDestroyDevice"));
558 if (UNLIKELY(!vtbl.DestroyDevice)) {
559 ALOGE("missing device proc: %s", "vkDestroyDevice");
560 success = false;
561 }
562 vtbl.GetDeviceQueue = reinterpret_cast<PFN_vkGetDeviceQueue>(get_proc_addr(device, "vkGetDeviceQueue"));
563 if (UNLIKELY(!vtbl.GetDeviceQueue)) {
564 ALOGE("missing device proc: %s", "vkGetDeviceQueue");
565 success = false;
566 }
567 vtbl.QueueSubmit = reinterpret_cast<PFN_vkQueueSubmit>(get_proc_addr(device, "vkQueueSubmit"));
568 if (UNLIKELY(!vtbl.QueueSubmit)) {
569 ALOGE("missing device proc: %s", "vkQueueSubmit");
570 success = false;
571 }
572 vtbl.QueueWaitIdle = reinterpret_cast<PFN_vkQueueWaitIdle>(get_proc_addr(device, "vkQueueWaitIdle"));
573 if (UNLIKELY(!vtbl.QueueWaitIdle)) {
574 ALOGE("missing device proc: %s", "vkQueueWaitIdle");
575 success = false;
576 }
577 vtbl.DeviceWaitIdle = reinterpret_cast<PFN_vkDeviceWaitIdle>(get_proc_addr(device, "vkDeviceWaitIdle"));
578 if (UNLIKELY(!vtbl.DeviceWaitIdle)) {
579 ALOGE("missing device proc: %s", "vkDeviceWaitIdle");
580 success = false;
581 }
582 vtbl.AllocMemory = reinterpret_cast<PFN_vkAllocMemory>(get_proc_addr(device, "vkAllocMemory"));
583 if (UNLIKELY(!vtbl.AllocMemory)) {
584 ALOGE("missing device proc: %s", "vkAllocMemory");
585 success = false;
586 }
587 vtbl.FreeMemory = reinterpret_cast<PFN_vkFreeMemory>(get_proc_addr(device, "vkFreeMemory"));
588 if (UNLIKELY(!vtbl.FreeMemory)) {
589 ALOGE("missing device proc: %s", "vkFreeMemory");
590 success = false;
591 }
592 vtbl.MapMemory = reinterpret_cast<PFN_vkMapMemory>(get_proc_addr(device, "vkMapMemory"));
593 if (UNLIKELY(!vtbl.MapMemory)) {
594 ALOGE("missing device proc: %s", "vkMapMemory");
595 success = false;
596 }
597 vtbl.UnmapMemory = reinterpret_cast<PFN_vkUnmapMemory>(get_proc_addr(device, "vkUnmapMemory"));
598 if (UNLIKELY(!vtbl.UnmapMemory)) {
599 ALOGE("missing device proc: %s", "vkUnmapMemory");
600 success = false;
601 }
602 vtbl.FlushMappedMemoryRanges = reinterpret_cast<PFN_vkFlushMappedMemoryRanges>(get_proc_addr(device, "vkFlushMappedMemoryRanges"));
603 if (UNLIKELY(!vtbl.FlushMappedMemoryRanges)) {
604 ALOGE("missing device proc: %s", "vkFlushMappedMemoryRanges");
605 success = false;
606 }
607 vtbl.InvalidateMappedMemoryRanges = reinterpret_cast<PFN_vkInvalidateMappedMemoryRanges>(get_proc_addr(device, "vkInvalidateMappedMemoryRanges"));
608 if (UNLIKELY(!vtbl.InvalidateMappedMemoryRanges)) {
609 ALOGE("missing device proc: %s", "vkInvalidateMappedMemoryRanges");
610 success = false;
611 }
612 vtbl.GetDeviceMemoryCommitment = reinterpret_cast<PFN_vkGetDeviceMemoryCommitment>(get_proc_addr(device, "vkGetDeviceMemoryCommitment"));
613 if (UNLIKELY(!vtbl.GetDeviceMemoryCommitment)) {
614 ALOGE("missing device proc: %s", "vkGetDeviceMemoryCommitment");
615 success = false;
616 }
617 vtbl.GetBufferMemoryRequirements = reinterpret_cast<PFN_vkGetBufferMemoryRequirements>(get_proc_addr(device, "vkGetBufferMemoryRequirements"));
618 if (UNLIKELY(!vtbl.GetBufferMemoryRequirements)) {
619 ALOGE("missing device proc: %s", "vkGetBufferMemoryRequirements");
620 success = false;
621 }
622 vtbl.BindBufferMemory = reinterpret_cast<PFN_vkBindBufferMemory>(get_proc_addr(device, "vkBindBufferMemory"));
623 if (UNLIKELY(!vtbl.BindBufferMemory)) {
624 ALOGE("missing device proc: %s", "vkBindBufferMemory");
625 success = false;
626 }
627 vtbl.GetImageMemoryRequirements = reinterpret_cast<PFN_vkGetImageMemoryRequirements>(get_proc_addr(device, "vkGetImageMemoryRequirements"));
628 if (UNLIKELY(!vtbl.GetImageMemoryRequirements)) {
629 ALOGE("missing device proc: %s", "vkGetImageMemoryRequirements");
630 success = false;
631 }
632 vtbl.BindImageMemory = reinterpret_cast<PFN_vkBindImageMemory>(get_proc_addr(device, "vkBindImageMemory"));
633 if (UNLIKELY(!vtbl.BindImageMemory)) {
634 ALOGE("missing device proc: %s", "vkBindImageMemory");
635 success = false;
636 }
637 vtbl.GetImageSparseMemoryRequirements = reinterpret_cast<PFN_vkGetImageSparseMemoryRequirements>(get_proc_addr(device, "vkGetImageSparseMemoryRequirements"));
638 if (UNLIKELY(!vtbl.GetImageSparseMemoryRequirements)) {
639 ALOGE("missing device proc: %s", "vkGetImageSparseMemoryRequirements");
640 success = false;
641 }
642 vtbl.QueueBindSparseBufferMemory = reinterpret_cast<PFN_vkQueueBindSparseBufferMemory>(get_proc_addr(device, "vkQueueBindSparseBufferMemory"));
643 if (UNLIKELY(!vtbl.QueueBindSparseBufferMemory)) {
644 ALOGE("missing device proc: %s", "vkQueueBindSparseBufferMemory");
645 success = false;
646 }
647 vtbl.QueueBindSparseImageOpaqueMemory = reinterpret_cast<PFN_vkQueueBindSparseImageOpaqueMemory>(get_proc_addr(device, "vkQueueBindSparseImageOpaqueMemory"));
648 if (UNLIKELY(!vtbl.QueueBindSparseImageOpaqueMemory)) {
649 ALOGE("missing device proc: %s", "vkQueueBindSparseImageOpaqueMemory");
650 success = false;
651 }
652 vtbl.QueueBindSparseImageMemory = reinterpret_cast<PFN_vkQueueBindSparseImageMemory>(get_proc_addr(device, "vkQueueBindSparseImageMemory"));
653 if (UNLIKELY(!vtbl.QueueBindSparseImageMemory)) {
654 ALOGE("missing device proc: %s", "vkQueueBindSparseImageMemory");
655 success = false;
656 }
657 vtbl.CreateFence = reinterpret_cast<PFN_vkCreateFence>(get_proc_addr(device, "vkCreateFence"));
658 if (UNLIKELY(!vtbl.CreateFence)) {
659 ALOGE("missing device proc: %s", "vkCreateFence");
660 success = false;
661 }
662 vtbl.DestroyFence = reinterpret_cast<PFN_vkDestroyFence>(get_proc_addr(device, "vkDestroyFence"));
663 if (UNLIKELY(!vtbl.DestroyFence)) {
664 ALOGE("missing device proc: %s", "vkDestroyFence");
665 success = false;
666 }
667 vtbl.ResetFences = reinterpret_cast<PFN_vkResetFences>(get_proc_addr(device, "vkResetFences"));
668 if (UNLIKELY(!vtbl.ResetFences)) {
669 ALOGE("missing device proc: %s", "vkResetFences");
670 success = false;
671 }
672 vtbl.GetFenceStatus = reinterpret_cast<PFN_vkGetFenceStatus>(get_proc_addr(device, "vkGetFenceStatus"));
673 if (UNLIKELY(!vtbl.GetFenceStatus)) {
674 ALOGE("missing device proc: %s", "vkGetFenceStatus");
675 success = false;
676 }
677 vtbl.WaitForFences = reinterpret_cast<PFN_vkWaitForFences>(get_proc_addr(device, "vkWaitForFences"));
678 if (UNLIKELY(!vtbl.WaitForFences)) {
679 ALOGE("missing device proc: %s", "vkWaitForFences");
680 success = false;
681 }
682 vtbl.CreateSemaphore = reinterpret_cast<PFN_vkCreateSemaphore>(get_proc_addr(device, "vkCreateSemaphore"));
683 if (UNLIKELY(!vtbl.CreateSemaphore)) {
684 ALOGE("missing device proc: %s", "vkCreateSemaphore");
685 success = false;
686 }
687 vtbl.DestroySemaphore = reinterpret_cast<PFN_vkDestroySemaphore>(get_proc_addr(device, "vkDestroySemaphore"));
688 if (UNLIKELY(!vtbl.DestroySemaphore)) {
689 ALOGE("missing device proc: %s", "vkDestroySemaphore");
690 success = false;
691 }
692 vtbl.QueueSignalSemaphore = reinterpret_cast<PFN_vkQueueSignalSemaphore>(get_proc_addr(device, "vkQueueSignalSemaphore"));
693 if (UNLIKELY(!vtbl.QueueSignalSemaphore)) {
694 ALOGE("missing device proc: %s", "vkQueueSignalSemaphore");
695 success = false;
696 }
697 vtbl.QueueWaitSemaphore = reinterpret_cast<PFN_vkQueueWaitSemaphore>(get_proc_addr(device, "vkQueueWaitSemaphore"));
698 if (UNLIKELY(!vtbl.QueueWaitSemaphore)) {
699 ALOGE("missing device proc: %s", "vkQueueWaitSemaphore");
700 success = false;
701 }
702 vtbl.CreateEvent = reinterpret_cast<PFN_vkCreateEvent>(get_proc_addr(device, "vkCreateEvent"));
703 if (UNLIKELY(!vtbl.CreateEvent)) {
704 ALOGE("missing device proc: %s", "vkCreateEvent");
705 success = false;
706 }
707 vtbl.DestroyEvent = reinterpret_cast<PFN_vkDestroyEvent>(get_proc_addr(device, "vkDestroyEvent"));
708 if (UNLIKELY(!vtbl.DestroyEvent)) {
709 ALOGE("missing device proc: %s", "vkDestroyEvent");
710 success = false;
711 }
712 vtbl.GetEventStatus = reinterpret_cast<PFN_vkGetEventStatus>(get_proc_addr(device, "vkGetEventStatus"));
713 if (UNLIKELY(!vtbl.GetEventStatus)) {
714 ALOGE("missing device proc: %s", "vkGetEventStatus");
715 success = false;
716 }
717 vtbl.SetEvent = reinterpret_cast<PFN_vkSetEvent>(get_proc_addr(device, "vkSetEvent"));
718 if (UNLIKELY(!vtbl.SetEvent)) {
719 ALOGE("missing device proc: %s", "vkSetEvent");
720 success = false;
721 }
722 vtbl.ResetEvent = reinterpret_cast<PFN_vkResetEvent>(get_proc_addr(device, "vkResetEvent"));
723 if (UNLIKELY(!vtbl.ResetEvent)) {
724 ALOGE("missing device proc: %s", "vkResetEvent");
725 success = false;
726 }
727 vtbl.CreateQueryPool = reinterpret_cast<PFN_vkCreateQueryPool>(get_proc_addr(device, "vkCreateQueryPool"));
728 if (UNLIKELY(!vtbl.CreateQueryPool)) {
729 ALOGE("missing device proc: %s", "vkCreateQueryPool");
730 success = false;
731 }
732 vtbl.DestroyQueryPool = reinterpret_cast<PFN_vkDestroyQueryPool>(get_proc_addr(device, "vkDestroyQueryPool"));
733 if (UNLIKELY(!vtbl.DestroyQueryPool)) {
734 ALOGE("missing device proc: %s", "vkDestroyQueryPool");
735 success = false;
736 }
737 vtbl.GetQueryPoolResults = reinterpret_cast<PFN_vkGetQueryPoolResults>(get_proc_addr(device, "vkGetQueryPoolResults"));
738 if (UNLIKELY(!vtbl.GetQueryPoolResults)) {
739 ALOGE("missing device proc: %s", "vkGetQueryPoolResults");
740 success = false;
741 }
742 vtbl.CreateBuffer = reinterpret_cast<PFN_vkCreateBuffer>(get_proc_addr(device, "vkCreateBuffer"));
743 if (UNLIKELY(!vtbl.CreateBuffer)) {
744 ALOGE("missing device proc: %s", "vkCreateBuffer");
745 success = false;
746 }
747 vtbl.DestroyBuffer = reinterpret_cast<PFN_vkDestroyBuffer>(get_proc_addr(device, "vkDestroyBuffer"));
748 if (UNLIKELY(!vtbl.DestroyBuffer)) {
749 ALOGE("missing device proc: %s", "vkDestroyBuffer");
750 success = false;
751 }
752 vtbl.CreateBufferView = reinterpret_cast<PFN_vkCreateBufferView>(get_proc_addr(device, "vkCreateBufferView"));
753 if (UNLIKELY(!vtbl.CreateBufferView)) {
754 ALOGE("missing device proc: %s", "vkCreateBufferView");
755 success = false;
756 }
757 vtbl.DestroyBufferView = reinterpret_cast<PFN_vkDestroyBufferView>(get_proc_addr(device, "vkDestroyBufferView"));
758 if (UNLIKELY(!vtbl.DestroyBufferView)) {
759 ALOGE("missing device proc: %s", "vkDestroyBufferView");
760 success = false;
761 }
762 vtbl.CreateImage = reinterpret_cast<PFN_vkCreateImage>(get_proc_addr(device, "vkCreateImage"));
763 if (UNLIKELY(!vtbl.CreateImage)) {
764 ALOGE("missing device proc: %s", "vkCreateImage");
765 success = false;
766 }
767 vtbl.DestroyImage = reinterpret_cast<PFN_vkDestroyImage>(get_proc_addr(device, "vkDestroyImage"));
768 if (UNLIKELY(!vtbl.DestroyImage)) {
769 ALOGE("missing device proc: %s", "vkDestroyImage");
770 success = false;
771 }
772 vtbl.GetImageSubresourceLayout = reinterpret_cast<PFN_vkGetImageSubresourceLayout>(get_proc_addr(device, "vkGetImageSubresourceLayout"));
773 if (UNLIKELY(!vtbl.GetImageSubresourceLayout)) {
774 ALOGE("missing device proc: %s", "vkGetImageSubresourceLayout");
775 success = false;
776 }
777 vtbl.CreateImageView = reinterpret_cast<PFN_vkCreateImageView>(get_proc_addr(device, "vkCreateImageView"));
778 if (UNLIKELY(!vtbl.CreateImageView)) {
779 ALOGE("missing device proc: %s", "vkCreateImageView");
780 success = false;
781 }
782 vtbl.DestroyImageView = reinterpret_cast<PFN_vkDestroyImageView>(get_proc_addr(device, "vkDestroyImageView"));
783 if (UNLIKELY(!vtbl.DestroyImageView)) {
784 ALOGE("missing device proc: %s", "vkDestroyImageView");
785 success = false;
786 }
787 vtbl.CreateAttachmentView = reinterpret_cast<PFN_vkCreateAttachmentView>(get_proc_addr(device, "vkCreateAttachmentView"));
788 if (UNLIKELY(!vtbl.CreateAttachmentView)) {
789 ALOGE("missing device proc: %s", "vkCreateAttachmentView");
790 success = false;
791 }
792 vtbl.DestroyAttachmentView = reinterpret_cast<PFN_vkDestroyAttachmentView>(get_proc_addr(device, "vkDestroyAttachmentView"));
793 if (UNLIKELY(!vtbl.DestroyAttachmentView)) {
794 ALOGE("missing device proc: %s", "vkDestroyAttachmentView");
795 success = false;
796 }
797 vtbl.CreateShaderModule = reinterpret_cast<PFN_vkCreateShaderModule>(get_proc_addr(device, "vkCreateShaderModule"));
798 if (UNLIKELY(!vtbl.CreateShaderModule)) {
799 ALOGE("missing device proc: %s", "vkCreateShaderModule");
800 success = false;
801 }
802 vtbl.DestroyShaderModule = reinterpret_cast<PFN_vkDestroyShaderModule>(get_proc_addr(device, "vkDestroyShaderModule"));
803 if (UNLIKELY(!vtbl.DestroyShaderModule)) {
804 ALOGE("missing device proc: %s", "vkDestroyShaderModule");
805 success = false;
806 }
807 vtbl.CreateShader = reinterpret_cast<PFN_vkCreateShader>(get_proc_addr(device, "vkCreateShader"));
808 if (UNLIKELY(!vtbl.CreateShader)) {
809 ALOGE("missing device proc: %s", "vkCreateShader");
810 success = false;
811 }
812 vtbl.DestroyShader = reinterpret_cast<PFN_vkDestroyShader>(get_proc_addr(device, "vkDestroyShader"));
813 if (UNLIKELY(!vtbl.DestroyShader)) {
814 ALOGE("missing device proc: %s", "vkDestroyShader");
815 success = false;
816 }
817 vtbl.CreatePipelineCache = reinterpret_cast<PFN_vkCreatePipelineCache>(get_proc_addr(device, "vkCreatePipelineCache"));
818 if (UNLIKELY(!vtbl.CreatePipelineCache)) {
819 ALOGE("missing device proc: %s", "vkCreatePipelineCache");
820 success = false;
821 }
822 vtbl.DestroyPipelineCache = reinterpret_cast<PFN_vkDestroyPipelineCache>(get_proc_addr(device, "vkDestroyPipelineCache"));
823 if (UNLIKELY(!vtbl.DestroyPipelineCache)) {
824 ALOGE("missing device proc: %s", "vkDestroyPipelineCache");
825 success = false;
826 }
827 vtbl.GetPipelineCacheSize = reinterpret_cast<PFN_vkGetPipelineCacheSize>(get_proc_addr(device, "vkGetPipelineCacheSize"));
828 if (UNLIKELY(!vtbl.GetPipelineCacheSize)) {
829 ALOGE("missing device proc: %s", "vkGetPipelineCacheSize");
830 success = false;
831 }
832 vtbl.GetPipelineCacheData = reinterpret_cast<PFN_vkGetPipelineCacheData>(get_proc_addr(device, "vkGetPipelineCacheData"));
833 if (UNLIKELY(!vtbl.GetPipelineCacheData)) {
834 ALOGE("missing device proc: %s", "vkGetPipelineCacheData");
835 success = false;
836 }
837 vtbl.MergePipelineCaches = reinterpret_cast<PFN_vkMergePipelineCaches>(get_proc_addr(device, "vkMergePipelineCaches"));
838 if (UNLIKELY(!vtbl.MergePipelineCaches)) {
839 ALOGE("missing device proc: %s", "vkMergePipelineCaches");
840 success = false;
841 }
842 vtbl.CreateGraphicsPipelines = reinterpret_cast<PFN_vkCreateGraphicsPipelines>(get_proc_addr(device, "vkCreateGraphicsPipelines"));
843 if (UNLIKELY(!vtbl.CreateGraphicsPipelines)) {
844 ALOGE("missing device proc: %s", "vkCreateGraphicsPipelines");
845 success = false;
846 }
847 vtbl.CreateComputePipelines = reinterpret_cast<PFN_vkCreateComputePipelines>(get_proc_addr(device, "vkCreateComputePipelines"));
848 if (UNLIKELY(!vtbl.CreateComputePipelines)) {
849 ALOGE("missing device proc: %s", "vkCreateComputePipelines");
850 success = false;
851 }
852 vtbl.DestroyPipeline = reinterpret_cast<PFN_vkDestroyPipeline>(get_proc_addr(device, "vkDestroyPipeline"));
853 if (UNLIKELY(!vtbl.DestroyPipeline)) {
854 ALOGE("missing device proc: %s", "vkDestroyPipeline");
855 success = false;
856 }
857 vtbl.CreatePipelineLayout = reinterpret_cast<PFN_vkCreatePipelineLayout>(get_proc_addr(device, "vkCreatePipelineLayout"));
858 if (UNLIKELY(!vtbl.CreatePipelineLayout)) {
859 ALOGE("missing device proc: %s", "vkCreatePipelineLayout");
860 success = false;
861 }
862 vtbl.DestroyPipelineLayout = reinterpret_cast<PFN_vkDestroyPipelineLayout>(get_proc_addr(device, "vkDestroyPipelineLayout"));
863 if (UNLIKELY(!vtbl.DestroyPipelineLayout)) {
864 ALOGE("missing device proc: %s", "vkDestroyPipelineLayout");
865 success = false;
866 }
867 vtbl.CreateSampler = reinterpret_cast<PFN_vkCreateSampler>(get_proc_addr(device, "vkCreateSampler"));
868 if (UNLIKELY(!vtbl.CreateSampler)) {
869 ALOGE("missing device proc: %s", "vkCreateSampler");
870 success = false;
871 }
872 vtbl.DestroySampler = reinterpret_cast<PFN_vkDestroySampler>(get_proc_addr(device, "vkDestroySampler"));
873 if (UNLIKELY(!vtbl.DestroySampler)) {
874 ALOGE("missing device proc: %s", "vkDestroySampler");
875 success = false;
876 }
877 vtbl.CreateDescriptorSetLayout = reinterpret_cast<PFN_vkCreateDescriptorSetLayout>(get_proc_addr(device, "vkCreateDescriptorSetLayout"));
878 if (UNLIKELY(!vtbl.CreateDescriptorSetLayout)) {
879 ALOGE("missing device proc: %s", "vkCreateDescriptorSetLayout");
880 success = false;
881 }
882 vtbl.DestroyDescriptorSetLayout = reinterpret_cast<PFN_vkDestroyDescriptorSetLayout>(get_proc_addr(device, "vkDestroyDescriptorSetLayout"));
883 if (UNLIKELY(!vtbl.DestroyDescriptorSetLayout)) {
884 ALOGE("missing device proc: %s", "vkDestroyDescriptorSetLayout");
885 success = false;
886 }
887 vtbl.CreateDescriptorPool = reinterpret_cast<PFN_vkCreateDescriptorPool>(get_proc_addr(device, "vkCreateDescriptorPool"));
888 if (UNLIKELY(!vtbl.CreateDescriptorPool)) {
889 ALOGE("missing device proc: %s", "vkCreateDescriptorPool");
890 success = false;
891 }
892 vtbl.DestroyDescriptorPool = reinterpret_cast<PFN_vkDestroyDescriptorPool>(get_proc_addr(device, "vkDestroyDescriptorPool"));
893 if (UNLIKELY(!vtbl.DestroyDescriptorPool)) {
894 ALOGE("missing device proc: %s", "vkDestroyDescriptorPool");
895 success = false;
896 }
897 vtbl.ResetDescriptorPool = reinterpret_cast<PFN_vkResetDescriptorPool>(get_proc_addr(device, "vkResetDescriptorPool"));
898 if (UNLIKELY(!vtbl.ResetDescriptorPool)) {
899 ALOGE("missing device proc: %s", "vkResetDescriptorPool");
900 success = false;
901 }
902 vtbl.AllocDescriptorSets = reinterpret_cast<PFN_vkAllocDescriptorSets>(get_proc_addr(device, "vkAllocDescriptorSets"));
903 if (UNLIKELY(!vtbl.AllocDescriptorSets)) {
904 ALOGE("missing device proc: %s", "vkAllocDescriptorSets");
905 success = false;
906 }
907 vtbl.FreeDescriptorSets = reinterpret_cast<PFN_vkFreeDescriptorSets>(get_proc_addr(device, "vkFreeDescriptorSets"));
908 if (UNLIKELY(!vtbl.FreeDescriptorSets)) {
909 ALOGE("missing device proc: %s", "vkFreeDescriptorSets");
910 success = false;
911 }
912 vtbl.UpdateDescriptorSets = reinterpret_cast<PFN_vkUpdateDescriptorSets>(get_proc_addr(device, "vkUpdateDescriptorSets"));
913 if (UNLIKELY(!vtbl.UpdateDescriptorSets)) {
914 ALOGE("missing device proc: %s", "vkUpdateDescriptorSets");
915 success = false;
916 }
917 vtbl.CreateDynamicViewportState = reinterpret_cast<PFN_vkCreateDynamicViewportState>(get_proc_addr(device, "vkCreateDynamicViewportState"));
918 if (UNLIKELY(!vtbl.CreateDynamicViewportState)) {
919 ALOGE("missing device proc: %s", "vkCreateDynamicViewportState");
920 success = false;
921 }
922 vtbl.DestroyDynamicViewportState = reinterpret_cast<PFN_vkDestroyDynamicViewportState>(get_proc_addr(device, "vkDestroyDynamicViewportState"));
923 if (UNLIKELY(!vtbl.DestroyDynamicViewportState)) {
924 ALOGE("missing device proc: %s", "vkDestroyDynamicViewportState");
925 success = false;
926 }
927 vtbl.CreateDynamicRasterState = reinterpret_cast<PFN_vkCreateDynamicRasterState>(get_proc_addr(device, "vkCreateDynamicRasterState"));
928 if (UNLIKELY(!vtbl.CreateDynamicRasterState)) {
929 ALOGE("missing device proc: %s", "vkCreateDynamicRasterState");
930 success = false;
931 }
932 vtbl.DestroyDynamicRasterState = reinterpret_cast<PFN_vkDestroyDynamicRasterState>(get_proc_addr(device, "vkDestroyDynamicRasterState"));
933 if (UNLIKELY(!vtbl.DestroyDynamicRasterState)) {
934 ALOGE("missing device proc: %s", "vkDestroyDynamicRasterState");
935 success = false;
936 }
937 vtbl.CreateDynamicColorBlendState = reinterpret_cast<PFN_vkCreateDynamicColorBlendState>(get_proc_addr(device, "vkCreateDynamicColorBlendState"));
938 if (UNLIKELY(!vtbl.CreateDynamicColorBlendState)) {
939 ALOGE("missing device proc: %s", "vkCreateDynamicColorBlendState");
940 success = false;
941 }
942 vtbl.DestroyDynamicColorBlendState = reinterpret_cast<PFN_vkDestroyDynamicColorBlendState>(get_proc_addr(device, "vkDestroyDynamicColorBlendState"));
943 if (UNLIKELY(!vtbl.DestroyDynamicColorBlendState)) {
944 ALOGE("missing device proc: %s", "vkDestroyDynamicColorBlendState");
945 success = false;
946 }
947 vtbl.CreateDynamicDepthStencilState = reinterpret_cast<PFN_vkCreateDynamicDepthStencilState>(get_proc_addr(device, "vkCreateDynamicDepthStencilState"));
948 if (UNLIKELY(!vtbl.CreateDynamicDepthStencilState)) {
949 ALOGE("missing device proc: %s", "vkCreateDynamicDepthStencilState");
950 success = false;
951 }
952 vtbl.DestroyDynamicDepthStencilState = reinterpret_cast<PFN_vkDestroyDynamicDepthStencilState>(get_proc_addr(device, "vkDestroyDynamicDepthStencilState"));
953 if (UNLIKELY(!vtbl.DestroyDynamicDepthStencilState)) {
954 ALOGE("missing device proc: %s", "vkDestroyDynamicDepthStencilState");
955 success = false;
956 }
957 vtbl.CreateFramebuffer = reinterpret_cast<PFN_vkCreateFramebuffer>(get_proc_addr(device, "vkCreateFramebuffer"));
958 if (UNLIKELY(!vtbl.CreateFramebuffer)) {
959 ALOGE("missing device proc: %s", "vkCreateFramebuffer");
960 success = false;
961 }
962 vtbl.DestroyFramebuffer = reinterpret_cast<PFN_vkDestroyFramebuffer>(get_proc_addr(device, "vkDestroyFramebuffer"));
963 if (UNLIKELY(!vtbl.DestroyFramebuffer)) {
964 ALOGE("missing device proc: %s", "vkDestroyFramebuffer");
965 success = false;
966 }
967 vtbl.CreateRenderPass = reinterpret_cast<PFN_vkCreateRenderPass>(get_proc_addr(device, "vkCreateRenderPass"));
968 if (UNLIKELY(!vtbl.CreateRenderPass)) {
969 ALOGE("missing device proc: %s", "vkCreateRenderPass");
970 success = false;
971 }
972 vtbl.DestroyRenderPass = reinterpret_cast<PFN_vkDestroyRenderPass>(get_proc_addr(device, "vkDestroyRenderPass"));
973 if (UNLIKELY(!vtbl.DestroyRenderPass)) {
974 ALOGE("missing device proc: %s", "vkDestroyRenderPass");
975 success = false;
976 }
977 vtbl.GetRenderAreaGranularity = reinterpret_cast<PFN_vkGetRenderAreaGranularity>(get_proc_addr(device, "vkGetRenderAreaGranularity"));
978 if (UNLIKELY(!vtbl.GetRenderAreaGranularity)) {
979 ALOGE("missing device proc: %s", "vkGetRenderAreaGranularity");
980 success = false;
981 }
982 vtbl.CreateCommandPool = reinterpret_cast<PFN_vkCreateCommandPool>(get_proc_addr(device, "vkCreateCommandPool"));
983 if (UNLIKELY(!vtbl.CreateCommandPool)) {
984 ALOGE("missing device proc: %s", "vkCreateCommandPool");
985 success = false;
986 }
987 vtbl.DestroyCommandPool = reinterpret_cast<PFN_vkDestroyCommandPool>(get_proc_addr(device, "vkDestroyCommandPool"));
988 if (UNLIKELY(!vtbl.DestroyCommandPool)) {
989 ALOGE("missing device proc: %s", "vkDestroyCommandPool");
990 success = false;
991 }
992 vtbl.ResetCommandPool = reinterpret_cast<PFN_vkResetCommandPool>(get_proc_addr(device, "vkResetCommandPool"));
993 if (UNLIKELY(!vtbl.ResetCommandPool)) {
994 ALOGE("missing device proc: %s", "vkResetCommandPool");
995 success = false;
996 }
997 vtbl.CreateCommandBuffer = reinterpret_cast<PFN_vkCreateCommandBuffer>(get_proc_addr(device, "vkCreateCommandBuffer"));
998 if (UNLIKELY(!vtbl.CreateCommandBuffer)) {
999 ALOGE("missing device proc: %s", "vkCreateCommandBuffer");
1000 success = false;
1001 }
1002 vtbl.DestroyCommandBuffer = reinterpret_cast<PFN_vkDestroyCommandBuffer>(get_proc_addr(device, "vkDestroyCommandBuffer"));
1003 if (UNLIKELY(!vtbl.DestroyCommandBuffer)) {
1004 ALOGE("missing device proc: %s", "vkDestroyCommandBuffer");
1005 success = false;
1006 }
1007 vtbl.BeginCommandBuffer = reinterpret_cast<PFN_vkBeginCommandBuffer>(get_proc_addr(device, "vkBeginCommandBuffer"));
1008 if (UNLIKELY(!vtbl.BeginCommandBuffer)) {
1009 ALOGE("missing device proc: %s", "vkBeginCommandBuffer");
1010 success = false;
1011 }
1012 vtbl.EndCommandBuffer = reinterpret_cast<PFN_vkEndCommandBuffer>(get_proc_addr(device, "vkEndCommandBuffer"));
1013 if (UNLIKELY(!vtbl.EndCommandBuffer)) {
1014 ALOGE("missing device proc: %s", "vkEndCommandBuffer");
1015 success = false;
1016 }
1017 vtbl.ResetCommandBuffer = reinterpret_cast<PFN_vkResetCommandBuffer>(get_proc_addr(device, "vkResetCommandBuffer"));
1018 if (UNLIKELY(!vtbl.ResetCommandBuffer)) {
1019 ALOGE("missing device proc: %s", "vkResetCommandBuffer");
1020 success = false;
1021 }
1022 vtbl.CmdBindPipeline = reinterpret_cast<PFN_vkCmdBindPipeline>(get_proc_addr(device, "vkCmdBindPipeline"));
1023 if (UNLIKELY(!vtbl.CmdBindPipeline)) {
1024 ALOGE("missing device proc: %s", "vkCmdBindPipeline");
1025 success = false;
1026 }
1027 vtbl.CmdBindDynamicViewportState = reinterpret_cast<PFN_vkCmdBindDynamicViewportState>(get_proc_addr(device, "vkCmdBindDynamicViewportState"));
1028 if (UNLIKELY(!vtbl.CmdBindDynamicViewportState)) {
1029 ALOGE("missing device proc: %s", "vkCmdBindDynamicViewportState");
1030 success = false;
1031 }
1032 vtbl.CmdBindDynamicRasterState = reinterpret_cast<PFN_vkCmdBindDynamicRasterState>(get_proc_addr(device, "vkCmdBindDynamicRasterState"));
1033 if (UNLIKELY(!vtbl.CmdBindDynamicRasterState)) {
1034 ALOGE("missing device proc: %s", "vkCmdBindDynamicRasterState");
1035 success = false;
1036 }
1037 vtbl.CmdBindDynamicColorBlendState = reinterpret_cast<PFN_vkCmdBindDynamicColorBlendState>(get_proc_addr(device, "vkCmdBindDynamicColorBlendState"));
1038 if (UNLIKELY(!vtbl.CmdBindDynamicColorBlendState)) {
1039 ALOGE("missing device proc: %s", "vkCmdBindDynamicColorBlendState");
1040 success = false;
1041 }
1042 vtbl.CmdBindDynamicDepthStencilState = reinterpret_cast<PFN_vkCmdBindDynamicDepthStencilState>(get_proc_addr(device, "vkCmdBindDynamicDepthStencilState"));
1043 if (UNLIKELY(!vtbl.CmdBindDynamicDepthStencilState)) {
1044 ALOGE("missing device proc: %s", "vkCmdBindDynamicDepthStencilState");
1045 success = false;
1046 }
1047 vtbl.CmdBindDescriptorSets = reinterpret_cast<PFN_vkCmdBindDescriptorSets>(get_proc_addr(device, "vkCmdBindDescriptorSets"));
1048 if (UNLIKELY(!vtbl.CmdBindDescriptorSets)) {
1049 ALOGE("missing device proc: %s", "vkCmdBindDescriptorSets");
1050 success = false;
1051 }
1052 vtbl.CmdBindIndexBuffer = reinterpret_cast<PFN_vkCmdBindIndexBuffer>(get_proc_addr(device, "vkCmdBindIndexBuffer"));
1053 if (UNLIKELY(!vtbl.CmdBindIndexBuffer)) {
1054 ALOGE("missing device proc: %s", "vkCmdBindIndexBuffer");
1055 success = false;
1056 }
1057 vtbl.CmdBindVertexBuffers = reinterpret_cast<PFN_vkCmdBindVertexBuffers>(get_proc_addr(device, "vkCmdBindVertexBuffers"));
1058 if (UNLIKELY(!vtbl.CmdBindVertexBuffers)) {
1059 ALOGE("missing device proc: %s", "vkCmdBindVertexBuffers");
1060 success = false;
1061 }
1062 vtbl.CmdDraw = reinterpret_cast<PFN_vkCmdDraw>(get_proc_addr(device, "vkCmdDraw"));
1063 if (UNLIKELY(!vtbl.CmdDraw)) {
1064 ALOGE("missing device proc: %s", "vkCmdDraw");
1065 success = false;
1066 }
1067 vtbl.CmdDrawIndexed = reinterpret_cast<PFN_vkCmdDrawIndexed>(get_proc_addr(device, "vkCmdDrawIndexed"));
1068 if (UNLIKELY(!vtbl.CmdDrawIndexed)) {
1069 ALOGE("missing device proc: %s", "vkCmdDrawIndexed");
1070 success = false;
1071 }
1072 vtbl.CmdDrawIndirect = reinterpret_cast<PFN_vkCmdDrawIndirect>(get_proc_addr(device, "vkCmdDrawIndirect"));
1073 if (UNLIKELY(!vtbl.CmdDrawIndirect)) {
1074 ALOGE("missing device proc: %s", "vkCmdDrawIndirect");
1075 success = false;
1076 }
1077 vtbl.CmdDrawIndexedIndirect = reinterpret_cast<PFN_vkCmdDrawIndexedIndirect>(get_proc_addr(device, "vkCmdDrawIndexedIndirect"));
1078 if (UNLIKELY(!vtbl.CmdDrawIndexedIndirect)) {
1079 ALOGE("missing device proc: %s", "vkCmdDrawIndexedIndirect");
1080 success = false;
1081 }
1082 vtbl.CmdDispatch = reinterpret_cast<PFN_vkCmdDispatch>(get_proc_addr(device, "vkCmdDispatch"));
1083 if (UNLIKELY(!vtbl.CmdDispatch)) {
1084 ALOGE("missing device proc: %s", "vkCmdDispatch");
1085 success = false;
1086 }
1087 vtbl.CmdDispatchIndirect = reinterpret_cast<PFN_vkCmdDispatchIndirect>(get_proc_addr(device, "vkCmdDispatchIndirect"));
1088 if (UNLIKELY(!vtbl.CmdDispatchIndirect)) {
1089 ALOGE("missing device proc: %s", "vkCmdDispatchIndirect");
1090 success = false;
1091 }
1092 vtbl.CmdCopyBuffer = reinterpret_cast<PFN_vkCmdCopyBuffer>(get_proc_addr(device, "vkCmdCopyBuffer"));
1093 if (UNLIKELY(!vtbl.CmdCopyBuffer)) {
1094 ALOGE("missing device proc: %s", "vkCmdCopyBuffer");
1095 success = false;
1096 }
1097 vtbl.CmdCopyImage = reinterpret_cast<PFN_vkCmdCopyImage>(get_proc_addr(device, "vkCmdCopyImage"));
1098 if (UNLIKELY(!vtbl.CmdCopyImage)) {
1099 ALOGE("missing device proc: %s", "vkCmdCopyImage");
1100 success = false;
1101 }
1102 vtbl.CmdBlitImage = reinterpret_cast<PFN_vkCmdBlitImage>(get_proc_addr(device, "vkCmdBlitImage"));
1103 if (UNLIKELY(!vtbl.CmdBlitImage)) {
1104 ALOGE("missing device proc: %s", "vkCmdBlitImage");
1105 success = false;
1106 }
1107 vtbl.CmdCopyBufferToImage = reinterpret_cast<PFN_vkCmdCopyBufferToImage>(get_proc_addr(device, "vkCmdCopyBufferToImage"));
1108 if (UNLIKELY(!vtbl.CmdCopyBufferToImage)) {
1109 ALOGE("missing device proc: %s", "vkCmdCopyBufferToImage");
1110 success = false;
1111 }
1112 vtbl.CmdCopyImageToBuffer = reinterpret_cast<PFN_vkCmdCopyImageToBuffer>(get_proc_addr(device, "vkCmdCopyImageToBuffer"));
1113 if (UNLIKELY(!vtbl.CmdCopyImageToBuffer)) {
1114 ALOGE("missing device proc: %s", "vkCmdCopyImageToBuffer");
1115 success = false;
1116 }
1117 vtbl.CmdUpdateBuffer = reinterpret_cast<PFN_vkCmdUpdateBuffer>(get_proc_addr(device, "vkCmdUpdateBuffer"));
1118 if (UNLIKELY(!vtbl.CmdUpdateBuffer)) {
1119 ALOGE("missing device proc: %s", "vkCmdUpdateBuffer");
1120 success = false;
1121 }
1122 vtbl.CmdFillBuffer = reinterpret_cast<PFN_vkCmdFillBuffer>(get_proc_addr(device, "vkCmdFillBuffer"));
1123 if (UNLIKELY(!vtbl.CmdFillBuffer)) {
1124 ALOGE("missing device proc: %s", "vkCmdFillBuffer");
1125 success = false;
1126 }
1127 vtbl.CmdClearColorImage = reinterpret_cast<PFN_vkCmdClearColorImage>(get_proc_addr(device, "vkCmdClearColorImage"));
1128 if (UNLIKELY(!vtbl.CmdClearColorImage)) {
1129 ALOGE("missing device proc: %s", "vkCmdClearColorImage");
1130 success = false;
1131 }
1132 vtbl.CmdClearDepthStencilImage = reinterpret_cast<PFN_vkCmdClearDepthStencilImage>(get_proc_addr(device, "vkCmdClearDepthStencilImage"));
1133 if (UNLIKELY(!vtbl.CmdClearDepthStencilImage)) {
1134 ALOGE("missing device proc: %s", "vkCmdClearDepthStencilImage");
1135 success = false;
1136 }
1137 vtbl.CmdClearColorAttachment = reinterpret_cast<PFN_vkCmdClearColorAttachment>(get_proc_addr(device, "vkCmdClearColorAttachment"));
1138 if (UNLIKELY(!vtbl.CmdClearColorAttachment)) {
1139 ALOGE("missing device proc: %s", "vkCmdClearColorAttachment");
1140 success = false;
1141 }
1142 vtbl.CmdClearDepthStencilAttachment = reinterpret_cast<PFN_vkCmdClearDepthStencilAttachment>(get_proc_addr(device, "vkCmdClearDepthStencilAttachment"));
1143 if (UNLIKELY(!vtbl.CmdClearDepthStencilAttachment)) {
1144 ALOGE("missing device proc: %s", "vkCmdClearDepthStencilAttachment");
1145 success = false;
1146 }
1147 vtbl.CmdResolveImage = reinterpret_cast<PFN_vkCmdResolveImage>(get_proc_addr(device, "vkCmdResolveImage"));
1148 if (UNLIKELY(!vtbl.CmdResolveImage)) {
1149 ALOGE("missing device proc: %s", "vkCmdResolveImage");
1150 success = false;
1151 }
1152 vtbl.CmdSetEvent = reinterpret_cast<PFN_vkCmdSetEvent>(get_proc_addr(device, "vkCmdSetEvent"));
1153 if (UNLIKELY(!vtbl.CmdSetEvent)) {
1154 ALOGE("missing device proc: %s", "vkCmdSetEvent");
1155 success = false;
1156 }
1157 vtbl.CmdResetEvent = reinterpret_cast<PFN_vkCmdResetEvent>(get_proc_addr(device, "vkCmdResetEvent"));
1158 if (UNLIKELY(!vtbl.CmdResetEvent)) {
1159 ALOGE("missing device proc: %s", "vkCmdResetEvent");
1160 success = false;
1161 }
1162 vtbl.CmdWaitEvents = reinterpret_cast<PFN_vkCmdWaitEvents>(get_proc_addr(device, "vkCmdWaitEvents"));
1163 if (UNLIKELY(!vtbl.CmdWaitEvents)) {
1164 ALOGE("missing device proc: %s", "vkCmdWaitEvents");
1165 success = false;
1166 }
1167 vtbl.CmdPipelineBarrier = reinterpret_cast<PFN_vkCmdPipelineBarrier>(get_proc_addr(device, "vkCmdPipelineBarrier"));
1168 if (UNLIKELY(!vtbl.CmdPipelineBarrier)) {
1169 ALOGE("missing device proc: %s", "vkCmdPipelineBarrier");
1170 success = false;
1171 }
1172 vtbl.CmdBeginQuery = reinterpret_cast<PFN_vkCmdBeginQuery>(get_proc_addr(device, "vkCmdBeginQuery"));
1173 if (UNLIKELY(!vtbl.CmdBeginQuery)) {
1174 ALOGE("missing device proc: %s", "vkCmdBeginQuery");
1175 success = false;
1176 }
1177 vtbl.CmdEndQuery = reinterpret_cast<PFN_vkCmdEndQuery>(get_proc_addr(device, "vkCmdEndQuery"));
1178 if (UNLIKELY(!vtbl.CmdEndQuery)) {
1179 ALOGE("missing device proc: %s", "vkCmdEndQuery");
1180 success = false;
1181 }
1182 vtbl.CmdResetQueryPool = reinterpret_cast<PFN_vkCmdResetQueryPool>(get_proc_addr(device, "vkCmdResetQueryPool"));
1183 if (UNLIKELY(!vtbl.CmdResetQueryPool)) {
1184 ALOGE("missing device proc: %s", "vkCmdResetQueryPool");
1185 success = false;
1186 }
1187 vtbl.CmdWriteTimestamp = reinterpret_cast<PFN_vkCmdWriteTimestamp>(get_proc_addr(device, "vkCmdWriteTimestamp"));
1188 if (UNLIKELY(!vtbl.CmdWriteTimestamp)) {
1189 ALOGE("missing device proc: %s", "vkCmdWriteTimestamp");
1190 success = false;
1191 }
1192 vtbl.CmdCopyQueryPoolResults = reinterpret_cast<PFN_vkCmdCopyQueryPoolResults>(get_proc_addr(device, "vkCmdCopyQueryPoolResults"));
1193 if (UNLIKELY(!vtbl.CmdCopyQueryPoolResults)) {
1194 ALOGE("missing device proc: %s", "vkCmdCopyQueryPoolResults");
1195 success = false;
1196 }
1197 vtbl.CmdPushConstants = reinterpret_cast<PFN_vkCmdPushConstants>(get_proc_addr(device, "vkCmdPushConstants"));
1198 if (UNLIKELY(!vtbl.CmdPushConstants)) {
1199 ALOGE("missing device proc: %s", "vkCmdPushConstants");
1200 success = false;
1201 }
1202 vtbl.CmdBeginRenderPass = reinterpret_cast<PFN_vkCmdBeginRenderPass>(get_proc_addr(device, "vkCmdBeginRenderPass"));
1203 if (UNLIKELY(!vtbl.CmdBeginRenderPass)) {
1204 ALOGE("missing device proc: %s", "vkCmdBeginRenderPass");
1205 success = false;
1206 }
1207 vtbl.CmdNextSubpass = reinterpret_cast<PFN_vkCmdNextSubpass>(get_proc_addr(device, "vkCmdNextSubpass"));
1208 if (UNLIKELY(!vtbl.CmdNextSubpass)) {
1209 ALOGE("missing device proc: %s", "vkCmdNextSubpass");
1210 success = false;
1211 }
1212 vtbl.CmdEndRenderPass = reinterpret_cast<PFN_vkCmdEndRenderPass>(get_proc_addr(device, "vkCmdEndRenderPass"));
1213 if (UNLIKELY(!vtbl.CmdEndRenderPass)) {
1214 ALOGE("missing device proc: %s", "vkCmdEndRenderPass");
1215 success = false;
1216 }
1217 vtbl.CmdExecuteCommands = reinterpret_cast<PFN_vkCmdExecuteCommands>(get_proc_addr(device, "vkCmdExecuteCommands"));
1218 if (UNLIKELY(!vtbl.CmdExecuteCommands)) {
1219 ALOGE("missing device proc: %s", "vkCmdExecuteCommands");
1220 success = false;
1221 }
Jesse Hallb1352bc2015-09-04 16:12:33 -07001222 vtbl.ImportNativeFenceANDROID = reinterpret_cast<PFN_vkImportNativeFenceANDROID>(get_proc_addr(device, "vkImportNativeFenceANDROID"));
1223 if (UNLIKELY(!vtbl.ImportNativeFenceANDROID)) {
1224 ALOGE("missing device proc: %s", "vkImportNativeFenceANDROID");
1225 success = false;
1226 }
1227 vtbl.QueueSignalNativeFenceANDROID = reinterpret_cast<PFN_vkQueueSignalNativeFenceANDROID>(get_proc_addr(device, "vkQueueSignalNativeFenceANDROID"));
1228 if (UNLIKELY(!vtbl.QueueSignalNativeFenceANDROID)) {
1229 ALOGE("missing device proc: %s", "vkQueueSignalNativeFenceANDROID");
1230 success = false;
1231 }
Jesse Hall04f4f472015-08-16 19:51:04 -07001232 // clang-format on
1233 return success;
1234}
1235
1236} // namespace vulkan