blob: bdd3573b11d5ce87577519ce4e42649956201d4f [file] [log] [blame]
Chia-I Wu0c203242016-03-15 13:44:51 +08001{{define "Copyright"}}
2/*
3•* Copyright 2016 The Android Open Source Project
4•*
5•* Licensed under the Apache License, Version 2.0 (the "License");
6•* you may not use this file except in compliance with the License.
7•* You may obtain a copy of the License at
8•*
9•* http://www.apache.org/licenses/LICENSE-2.0
10•*
11•* Unless required by applicable law or agreed to in writing, software
12•* distributed under the License is distributed on an "AS IS" BASIS,
13•* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14•* See the License for the specific language governing permissions and
15•* limitations under the License.
16•*/
17¶{{end}}
18
19{{Include "../api/templates/vulkan_common.tmpl"}}
20{{Global "clang-format" (Strings "clang-format" "-style=file")}}
21{{Macro "DefineGlobals" $}}
22{{$ | Macro "api_gen.h" | Format (Global "clang-format") | Write "api_gen.h" }}
23{{$ | Macro "api_gen.cpp" | Format (Global "clang-format") | Write "api_gen.cpp"}}
Chia-I Wueb7db122016-03-24 09:11:06 +080024{{$ | Macro "driver_gen.h" | Format (Global "clang-format") | Write "driver_gen.h"}}
25{{$ | Macro "driver_gen.cpp" | Format (Global "clang-format") | Write "driver_gen.cpp"}}
Chia-I Wu0c203242016-03-15 13:44:51 +080026
27{{/*
28-------------------------------------------------------------------------------
29 api_gen.h
30-------------------------------------------------------------------------------
31*/}}
32{{define "api_gen.h"}}
33{{Macro "Copyright"}}
34
35// WARNING: This file is generated. See ../README.md for instructions.
36
37#ifndef LIBVULKAN_API_GEN_H
38#define LIBVULKAN_API_GEN_H
39
Chia-I Wu8925efd2016-04-13 15:13:21 +080040#include <bitset>
Chia-I Wu0c203242016-03-15 13:44:51 +080041#include <vulkan/vulkan.h>
Chia-I Wu8925efd2016-04-13 15:13:21 +080042#include "driver_gen.h"
Chia-I Wu0c203242016-03-15 13:44:51 +080043
44namespace vulkan
45namespace api
46
47struct InstanceDispatchTable {
48 // clang-format off
49 {{range $f := AllCommands $}}
50 {{if (Macro "api.IsInstanceDispatchTableEntry" $f)}}
Chia-I Wucc5e2762016-03-24 13:01:16 +080051 {{Macro "C++.DeclareTableEntry" $f}};
Chia-I Wu0c203242016-03-15 13:44:51 +080052 {{end}}
53 {{end}}
54 // clang-format on
55};
56
57struct DeviceDispatchTable {
58 // clang-format off
59 {{range $f := AllCommands $}}
60 {{if (Macro "api.IsDeviceDispatchTableEntry" $f)}}
Chia-I Wucc5e2762016-03-24 13:01:16 +080061 {{Macro "C++.DeclareTableEntry" $f}};
Chia-I Wu0c203242016-03-15 13:44:51 +080062 {{end}}
63 {{end}}
64 // clang-format on
65};
66
Chia-I Wu8925efd2016-04-13 15:13:21 +080067bool InitDispatchTable(
68 VkInstance instance,
69 PFN_vkGetInstanceProcAddr get_proc,
70 const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions);
71bool InitDispatchTable(
72 VkDevice dev,
73 PFN_vkGetDeviceProcAddr get_proc,
74 const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions);
Chia-I Wu0c203242016-03-15 13:44:51 +080075
76»} // namespace api
77»} // namespace vulkan
78
79#endif // LIBVULKAN_API_GEN_H
80¶{{end}}
81
82
83{{/*
84-------------------------------------------------------------------------------
85 api_gen.cpp
86-------------------------------------------------------------------------------
87*/}}
88{{define "api_gen.cpp"}}
89{{Macro "Copyright"}}
90
91// WARNING: This file is generated. See ../README.md for instructions.
92
93#include <string.h>
Mark Salyzyn7823e122016-09-29 08:08:05 -070094
Chia-I Wu0c203242016-03-15 13:44:51 +080095#include <algorithm>
Mark Salyzyn7823e122016-09-29 08:08:05 -070096
97#include <log/log.h>
Chia-I Wu0c203242016-03-15 13:44:51 +080098
Chia-I Wu3e654dc2016-05-20 16:15:06 +080099// to catch mismatches between vulkan.h and this file
100#undef VK_NO_PROTOTYPES
Chia-I Wu0c203242016-03-15 13:44:51 +0800101#include "api.h"
102
103namespace vulkan
104namespace api
105
Chia-I Wucc5e2762016-03-24 13:01:16 +0800106{{Macro "C++.DefineInitProcMacro" "dispatch"}}
107
108{{Macro "api.C++.DefineInitProcExtMacro"}}
Chia-I Wu0c203242016-03-15 13:44:51 +0800109
Chia-I Wu8925efd2016-04-13 15:13:21 +0800110namespace
111
112// clang-format off
113
114{{range $f := AllCommands $}}
115 {{Macro "api.C++.DefineExtensionStub" $f}}
116{{end}}
117// clang-format on
118
119»} // anonymous
120
121bool InitDispatchTable(
122 VkInstance instance,
123 PFN_vkGetInstanceProcAddr get_proc,
124 const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions) {
Chia-I Wu0c203242016-03-15 13:44:51 +0800125 auto& data = GetData(instance);
126 bool success = true;
127
128 // clang-format off
129 {{range $f := AllCommands $}}
130 {{if (Macro "api.IsInstanceDispatchTableEntry" $f)}}
131 {{Macro "C++.InitProc" $f}}
132 {{end}}
133 {{end}}
134 // clang-format on
135
136 return success;
137}
138
Chia-I Wu8925efd2016-04-13 15:13:21 +0800139bool InitDispatchTable(
140 VkDevice dev,
141 PFN_vkGetDeviceProcAddr get_proc,
142 const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions) {
Chia-I Wu0c203242016-03-15 13:44:51 +0800143 auto& data = GetData(dev);
144 bool success = true;
145
146 // clang-format off
147 {{range $f := AllCommands $}}
148 {{if (Macro "api.IsDeviceDispatchTableEntry" $f)}}
149 {{Macro "C++.InitProc" $f}}
150 {{end}}
151 {{end}}
152 // clang-format on
153
154 return success;
155}
156
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800157// clang-format off
158
159namespace
160
161// forward declarations needed by GetInstanceProcAddr and GetDeviceProcAddr
162{{range $f := AllCommands $}}
163 {{if and (Macro "IsFunctionExported" $f) (not (Macro "api.IsIntercepted" $f))}}
164 VKAPI_ATTR {{Node "Type" $f.Return}} {{Macro "BaseName" $f}}({{Macro "Parameters" $f}});
165 {{end}}
166{{end}}
167
168{{range $f := AllCommands $}}
169 {{if and (Macro "IsFunctionExported" $f) (not (Macro "api.IsIntercepted" $f))}}
170 VKAPI_ATTR {{Node "Type" $f.Return}} {{Macro "BaseName" $f}}({{Macro "Parameters" $f}}) {
171 {{ if eq $f.Name "vkGetInstanceProcAddr"}}
172 {{Macro "api.C++.InterceptInstanceProcAddr" $}}
173 {{else if eq $f.Name "vkGetDeviceProcAddr"}}
174 {{Macro "api.C++.InterceptDeviceProcAddr" $}}
175 {{end}}
176
177 {{Macro "api.C++.Dispatch" $f}}
178 }
179
180 {{end}}
181{{end}}
182
183»} // anonymous namespace
184
185// clang-format on
186
Chia-I Wu0c203242016-03-15 13:44:51 +0800187»} // namespace api
188»} // namespace vulkan
189
190// clang-format off
191
192{{range $f := AllCommands $}}
193 {{if (Macro "IsFunctionExported" $f)}}
194 __attribute__((visibility("default")))
195 VKAPI_ATTR {{Node "Type" $f.Return}} {{$f.Name}}({{Macro "Parameters" $f}}) {
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800196 {{if not (IsVoid $f.Return.Type)}}return §{{end}}
197 vulkan::api::{{Macro "BaseName" $f}}({{Macro "Arguments" $f}});
Chia-I Wu0c203242016-03-15 13:44:51 +0800198 }
199
200 {{end}}
201{{end}}
202
203// clang-format on
204¶{{end}}
205
206
207{{/*
Chia-I Wueb7db122016-03-24 09:11:06 +0800208-------------------------------------------------------------------------------
209 driver_gen.h
210-------------------------------------------------------------------------------
211*/}}
212{{define "driver_gen.h"}}
213{{Macro "Copyright"}}
214
215// WARNING: This file is generated. See ../README.md for instructions.
216
217#ifndef LIBVULKAN_DRIVER_GEN_H
218#define LIBVULKAN_DRIVER_GEN_H
219
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800220#include <bitset>
Chia-I Wueb7db122016-03-24 09:11:06 +0800221#include <vulkan/vulkan.h>
222#include <vulkan/vk_android_native_buffer.h>
223
224namespace vulkan
225namespace driver
226
227{{Macro "driver.C++.DefineProcHookType"}}
228
Chia-I Wucc5e2762016-03-24 13:01:16 +0800229struct InstanceDriverTable {
230 // clang-format off
231 {{range $f := AllCommands $}}
232 {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
233 {{Macro "C++.DeclareTableEntry" $f}};
234 {{end}}
235 {{end}}
236 // clang-format on
237};
238
239struct DeviceDriverTable {
240 // clang-format off
241 {{range $f := AllCommands $}}
242 {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
243 {{Macro "C++.DeclareTableEntry" $f}};
244 {{end}}
245 {{end}}
246 // clang-format on
247};
248
Chia-I Wueb7db122016-03-24 09:11:06 +0800249const ProcHook* GetProcHook(const char* name);
250ProcHook::Extension GetProcHookExtension(const char* name);
251
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800252bool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc,
253 const std::bitset<ProcHook::EXTENSION_COUNT> &extensions);
254bool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
255 const std::bitset<ProcHook::EXTENSION_COUNT> &extensions);
Chia-I Wucc5e2762016-03-24 13:01:16 +0800256
Chia-I Wueb7db122016-03-24 09:11:06 +0800257»} // namespace driver
258»} // namespace vulkan
259
260#endif // LIBVULKAN_DRIVER_TABLE_H
261¶{{end}}
262
263
264{{/*
265-------------------------------------------------------------------------------
266 driver_gen.cpp
267-------------------------------------------------------------------------------
268*/}}
269{{define "driver_gen.cpp"}}
270{{Macro "Copyright"}}
271
272// WARNING: This file is generated. See ../README.md for instructions.
273
274#include <string.h>
Mark Salyzyn7823e122016-09-29 08:08:05 -0700275
Chia-I Wueb7db122016-03-24 09:11:06 +0800276#include <algorithm>
Mark Salyzyn7823e122016-09-29 08:08:05 -0700277
278#include <log/log.h>
Chia-I Wueb7db122016-03-24 09:11:06 +0800279
280#include "driver.h"
Chia-I Wueb7db122016-03-24 09:11:06 +0800281
282namespace vulkan
283namespace driver
284
285namespace
286
287// clang-format off
288
289{{range $f := AllCommands $}}
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800290 {{Macro "driver.C++.DefineProcHookStub" $f}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800291{{end}}
292// clang-format on
293
294const ProcHook g_proc_hooks[] = {
295 // clang-format off
296 {{range $f := SortBy (AllCommands $) "FunctionName"}}
297 {{if (Macro "driver.IsIntercepted" $f)}}
298 {{ if (Macro "IsGloballyDispatched" $f)}}
299 {{Macro "driver.C++.DefineGlobalProcHook" $f}}
300 {{else if (Macro "IsInstanceDispatched" $f)}}
301 {{Macro "driver.C++.DefineInstanceProcHook" $f}}
302 {{else if (Macro "IsDeviceDispatched" $f)}}
303 {{Macro "driver.C++.DefineDeviceProcHook" $f}}
304 {{end}}
305 {{end}}
306 {{end}}
307 // clang-format on
308};
309
310»} // anonymous
311
312const ProcHook* GetProcHook(const char* name) {
313 const auto& begin = g_proc_hooks;
314 const auto& end = g_proc_hooks +
315 sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
316 const auto hook = std::lower_bound(begin, end, name,
317 [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
318 return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
319}
320
321ProcHook::Extension GetProcHookExtension(const char* name) {
Chris Forbes6aa30db2017-02-20 17:12:53 +1300322 {{$exts := Strings (Macro "driver.KnownExtensions") | SplitOn "\n"}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800323 // clang-format off
324 {{range $e := $exts}}
325 if (strcmp(name, "{{$e}}") == 0) return ProcHook::{{TrimPrefix "VK_" $e}};
326 {{end}}
327 // clang-format on
328 return ProcHook::EXTENSION_UNKNOWN;
329}
330
Chia-I Wucc5e2762016-03-24 13:01:16 +0800331{{Macro "C++.DefineInitProcMacro" "driver"}}
332
333{{Macro "driver.C++.DefineInitProcExtMacro"}}
334
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800335bool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc,
336 const std::bitset<ProcHook::EXTENSION_COUNT> &extensions)
Chia-I Wucc5e2762016-03-24 13:01:16 +0800337{
338 auto& data = GetData(instance);
339 bool success = true;
340
341 // clang-format off
342 {{range $f := AllCommands $}}
343 {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
344 {{Macro "C++.InitProc" $f}}
345 {{end}}
346 {{end}}
347 // clang-format on
348
349 return success;
350}
351
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800352bool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
353 const std::bitset<ProcHook::EXTENSION_COUNT> &extensions)
Chia-I Wucc5e2762016-03-24 13:01:16 +0800354{
355 auto& data = GetData(dev);
356 bool success = true;
357
358 // clang-format off
359 {{range $f := AllCommands $}}
360 {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
361 {{Macro "C++.InitProc" $f}}
362 {{end}}
363 {{end}}
364 // clang-format on
365
366 return success;
367}
368
Chia-I Wueb7db122016-03-24 09:11:06 +0800369»} // namespace driver
370»} // namespace vulkan
371
372// clang-format on
373¶{{end}}
374
375
376{{/*
Chia-I Wu0c203242016-03-15 13:44:51 +0800377------------------------------------------------------------------------------
Chia-I Wucc5e2762016-03-24 13:01:16 +0800378 Emits a declaration of a dispatch/driver table entry.
Chia-I Wu0c203242016-03-15 13:44:51 +0800379------------------------------------------------------------------------------
380*/}}
Chia-I Wucc5e2762016-03-24 13:01:16 +0800381{{define "C++.DeclareTableEntry"}}
Chia-I Wu0c203242016-03-15 13:44:51 +0800382 {{AssertType $ "Function"}}
383
384 {{Macro "FunctionPtrName" $}} {{Macro "BaseName" $}}
385{{end}}
386
387
388{{/*
389-------------------------------------------------------------------------------
Chia-I Wucc5e2762016-03-24 13:01:16 +0800390 Emits INIT_PROC macro.
Chia-I Wu0c203242016-03-15 13:44:51 +0800391-------------------------------------------------------------------------------
392*/}}
Chia-I Wucc5e2762016-03-24 13:01:16 +0800393{{define "C++.DefineInitProcMacro"}}
Chia-I Wu0c203242016-03-15 13:44:51 +0800394 #define UNLIKELY(expr) __builtin_expect((expr), 0)
395
Chris Forbes5948b3e2016-12-23 13:49:53 +1300396 #define INIT_PROC(required, obj, proc) do { \
Chia-I Wu0c203242016-03-15 13:44:51 +0800397 data.{{$}}.proc = reinterpret_cast<PFN_vk ## proc>( \
398 get_proc(obj, "vk" # proc)); \
Chris Forbes5948b3e2016-12-23 13:49:53 +1300399 if (UNLIKELY(required && !data.{{$}}.proc)) { \
Chia-I Wu0c203242016-03-15 13:44:51 +0800400 ALOGE("missing " # obj " proc: vk" # proc); \
401 success = false; \
402 } \
403 } while(0)
Chia-I Wu0c203242016-03-15 13:44:51 +0800404{{end}}
405
406
407{{/*
408-------------------------------------------------------------------------------
409 Emits code to invoke INIT_PROC or INIT_PROC_EXT.
410-------------------------------------------------------------------------------
411*/}}
412{{define "C++.InitProc"}}
413 {{AssertType $ "Function"}}
414
415 {{$ext := GetAnnotation $ "extension"}}
416 {{if $ext}}
Jesse Halld1abd742017-02-09 21:45:51 -0800417 INIT_PROC_EXT({{Macro "BaseName" $ext}}, §
Chia-I Wu0c203242016-03-15 13:44:51 +0800418 {{else}}
Jesse Halld1abd742017-02-09 21:45:51 -0800419 INIT_PROC
Chia-I Wu0c203242016-03-15 13:44:51 +0800420 {{end}}
421
Ian Elliott28bd2c32017-10-13 09:21:12 -0600422 {{if GetAnnotation $ "optional"}}false{{else if GetAnnotation $ "vulkan1_1"}}false{{else}}true{{end}}, §
Jesse Halld1abd742017-02-09 21:45:51 -0800423
Chia-I Wu0c203242016-03-15 13:44:51 +0800424 {{if (Macro "IsInstanceDispatched" $)}}
425 instance, §
426 {{else}}
427 dev, §
428 {{end}}
429
430 {{Macro "BaseName" $}});
431{{end}}
432
433
434{{/*
435------------------------------------------------------------------------------
436 Emits true if a function is exported and instance-dispatched.
437------------------------------------------------------------------------------
438*/}}
439{{define "api.IsInstanceDispatchTableEntry"}}
440 {{AssertType $ "Function"}}
441
442 {{if and (Macro "IsFunctionExported" $) (Macro "IsInstanceDispatched" $)}}
Chia-I Wudbd33bc2016-06-02 11:25:47 +0800443 {{/* deprecated and unused internally */}}
444 {{if not (eq $.Name "vkEnumerateDeviceLayerProperties")}}
445 true
446 {{end}}
Chia-I Wu0c203242016-03-15 13:44:51 +0800447 {{end}}
448{{end}}
449
450
451{{/*
452------------------------------------------------------------------------------
453 Emits true if a function is exported and device-dispatched.
454------------------------------------------------------------------------------
455*/}}
456{{define "api.IsDeviceDispatchTableEntry"}}
457 {{AssertType $ "Function"}}
458
459 {{if and (Macro "IsFunctionExported" $) (Macro "IsDeviceDispatched" $)}}
460 true
461 {{end}}
462{{end}}
463
464
465{{/*
466------------------------------------------------------------------------------
467 Emits true if a function is intercepted by vulkan::api.
468------------------------------------------------------------------------------
469*/}}
470{{define "api.IsIntercepted"}}
471 {{AssertType $ "Function"}}
472
473 {{if (Macro "IsFunctionSupported" $)}}
474 {{/* Global functions cannot be dispatched at all */}}
475 {{ if (Macro "IsGloballyDispatched" $)}}true
476
477 {{/* VkPhysicalDevice functions that manage device layers */}}
478 {{else if eq $.Name "vkCreateDevice"}}true
479 {{else if eq $.Name "vkEnumerateDeviceLayerProperties"}}true
480 {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
481
482 {{/* Destroy functions of dispatchable objects */}}
483 {{else if eq $.Name "vkDestroyInstance"}}true
484 {{else if eq $.Name "vkDestroyDevice"}}true
485
486 {{end}}
487 {{end}}
488{{end}}
489
490
491{{/*
Chia-I Wucc5e2762016-03-24 13:01:16 +0800492-------------------------------------------------------------------------------
493 Emits INIT_PROC_EXT macro for vulkan::api.
494-------------------------------------------------------------------------------
495*/}}
496{{define "api.C++.DefineInitProcExtMacro"}}
Chia-I Wu8925efd2016-04-13 15:13:21 +0800497 // Exported extension functions may be invoked even when their extensions
498 // are disabled. Dispatch to stubs when that happens.
Chris Forbes5948b3e2016-12-23 13:49:53 +1300499 #define INIT_PROC_EXT(ext, required, obj, proc) do { \
Chia-I Wu8925efd2016-04-13 15:13:21 +0800500 if (extensions[driver::ProcHook::ext]) \
Chris Forbes5948b3e2016-12-23 13:49:53 +1300501 INIT_PROC(required, obj, proc); \
Chia-I Wu8925efd2016-04-13 15:13:21 +0800502 else \
503 data.dispatch.proc = disabled ## proc; \
Chia-I Wucc5e2762016-03-24 13:01:16 +0800504 } while(0)
505{{end}}
506
507
508{{/*
Chia-I Wu8925efd2016-04-13 15:13:21 +0800509-------------------------------------------------------------------------------
510 Emits a stub for an exported extension function.
511-------------------------------------------------------------------------------
512*/}}
513{{define "api.C++.DefineExtensionStub"}}
514 {{AssertType $ "Function"}}
515
516 {{$ext := GetAnnotation $ "extension"}}
517 {{if and $ext (Macro "IsFunctionExported" $)}}
518 {{$ext_name := index $ext.Arguments 0}}
519
520 {{$base := (Macro "BaseName" $)}}
Chia-I Wu8925efd2016-04-13 15:13:21 +0800521
Chia-I Wu5beb2ac2016-05-04 16:37:23 +0800522 {{$p0 := (index $.CallParameters 0)}}
523 {{$ptail := (Tail 1 $.CallParameters)}}
524
525 {{$first_type := (Macro "Parameter" $p0)}}
526 {{$tail_types := (ForEach $ptail "ParameterType" | JoinWith ", ")}}
527
528 VKAPI_ATTR {{Node "Type" $.Return}} disabled{{$base}}({{$first_type}}, {{$tail_types}}) {
529 driver::Logger({{$p0.Name}}).Err({{$p0.Name}}, §
530 "{{$ext_name}} not enabled. Exported {{$.Name}} not executed.");
Chia-I Wu8925efd2016-04-13 15:13:21 +0800531 {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
532 }
533
534 {{end}}
535{{end}}
536
537
538{{/*
Chia-I Wu0c203242016-03-15 13:44:51 +0800539------------------------------------------------------------------------------
540 Emits code for vkGetInstanceProcAddr for function interception.
541------------------------------------------------------------------------------
542*/}}
543{{define "api.C++.InterceptInstanceProcAddr"}}
544 {{AssertType $ "API"}}
545
546 // global functions
Chia-I Wu5beb2ac2016-05-04 16:37:23 +0800547 if (instance == VK_NULL_HANDLE) {
Chia-I Wu0c203242016-03-15 13:44:51 +0800548 {{range $f := AllCommands $}}
549 {{if (Macro "IsGloballyDispatched" $f)}}
550 if (strcmp(pName, "{{$f.Name}}") == 0) return §
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800551 reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}});
Chia-I Wu0c203242016-03-15 13:44:51 +0800552 {{end}}
553 {{end}}
554
Chia-I Wu5beb2ac2016-05-04 16:37:23 +0800555 ALOGE("invalid vkGetInstanceProcAddr(VK_NULL_HANDLE, \"%s\") call", pName);
Chia-I Wu0c203242016-03-15 13:44:51 +0800556 return nullptr;
557 }
558
559 static const struct Hook {
560 const char* name;
561 PFN_vkVoidFunction proc;
562 } hooks[] = {
563 {{range $f := SortBy (AllCommands $) "FunctionName"}}
564 {{if (Macro "IsFunctionExported" $f)}}
565 {{/* hide global functions */}}
566 {{if (Macro "IsGloballyDispatched" $f)}}
567 { "{{$f.Name}}", nullptr },
568
569 {{/* redirect intercepted functions */}}
570 {{else if (Macro "api.IsIntercepted" $f)}}
571 { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>(§
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800572 {{Macro "BaseName" $f}}) },
Chia-I Wu0c203242016-03-15 13:44:51 +0800573
574 {{/* redirect vkGetInstanceProcAddr to itself */}}
575 {{else if eq $f.Name "vkGetInstanceProcAddr"}}
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800576 { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
Chia-I Wu0c203242016-03-15 13:44:51 +0800577
578 {{/* redirect device functions to themselves as a workaround for
579 layers that do not intercept in their vkGetInstanceProcAddr */}}
580 {{else if (Macro "IsDeviceDispatched" $f)}}
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800581 { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
Chia-I Wu0c203242016-03-15 13:44:51 +0800582
583 {{end}}
584 {{end}}
585 {{end}}
586 };
587 // clang-format on
588 constexpr size_t count = sizeof(hooks) / sizeof(hooks[0]);
589 auto hook = std::lower_bound(
590 hooks, hooks + count, pName,
591 [](const Hook& h, const char* n) { return strcmp(h.name, n) < 0; });
592 if (hook < hooks + count && strcmp(hook->name, pName) == 0) {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +0800593 if (!hook->proc) {
594 vulkan::driver::Logger(instance).Err(
595 instance, "invalid vkGetInstanceProcAddr(%p, \"%s\") call",
596 instance, pName);
597 }
Chia-I Wu0c203242016-03-15 13:44:51 +0800598 return hook->proc;
599 }
600 // clang-format off
601
602{{end}}
603
604
605{{/*
606------------------------------------------------------------------------------
607 Emits code for vkGetDeviceProcAddr for function interception.
608------------------------------------------------------------------------------
609*/}}
610{{define "api.C++.InterceptDeviceProcAddr"}}
611 {{AssertType $ "API"}}
612
613 if (device == VK_NULL_HANDLE) {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +0800614 ALOGE("invalid vkGetDeviceProcAddr(VK_NULL_HANDLE, ...) call");
Chia-I Wu0c203242016-03-15 13:44:51 +0800615 return nullptr;
616 }
617
618 static const char* const known_non_device_names[] = {
619 {{range $f := SortBy (AllCommands $) "FunctionName"}}
620 {{if (Macro "IsFunctionSupported" $f)}}
621 {{if not (Macro "IsDeviceDispatched" $f)}}
622 "{{$f.Name}}",
623 {{end}}
624 {{end}}
625 {{end}}
626 };
627 // clang-format on
628 constexpr size_t count = sizeof(known_non_device_names) /
629 sizeof(known_non_device_names[0]);
630 if (!pName ||
631 std::binary_search(
632 known_non_device_names, known_non_device_names + count, pName,
633 [](const char* a, const char* b) { return (strcmp(a, b) < 0); })) {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +0800634 vulkan::driver::Logger(device).Err
635 device, "invalid vkGetDeviceProcAddr(%p, \"%s\") call", device
636 (pName) ? pName : "(null)");
Chia-I Wu0c203242016-03-15 13:44:51 +0800637 return nullptr;
638 }
639 // clang-format off
640
Chia-I Wuc56603e2016-04-12 11:16:17 +0800641 {{range $f := AllCommands $}}
642 {{if (Macro "IsDeviceDispatched" $f)}}
643 {{ if (Macro "api.IsIntercepted" $f)}}
644 if (strcmp(pName, "{{$f.Name}}") == 0) return §
645 reinterpret_cast<PFN_vkVoidFunction>(§
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800646 {{Macro "BaseName" $f}});
Chia-I Wuc56603e2016-04-12 11:16:17 +0800647 {{else if eq $f.Name "vkGetDeviceProcAddr"}}
648 if (strcmp(pName, "{{$f.Name}}") == 0) return §
649 reinterpret_cast<PFN_vkVoidFunction>(§
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800650 {{Macro "BaseName" $f}});
Chia-I Wuc56603e2016-04-12 11:16:17 +0800651 {{end}}
652 {{end}}
653 {{end}}
654
Chia-I Wu0c203242016-03-15 13:44:51 +0800655{{end}}
656
657
658{{/*
659------------------------------------------------------------------------------
660 Emits code to dispatch a function.
661------------------------------------------------------------------------------
662*/}}
663{{define "api.C++.Dispatch"}}
664 {{AssertType $ "Function"}}
Chia-I Wu0c203242016-03-15 13:44:51 +0800665 {{if (Macro "api.IsIntercepted" $)}}
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800666 {{Error "$.Name should not be generated"}}
Chia-I Wu0c203242016-03-15 13:44:51 +0800667 {{end}}
668
Chia-I Wu3e654dc2016-05-20 16:15:06 +0800669 {{if not (IsVoid $.Return.Type)}}return §{{end}}
670
671 {{$p0 := index $.CallParameters 0}}
672 GetData({{$p0.Name}}).dispatch
Chia-I Wu0c203242016-03-15 13:44:51 +0800673 {{Macro "BaseName" $}}({{Macro "Arguments" $}});
674{{end}}
675
676
677{{/*
Chia-I Wueb7db122016-03-24 09:11:06 +0800678------------------------------------------------------------------------------
679 Emits a list of extensions intercepted by vulkan::driver.
680------------------------------------------------------------------------------
681*/}}
682{{define "driver.InterceptedExtensions"}}
683VK_ANDROID_native_buffer
684VK_EXT_debug_report
Courtney Goeltzenleuchterd634c482017-01-05 15:55:31 -0700685VK_EXT_hdr_metadata
Courtney Goeltzenleuchtere278daf2017-02-02 16:54:57 -0700686VK_EXT_swapchain_colorspace
Courtney Goeltzenleuchterd634c482017-01-05 15:55:31 -0700687VK_GOOGLE_display_timing
Chia-I Wueb7db122016-03-24 09:11:06 +0800688VK_KHR_android_surface
Ian Elliott948233a2017-01-06 12:13:23 -0700689VK_KHR_incremental_present
Courtney Goeltzenleuchtere278daf2017-02-02 16:54:57 -0700690VK_KHR_shared_presentable_image
Chia-I Wueb7db122016-03-24 09:11:06 +0800691VK_KHR_surface
692VK_KHR_swapchain
Chris Forbes2452cf72017-03-16 16:30:17 +1300693VK_KHR_get_surface_capabilities2
Chia-I Wueb7db122016-03-24 09:11:06 +0800694{{end}}
695
696
697{{/*
698------------------------------------------------------------------------------
Chris Forbes6aa30db2017-02-20 17:12:53 +1300699 Emits a list of extensions known to vulkan::driver.
700------------------------------------------------------------------------------
701*/}}
702{{define "driver.KnownExtensions"}}
703{{Macro "driver.InterceptedExtensions"}}
704VK_KHR_get_physical_device_properties2
Jesse Hallcaea4112018-01-18 15:40:46 -0800705VK_ANDROID_external_memory_android_hardware_buffer
Yiwei Zhang23143102019-04-10 18:24:05 -0700706VK_KHR_bind_memory2
Chris Forbes6aa30db2017-02-20 17:12:53 +1300707{{end}}
708
709
710{{/*
711------------------------------------------------------------------------------
Chia-I Wueb7db122016-03-24 09:11:06 +0800712 Emits true if an extension is intercepted by vulkan::driver.
713------------------------------------------------------------------------------
714*/}}
715{{define "driver.IsExtensionIntercepted"}}
716 {{$ext_name := index $.Arguments 0}}
717 {{$filters := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
718
719 {{range $f := $filters}}
720 {{if eq $ext_name $f}}true{{end}}
721 {{end}}
722{{end}}
723
724
725{{/*
726------------------------------------------------------------------------------
727 Emits true if a function is intercepted by vulkan::driver.
728------------------------------------------------------------------------------
729*/}}
730{{define "driver.IsIntercepted"}}
731 {{AssertType $ "Function"}}
732
733 {{if (Macro "IsFunctionSupported" $)}}
734 {{/* Create functions of dispatchable objects */}}
735 {{ if eq $.Name "vkCreateInstance"}}true
736 {{else if eq $.Name "vkCreateDevice"}}true
Chia-I Wuff4a6c72016-03-24 16:05:56 +0800737 {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
Daniel Koch09f7bf92017-10-05 00:26:58 -0400738 {{else if eq $.Name "vkEnumeratePhysicalDeviceGroups"}}true
Chia-I Wueb7db122016-03-24 09:11:06 +0800739 {{else if eq $.Name "vkGetDeviceQueue"}}true
Daniel Koch09f7bf92017-10-05 00:26:58 -0400740 {{else if eq $.Name "vkGetDeviceQueue2"}}true
Chia-I Wueb7db122016-03-24 09:11:06 +0800741 {{else if eq $.Name "vkAllocateCommandBuffers"}}true
742
743 {{/* Destroy functions of dispatchable objects */}}
744 {{else if eq $.Name "vkDestroyInstance"}}true
745 {{else if eq $.Name "vkDestroyDevice"}}true
746
747 {{/* Enumeration of extensions */}}
748 {{else if eq $.Name "vkEnumerateInstanceExtensionProperties"}}true
749 {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
750
Chia-I Wueb7db122016-03-24 09:11:06 +0800751 {{else if eq $.Name "vkGetInstanceProcAddr"}}true
752 {{else if eq $.Name "vkGetDeviceProcAddr"}}true
753
Yiwei Zhang23143102019-04-10 18:24:05 -0700754 {{/* VK_KHR_swapchain v69 requirement */}}
755 {{else if eq $.Name "vkBindImageMemory2"}}true
756 {{else if eq $.Name "vkBindImageMemory2KHR"}}true
Chia-I Wueb7db122016-03-24 09:11:06 +0800757 {{end}}
758
759 {{$ext := GetAnnotation $ "extension"}}
760 {{if $ext}}
761 {{Macro "driver.IsExtensionIntercepted" $ext}}
762 {{end}}
763
764 {{end}}
765{{end}}
766
767
768{{/*
769------------------------------------------------------------------------------
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800770 Emits true if a function needs a ProcHook stub.
Chia-I Wueb7db122016-03-24 09:11:06 +0800771------------------------------------------------------------------------------
772*/}}
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800773{{define "driver.NeedProcHookStub"}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800774 {{AssertType $ "Function"}}
775
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800776 {{if and (Macro "driver.IsIntercepted" $) (Macro "IsDeviceDispatched" $)}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800777 {{$ext := GetAnnotation $ "extension"}}
778 {{if $ext}}
779 {{if not (Macro "IsExtensionInternal" $ext)}}true{{end}}
780 {{end}}
781 {{end}}
782{{end}}
783
784
785{{/*
786-------------------------------------------------------------------------------
787 Emits definition of struct ProcHook.
788-------------------------------------------------------------------------------
789*/}}
790{{define "driver.C++.DefineProcHookType"}}
791 struct ProcHook {
792 enum Type {
793 GLOBAL,
794 INSTANCE,
795 DEVICE,
796 };
797
798 enum Extension {
Chris Forbes6aa30db2017-02-20 17:12:53 +1300799 {{$exts := Strings (Macro "driver.KnownExtensions") | SplitOn "\n"}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800800 {{range $e := $exts}}
801 {{TrimPrefix "VK_" $e}},
802 {{end}}
803
804 EXTENSION_CORE, // valid bit
805 EXTENSION_COUNT,
806 EXTENSION_UNKNOWN,
807 };
808
809 const char* name;
810 Type type;
811 Extension extension;
812
813 PFN_vkVoidFunction proc;
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800814 PFN_vkVoidFunction checked_proc; // always nullptr for non-device hooks
Chia-I Wueb7db122016-03-24 09:11:06 +0800815 };
816{{end}}
817
818
819{{/*
820-------------------------------------------------------------------------------
Chia-I Wucc5e2762016-03-24 13:01:16 +0800821 Emits INIT_PROC_EXT macro for vulkan::driver.
822-------------------------------------------------------------------------------
823*/}}
824{{define "driver.C++.DefineInitProcExtMacro"}}
Chris Forbes5948b3e2016-12-23 13:49:53 +1300825 #define INIT_PROC_EXT(ext, required, obj, proc) do { \
Chia-I Wucbe07ef2016-04-13 15:01:00 +0800826 if (extensions[ProcHook::ext]) \
Chris Forbes5948b3e2016-12-23 13:49:53 +1300827 INIT_PROC(required, obj, proc); \
Chia-I Wucc5e2762016-03-24 13:01:16 +0800828 } while(0)
829{{end}}
830
831
832{{/*
833-------------------------------------------------------------------------------
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800834 Emits a stub for ProcHook::checked_proc.
Chia-I Wueb7db122016-03-24 09:11:06 +0800835-------------------------------------------------------------------------------
836*/}}
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800837{{define "driver.C++.DefineProcHookStub"}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800838 {{AssertType $ "Function"}}
839
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800840 {{if (Macro "driver.NeedProcHookStub" $)}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800841 {{$ext := GetAnnotation $ "extension"}}
842 {{$ext_name := index $ext.Arguments 0}}
843
844 {{$base := (Macro "BaseName" $)}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800845
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800846 VKAPI_ATTR {{Node "Type" $.Return}} checked{{$base}}({{Macro "Parameters" $}}) {
847 {{$p0 := index $.CallParameters 0}}
848 {{$ext_hook := Strings ("ProcHook::") (Macro "BaseName" $ext)}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800849
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800850 if (GetData({{$p0.Name}}).hook_extensions[{{$ext_hook}}]) {
851 {{if not (IsVoid $.Return.Type)}}return §{{end}}
852 {{$base}}({{Macro "Arguments" $}});
853 } else {
Chia-I Wu5beb2ac2016-05-04 16:37:23 +0800854 Logger({{$p0.Name}}).Err({{$p0.Name}}, "{{$ext_name}} not enabled. {{$.Name}} not executed.");
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800855 {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
Chia-I Wueb7db122016-03-24 09:11:06 +0800856 }
Chia-I Wu36cc00a2016-04-13 16:52:06 +0800857 }
Chia-I Wueb7db122016-03-24 09:11:06 +0800858
859 {{end}}
860{{end}}
861
862
863{{/*
864-------------------------------------------------------------------------------
865 Emits definition of a global ProcHook.
866-------------------------------------------------------------------------------
867*/}}
868{{define "driver.C++.DefineGlobalProcHook"}}
869 {{AssertType $ "Function"}}
870
871 {{$base := (Macro "BaseName" $)}}
872
873 {{$ext := GetAnnotation $ "extension"}}
874 {{if $ext}}
875 {{Error "invalid global extension"}}
876 {{end}}
877
878 {
879 "{{$.Name}}",
880 ProcHook::GLOBAL,
881 ProcHook::EXTENSION_CORE,
Chia-I Wuff4a6c72016-03-24 16:05:56 +0800882 reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
Chia-I Wueb7db122016-03-24 09:11:06 +0800883 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800884 },
885{{end}}
886
887
888{{/*
889-------------------------------------------------------------------------------
890 Emits definition of an instance ProcHook.
891-------------------------------------------------------------------------------
892*/}}
893{{define "driver.C++.DefineInstanceProcHook"}}
894 {{AssertType $ "Function"}}
895
896 {{$base := (Macro "BaseName" $)}}
897
898 {
899 "{{$.Name}}",
900 ProcHook::INSTANCE,
901
902 {{$ext := GetAnnotation $ "extension"}}
903 {{if $ext}}
904 ProcHook::{{Macro "BaseName" $ext}},
905
906 {{if (Macro "IsExtensionInternal" $ext)}}
907 nullptr,
908 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800909 {{else}}
Chia-I Wu62262232016-03-26 07:06:44 +0800910 reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
Chia-I Wueb7db122016-03-24 09:11:06 +0800911 nullptr,
912 {{end}}
913 {{else}}
914 ProcHook::EXTENSION_CORE,
Chia-I Wuff4a6c72016-03-24 16:05:56 +0800915 reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
Chia-I Wueb7db122016-03-24 09:11:06 +0800916 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800917 {{end}}
918 },
919{{end}}
920
921
922{{/*
923-------------------------------------------------------------------------------
924 Emits definition of a device ProcHook.
925-------------------------------------------------------------------------------
926*/}}
927{{define "driver.C++.DefineDeviceProcHook"}}
928 {{AssertType $ "Function"}}
929
930 {{$base := (Macro "BaseName" $)}}
931
932 {
933 "{{$.Name}}",
934 ProcHook::DEVICE,
935
936 {{$ext := GetAnnotation $ "extension"}}
937 {{if $ext}}
938 ProcHook::{{Macro "BaseName" $ext}},
939
940 {{if (Macro "IsExtensionInternal" $ext)}}
941 nullptr,
942 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800943 {{else}}
Chia-I Wu62262232016-03-26 07:06:44 +0800944 reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
Chia-I Wueb7db122016-03-24 09:11:06 +0800945 reinterpret_cast<PFN_vkVoidFunction>(checked{{$base}}),
946 {{end}}
947 {{else}}
Chia-I Wu4901db72016-03-24 16:38:58 +0800948 ProcHook::EXTENSION_CORE,
949 reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
950 nullptr,
Chia-I Wueb7db122016-03-24 09:11:06 +0800951 {{end}}
952 },
953{{end}}
954
955
956{{/*
Chia-I Wu0c203242016-03-15 13:44:51 +0800957-------------------------------------------------------------------------------
Chia-I Wucc5e2762016-03-24 13:01:16 +0800958 Emits true if a function is needed by vulkan::driver.
959-------------------------------------------------------------------------------
960*/}}
961{{define "driver.IsDriverTableEntry"}}
962 {{AssertType $ "Function"}}
963
964 {{if (Macro "IsFunctionSupported" $)}}
965 {{/* Create functions of dispatchable objects */}}
966 {{ if eq $.Name "vkCreateDevice"}}true
967 {{else if eq $.Name "vkGetDeviceQueue"}}true
Daniel Koch09f7bf92017-10-05 00:26:58 -0400968 {{else if eq $.Name "vkGetDeviceQueue2"}}true
Chia-I Wucc5e2762016-03-24 13:01:16 +0800969 {{else if eq $.Name "vkAllocateCommandBuffers"}}true
970
971 {{/* Destroy functions of dispatchable objects */}}
972 {{else if eq $.Name "vkDestroyInstance"}}true
973 {{else if eq $.Name "vkDestroyDevice"}}true
974
975 {{/* Enumeration of extensions */}}
976 {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
977
978 {{/* We cache physical devices in loader.cpp */}}
979 {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
Daniel Koch09f7bf92017-10-05 00:26:58 -0400980 {{else if eq $.Name "vkEnumeratePhysicalDeviceGroups"}}true
Chia-I Wucc5e2762016-03-24 13:01:16 +0800981
982 {{else if eq $.Name "vkGetInstanceProcAddr"}}true
983 {{else if eq $.Name "vkGetDeviceProcAddr"}}true
984
985 {{/* VK_KHR_swapchain->VK_ANDROID_native_buffer translation */}}
986 {{else if eq $.Name "vkCreateImage"}}true
987 {{else if eq $.Name "vkDestroyImage"}}true
988
Jesse Hall85bb0c52017-02-09 22:13:02 -0800989 {{else if eq $.Name "vkGetPhysicalDeviceProperties"}}true
Yiwei Zhangc1c9d3c2018-03-13 17:12:11 -0700990 {{else if eq $.Name "vkGetPhysicalDeviceProperties2"}}true
Chris Forbes6aa30db2017-02-20 17:12:53 +1300991 {{else if eq $.Name "vkGetPhysicalDeviceProperties2KHR"}}true
Yiwei Zhang23143102019-04-10 18:24:05 -0700992
993 {{/* VK_KHR_swapchain v69 requirement */}}
994 {{else if eq $.Name "vkBindImageMemory2"}}true
995 {{else if eq $.Name "vkBindImageMemory2KHR"}}true
Chia-I Wucc5e2762016-03-24 13:01:16 +0800996 {{end}}
997
998 {{$ext := GetAnnotation $ "extension"}}
999 {{if $ext}}
1000 {{$ext_name := index $ext.Arguments 0}}
1001 {{ if eq $ext_name "VK_ANDROID_native_buffer"}}true
1002 {{else if eq $ext_name "VK_EXT_debug_report"}}true
1003 {{end}}
1004 {{end}}
1005 {{end}}
1006{{end}}
1007
1008
1009{{/*
1010------------------------------------------------------------------------------
1011 Emits true if an instance-dispatched function is needed by vulkan::driver.
1012------------------------------------------------------------------------------
1013*/}}
1014{{define "driver.IsInstanceDriverTableEntry"}}
1015 {{AssertType $ "Function"}}
1016
1017 {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsInstanceDispatched" $)}}
1018 true
1019 {{end}}
1020{{end}}
1021
1022
1023{{/*
1024------------------------------------------------------------------------------
1025 Emits true if a device-dispatched function is needed by vulkan::driver.
1026------------------------------------------------------------------------------
1027*/}}
1028{{define "driver.IsDeviceDriverTableEntry"}}
1029 {{AssertType $ "Function"}}
1030
1031 {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsDeviceDispatched" $)}}
1032 true
1033 {{end}}
1034{{end}}
1035
1036
1037{{/*
1038-------------------------------------------------------------------------------
Chia-I Wu0c203242016-03-15 13:44:51 +08001039 Emits a function/extension name without the "vk"/"VK_" prefix.
1040-------------------------------------------------------------------------------
1041*/}}
1042{{define "BaseName"}}
1043 {{ if IsFunction $}}{{TrimPrefix "vk" $.Name}}
1044 {{else if eq $.Name "extension"}}{{TrimPrefix "VK_" (index $.Arguments 0)}}
1045 {{else}}{{Error "invalid use of BaseName"}}
1046 {{end}}
1047{{end}}
1048
1049
1050{{/*
1051-------------------------------------------------------------------------------
1052 Emits a comma-separated list of C parameter names for the given command.
1053-------------------------------------------------------------------------------
1054*/}}
1055{{define "Arguments"}}
1056 {{AssertType $ "Function"}}
1057
1058 {{ForEach $.CallParameters "ParameterName" | JoinWith ", "}}
1059{{end}}
1060
1061
1062{{/*
1063------------------------------------------------------------------------------
1064------------------------------------------------------------------------------
1065*/}}
1066{{define "IsGloballyDispatched"}}
1067 {{AssertType $ "Function"}}
1068 {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Global")}}
1069 true
1070 {{end}}
1071{{end}}
1072
1073
1074{{/*
1075------------------------------------------------------------------------------
1076 Emit "true" for supported functions that undergo table dispatch. Only global
1077 functions and functions handled in the loader top without calling into
1078 lower layers are not dispatched.
1079------------------------------------------------------------------------------
1080*/}}
1081{{define "IsInstanceDispatched"}}
1082 {{AssertType $ "Function"}}
1083 {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Instance")}}
1084 true
1085 {{end}}
1086{{end}}
1087
1088
1089{{/*
1090------------------------------------------------------------------------------
1091 Emit "true" for supported functions that can have device-specific dispatch.
1092------------------------------------------------------------------------------
1093*/}}
1094{{define "IsDeviceDispatched"}}
1095 {{AssertType $ "Function"}}
1096 {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Device")}}
1097 true
1098 {{end}}
1099{{end}}
1100
1101
1102{{/*
1103------------------------------------------------------------------------------
1104 Emit "true" if a function is core or from a supportable extension.
1105------------------------------------------------------------------------------
1106*/}}
1107{{define "IsFunctionSupported"}}
1108 {{AssertType $ "Function"}}
1109 {{if not (GetAnnotation $ "pfn")}}
1110 {{$ext := GetAnnotation $ "extension"}}
1111 {{if not $ext}}true
1112 {{else if not (Macro "IsExtensionBlacklisted" $ext)}}true
1113 {{end}}
1114 {{end}}
1115{{end}}
1116
1117
1118{{/*
1119------------------------------------------------------------------------------
1120 Decides whether a function should be exported from the Android Vulkan
1121 library. Functions in the core API and in loader extensions are exported.
1122------------------------------------------------------------------------------
1123*/}}
1124{{define "IsFunctionExported"}}
1125 {{AssertType $ "Function"}}
1126
1127 {{if (Macro "IsFunctionSupported" $)}}
1128 {{$ext := GetAnnotation $ "extension"}}
1129 {{if $ext}}
1130 {{Macro "IsExtensionExported" $ext}}
1131 {{else}}
1132 true
1133 {{end}}
1134 {{end}}
1135{{end}}
1136
1137
1138{{/*
1139------------------------------------------------------------------------------
1140 Emit "true" if an extension is unsupportable on Android.
1141------------------------------------------------------------------------------
1142*/}}
1143{{define "IsExtensionBlacklisted"}}
1144 {{$ext := index $.Arguments 0}}
1145 {{ if eq $ext "VK_KHR_display"}}true
1146 {{else if eq $ext "VK_KHR_display_swapchain"}}true
Chia-I Wu0c203242016-03-15 13:44:51 +08001147 {{else if eq $ext "VK_KHR_mir_surface"}}true
Jesse Hall77ad05b2017-03-10 22:02:20 -08001148 {{else if eq $ext "VK_KHR_xcb_surface"}}true
1149 {{else if eq $ext "VK_KHR_xlib_surface"}}true
1150 {{else if eq $ext "VK_KHR_wayland_surface"}}true
Chia-I Wu0c203242016-03-15 13:44:51 +08001151 {{else if eq $ext "VK_KHR_win32_surface"}}true
Jesse Hall9492f992017-08-28 12:10:06 -07001152 {{else if eq $ext "VK_KHR_external_memory_win32"}}true
1153 {{else if eq $ext "VK_KHR_win32_keyed_mutex"}}true
1154 {{else if eq $ext "VK_KHR_external_semaphore_win32"}}true
1155 {{else if eq $ext "VK_KHR_external_fence_win32"}}true
Jesse Hall77ad05b2017-03-10 22:02:20 -08001156 {{else if eq $ext "VK_EXT_acquire_xlib_display"}}true
1157 {{else if eq $ext "VK_EXT_direct_mode_display"}}true
1158 {{else if eq $ext "VK_EXT_display_surface_counter"}}true
1159 {{else if eq $ext "VK_EXT_display_control"}}true
Jesse Hall497c46f2018-10-08 12:52:48 -07001160 {{else if eq $ext "VK_FUCHSIA_imagepipe_surface"}}true
Jesse Hallad250842017-03-10 18:35:38 -08001161 {{else if eq $ext "VK_MVK_ios_surface"}}true
1162 {{else if eq $ext "VK_MVK_macos_surface"}}true
Jesse Hall77ad05b2017-03-10 22:02:20 -08001163 {{else if eq $ext "VK_NN_vi_surface"}}true
Jesse Halleb02c472017-02-24 15:13:45 -08001164 {{else if eq $ext "VK_NV_external_memory_win32"}}true
1165 {{else if eq $ext "VK_NV_win32_keyed_mutex"}}true
Chia-I Wu0c203242016-03-15 13:44:51 +08001166 {{end}}
1167{{end}}
1168
1169
1170{{/*
1171------------------------------------------------------------------------------
Courtney Goeltzenleuchterd634c482017-01-05 15:55:31 -07001172 Reports whether an extension has functions exported by the loader.
1173 E.g. applications can directly link to an extension function.
Chia-I Wu0c203242016-03-15 13:44:51 +08001174------------------------------------------------------------------------------
1175*/}}
1176{{define "IsExtensionExported"}}
1177 {{$ext := index $.Arguments 0}}
1178 {{ if eq $ext "VK_KHR_surface"}}true
1179 {{else if eq $ext "VK_KHR_swapchain"}}true
1180 {{else if eq $ext "VK_KHR_android_surface"}}true
Jesse Hallcaea4112018-01-18 15:40:46 -08001181 {{else if eq $ext "VK_ANDROID_external_memory_android_hardware_buffer"}}true
Chia-I Wu0c203242016-03-15 13:44:51 +08001182 {{end}}
1183{{end}}
Chia-I Wueb7db122016-03-24 09:11:06 +08001184
1185
1186{{/*
1187------------------------------------------------------------------------------
1188 Reports whether an extension is internal to the loader and drivers,
1189 so the loader should not enumerate it.
1190------------------------------------------------------------------------------
1191*/}}
1192{{define "IsExtensionInternal"}}
1193 {{$ext := index $.Arguments 0}}
1194 {{ if eq $ext "VK_ANDROID_native_buffer"}}true
1195 {{end}}
1196{{end}}