code-generator.tmpl revision 948233a57f0f2f6643a70019ef3c8287fd8d3771
10c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "Copyright"}}
20c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu/*
30c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* Copyright 2016 The Android Open Source Project
40c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•*
50c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* Licensed under the Apache License, Version 2.0 (the "License");
60c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* you may not use this file except in compliance with the License.
70c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* You may obtain a copy of the License at
80c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•*
90c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•*      http://www.apache.org/licenses/LICENSE-2.0
100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•*
110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* Unless required by applicable law or agreed to in writing, software
120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* distributed under the License is distributed on an "AS IS" BASIS,
130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* See the License for the specific language governing permissions and
150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•* limitations under the License.
160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu•*/
170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu¶{{end}}
180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{Include "../api/templates/vulkan_common.tmpl"}}
200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{Global "clang-format" (Strings "clang-format" "-style=file")}}
210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{Macro "DefineGlobals" $}}
220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{$ | Macro "api_gen.h"   | Format (Global "clang-format") | Write "api_gen.h"  }}
230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{$ | Macro "api_gen.cpp" | Format (Global "clang-format") | Write "api_gen.cpp"}}
24eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{$ | Macro "driver_gen.h" | Format (Global "clang-format") | Write "driver_gen.h"}}
25eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{$ | Macro "driver_gen.cpp" | Format (Global "clang-format") | Write "driver_gen.cpp"}}
260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  api_gen.h
300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api_gen.h"}}
330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{Macro "Copyright"}}
340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#ifndef LIBVULKAN_API_GEN_H
380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#define LIBVULKAN_API_GEN_H
390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu408925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu#include <bitset>
410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <vulkan/vulkan.h>
428925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu#include "driver_gen.h"
430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace vulkan {«
450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace api {«
460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wustruct InstanceDispatchTable {
480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{range $f := AllCommands $}}
500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if (Macro "api.IsInstanceDispatchTableEntry" $f)}}
51cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu};
560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wustruct DeviceDispatchTable {
580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{range $f := AllCommands $}}
600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if (Macro "api.IsDeviceDispatchTableEntry" $f)}}
61cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu};
660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu678925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wubool InitDispatchTable(
688925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    VkInstance instance,
698925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    PFN_vkGetInstanceProcAddr get_proc,
708925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions);
718925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wubool InitDispatchTable(
728925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    VkDevice dev,
738925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    PFN_vkGetDeviceProcAddr get_proc,
748925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions);
750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu»} // namespace api
770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu»} // namespace vulkan
780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#endif // LIBVULKAN_API_GEN_H
800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu¶{{end}}
810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  api_gen.cpp
860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api_gen.cpp"}}
890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{Macro "Copyright"}}
900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <string.h>
940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <algorithm>
95a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <android/log.h>
960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu973e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// to catch mismatches between vulkan.h and this file
983e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu#undef VK_NO_PROTOTYPES
990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include "api.h"
1000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace vulkan {«
1020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace api {«
1030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu104cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "C++.DefineInitProcMacro" "dispatch"}}
105cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu106cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "api.C++.DefineInitProcExtMacro"}}
1070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1088925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wunamespace {«
1098925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1108925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu// clang-format off
1118925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1128925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{range $f := AllCommands $}}
1138925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{Macro "api.C++.DefineExtensionStub" $f}}
1148925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{end}}
1158925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu// clang-format on
1168925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1178925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu»} // anonymous
1188925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1198925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wubool InitDispatchTable(
1208925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    VkInstance instance,
1218925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    PFN_vkGetInstanceProcAddr get_proc,
1228925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions) {
1230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    auto& data = GetData(instance);
1240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    bool success = true;
1250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format off
1270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
1280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "api.IsInstanceDispatchTableEntry" $f)}}
1290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "C++.InitProc" $f}}
1300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
1320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format on
1330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return success;
1350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu}
1360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1378925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wubool InitDispatchTable(
1388925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    VkDevice dev,
1398925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    PFN_vkGetDeviceProcAddr get_proc,
1408925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions) {
1410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    auto& data = GetData(dev);
1420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    bool success = true;
1430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format off
1450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
1460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "api.IsDeviceDispatchTableEntry" $f)}}
1470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "C++.InitProc" $f}}
1480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
1500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format on
1510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return success;
1530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu}
1540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// clang-format off
1560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1573e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wunamespace {«
1583e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1593e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// forward declarations needed by GetInstanceProcAddr and GetDeviceProcAddr
1600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{range $f := AllCommands $}}
1613e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if and (Macro "IsFunctionExported" $f) (not (Macro "api.IsIntercepted" $f))}}
1623e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    VKAPI_ATTR {{Node "Type" $f.Return}} {{Macro "BaseName" $f}}({{Macro "Parameters" $f}});
1633e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{end}}
1643e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{end}}
1653e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1663e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{range $f := AllCommands $}}
1673e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if and (Macro "IsFunctionExported" $f) (not (Macro "api.IsIntercepted" $f))}}
1683e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    VKAPI_ATTR {{Node "Type" $f.Return}} {{Macro "BaseName" $f}}({{Macro "Parameters" $f}}) {
1690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{     if eq $f.Name "vkGetInstanceProcAddr"}}
1700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "api.C++.InterceptInstanceProcAddr" $}}
1710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{else if eq $f.Name "vkGetDeviceProcAddr"}}
1720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "api.C++.InterceptDeviceProcAddr" $}}
1730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
1750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{Macro "api.C++.Dispatch" $f}}
1760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    }
1770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
1790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
1800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1813e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu»}  // anonymous namespace
1823e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1833e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// clang-format on
1843e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1853e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu»} // namespace api
1863e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu»} // namespace vulkan
1873e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1883e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// clang-format off
1893e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1903e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{range $f := AllCommands $}}
1913e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if (Macro "IsFunctionExported" $f)}}
1923e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    __attribute__((visibility("default")))
1933e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    VKAPI_ATTR {{Node "Type" $f.Return}} {{$f.Name}}({{Macro "Parameters" $f}}) {
1943e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu      {{if not (IsVoid $f.Return.Type)}}return §{{end}}
1953e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu      vulkan::api::{{Macro "BaseName" $f}}({{Macro "Arguments" $f}});
1963e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    }
1973e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1983e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{end}}
1993e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{end}}
2003e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu2010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// clang-format on
2020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu¶{{end}}
2030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
2040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
2050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
206eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
207eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  driver_gen.h
208eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
209eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
210eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver_gen.h"}}
211eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "Copyright"}}
212eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu213eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
214eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu215eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#ifndef LIBVULKAN_DRIVER_GEN_H
216eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#define LIBVULKAN_DRIVER_GEN_H
217eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu218cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu#include <bitset>
219eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <vulkan/vulkan.h>
220eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <vulkan/vk_android_native_buffer.h>
221eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu222eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace vulkan {«
223eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace driver {«
224eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu225eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "driver.C++.DefineProcHookType"}}
226eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu227cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wustruct InstanceDriverTable {
228cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format off
229cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{range $f := AllCommands $}}
230cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
231cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
232cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
233cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
234cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format on
235cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu};
236cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu237cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wustruct DeviceDriverTable {
238cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format off
239cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{range $f := AllCommands $}}
240cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
241cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
242cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
243cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
244cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format on
245cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu};
246cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu247eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook* GetProcHook(const char* name);
248eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuProcHook::Extension GetProcHookExtension(const char* name);
249eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu250cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc,
251cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions);
252cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
253cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions);
254cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu255eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace driver
256eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace vulkan
257eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu258eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#endif // LIBVULKAN_DRIVER_TABLE_H
259eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu¶{{end}}
260eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
261eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
262eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
263eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
264eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  driver_gen.cpp
265eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
266eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
267eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver_gen.cpp"}}
268eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "Copyright"}}
269eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu270eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
271eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu272eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <string.h>
273eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <algorithm>
274a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <android/log.h>
275eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu276eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include "driver.h"
277eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu278eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace vulkan {«
279eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace driver {«
280eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu281eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace {«
282eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu283eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format off
284eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu285eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{range $f := AllCommands $}}
28636cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{Macro "driver.C++.DefineProcHookStub" $f}}
287eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
288eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format on
289eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu290eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook g_proc_hooks[] = {
291eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format off
292eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $f := SortBy (AllCommands $) "FunctionName"}}
293eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if (Macro "driver.IsIntercepted" $f)}}
294eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{     if (Macro "IsGloballyDispatched" $f)}}
295eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineGlobalProcHook" $f}}
296eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else if (Macro "IsInstanceDispatched" $f)}}
297eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineInstanceProcHook" $f}}
298eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else if (Macro "IsDeviceDispatched" $f)}}
299eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineDeviceProcHook" $f}}
300eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
301eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
302eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
303eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format on
304eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu};
305eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu306eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // anonymous
307eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu308eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook* GetProcHook(const char* name) {
309eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto& begin = g_proc_hooks;
310eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto& end = g_proc_hooks +
311eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
312eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto hook = std::lower_bound(begin, end, name,
313eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
314eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    return (hook <  end && strcmp(hook->name, name) == 0) ? hook : nullptr;
315eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu}
316eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu317eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuProcHook::Extension GetProcHookExtension(const char* name) {
318eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$exts := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
319eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format off
320eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $e := $exts}}
321eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    if (strcmp(name, "{{$e}}") == 0) return ProcHook::{{TrimPrefix "VK_" $e}};
322eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
323eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format on
324eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  return ProcHook::EXTENSION_UNKNOWN;
325eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu}
326eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu327cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "C++.DefineInitProcMacro" "driver"}}
328cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu329cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "driver.C++.DefineInitProcExtMacro"}}
330cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu331cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc,
332cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions)
333cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{
334cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    auto& data = GetData(instance);
335cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    bool success = true;
336cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu337cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format off
338cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{range $f := AllCommands $}}
339cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
340cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        {{Macro "C++.InitProc" $f}}
341cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
342cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
343cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format on
344cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu345cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    return success;
346cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu}
347cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu348cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
349cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions)
350cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{
351cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    auto& data = GetData(dev);
352cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    bool success = true;
353cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu354cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format off
355cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{range $f := AllCommands $}}
356cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
357cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        {{Macro "C++.InitProc" $f}}
358cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
359cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
360cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format on
361cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu362cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    return success;
363cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu}
364cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu365eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace driver
366eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace vulkan
367eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu368eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format on
369eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu¶{{end}}
370eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
371eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
372eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
3730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
374cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits a declaration of a dispatch/driver table entry.
3750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
3760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
377cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "C++.DeclareTableEntry"}}
3780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
3790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "FunctionPtrName" $}} {{Macro "BaseName" $}}
3810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
3820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
3850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
386cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC macro.
3870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
3880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
389cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "C++.DefineInitProcMacro"}}
3900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  #define UNLIKELY(expr) __builtin_expect((expr), 0)
3910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu3925948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  #define INIT_PROC(required, obj, proc) do {                   \
3930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      data.{{$}}.proc = reinterpret_cast<PFN_vk ## proc>(       \
3940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu              get_proc(obj, "vk" # proc));                      \
3955948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes      if (UNLIKELY(required && !data.{{$}}.proc)) {             \
3960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          ALOGE("missing " # obj " proc: vk" # proc);           \
3970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          success = false;                                      \
3980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      }                                                         \
3990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  } while(0)
4000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
4050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code to invoke INIT_PROC or INIT_PROC_EXT.
4060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
4070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "C++.InitProc"}}
4090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := GetAnnotation $ "extension"}}
4125948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  {{$required := (Macro "IsRequiredFunction" $)}}
4130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if $ext}}
4145948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes    INIT_PROC_EXT({{Macro "BaseName" $ext}}, {{$required}}, §
4150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
4165948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes    INIT_PROC({{$required}}, §
4170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsInstanceDispatched" $)}}
4200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    instance, §
4210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
4220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    dev, §
4230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}});
4260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4315948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  Emits true if a function /must/ be resolved. The only time this is not
4325948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  the case is for extension-added functions added in a later revision of the
4335948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  extension, and where we have to cope with drivers written against an older
4345948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  revision.
4355948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes------------------------------------------------------------------------------
4365948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes*/}}
4375948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes{{define "IsRequiredFunction"}}
4385948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  {{AssertType $ "Function"}}
4395948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes
4405948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  {{if eq $.Name "vkGetSwapchainGrallocUsage2ANDROID"}}
4415948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes    false
4425948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  {{else}}
4435948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes    true
4445948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  {{end}}
4455948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes{{end}}
4465948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes
4475948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes
4485948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes{{/*
4495948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes------------------------------------------------------------------------------
4500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and instance-dispatched.
4510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsInstanceDispatchTableEntry"}}
4540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsInstanceDispatched" $)}}
457dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{/* deprecated and unused internally */}}
458dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{if not (eq $.Name "vkEnumerateDeviceLayerProperties")}}
459dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu      true
460dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{end}}
4610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and device-dispatched.
4680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsDeviceDispatchTableEntry"}}
4710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsDeviceDispatched" $)}}
4740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
4750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is intercepted by vulkan::api.
4820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsIntercepted"}}
4850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
4880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Global functions cannot be dispatched at all */}}
4890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{     if (Macro "IsGloballyDispatched" $)}}true
4900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* VkPhysicalDevice functions that manage device layers */}}
4920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
4930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceLayerProperties"}}true
4940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
4950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Destroy functions of dispatchable objects */}}
4970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
4980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
4990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
5010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
5020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
5030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
506cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
507cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::api.
508cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
509cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
510cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "api.C++.DefineInitProcExtMacro"}}
5118925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  // Exported extension functions may be invoked even when their extensions
5128925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  // are disabled.  Dispatch to stubs when that happens.
5135948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  #define INIT_PROC_EXT(ext, required, obj, proc) do {          \
5148925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      if (extensions[driver::ProcHook::ext])                    \
5155948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes        INIT_PROC(required, obj, proc);                         \
5168925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      else                                                      \
5178925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu        data.dispatch.proc = disabled ## proc;                  \
518cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
519cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
5208925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5218925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5228925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{/*
5238925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu-------------------------------------------------------------------------------
5248925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  Emits a stub for an exported extension function.
5258925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu-------------------------------------------------------------------------------
5268925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu*/}}
5278925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{define "api.C++.DefineExtensionStub"}}
5288925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{AssertType $ "Function"}}
5298925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5308925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{$ext := GetAnnotation $ "extension"}}
5318925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{if and $ext (Macro "IsFunctionExported" $)}}
5328925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    {{$ext_name := index $ext.Arguments 0}}
5338925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5348925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    {{$base := (Macro "BaseName" $)}}
5358925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5365beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$p0 := (index $.CallParameters 0)}}
5375beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$ptail := (Tail 1 $.CallParameters)}}
5385beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu
5395beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$first_type := (Macro "Parameter" $p0)}}
5405beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$tail_types := (ForEach $ptail "ParameterType" | JoinWith ", ")}}
5415beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu
5425beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    VKAPI_ATTR {{Node "Type" $.Return}} disabled{{$base}}({{$first_type}}, {{$tail_types}}) {
5435beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      driver::Logger({{$p0.Name}}).Err({{$p0.Name}}, §
5445beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        "{{$ext_name}} not enabled. Exported {{$.Name}} not executed.");
5458925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
5468925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    }
5478925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu5488925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{end}}
5498925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{end}}
550cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
551cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
552cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
5530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetInstanceProcAddr for function interception.
5550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
5570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptInstanceProcAddr"}}
5580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
5590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // global functions
5615beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu  if (instance == VK_NULL_HANDLE) {
5620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
5630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsGloballyDispatched" $f)}}
5640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
5653e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}});
5660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
5670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
5680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5695beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    ALOGE("invalid vkGetInstanceProcAddr(VK_NULL_HANDLE, \"%s\") call", pName);
5700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
5710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
5720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const struct Hook {
5740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    const char* name;
5750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    PFN_vkVoidFunction proc;
5760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  } hooks[] = {
5770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
5780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionExported" $f)}}
5790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* hide global functions */}}
5800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if (Macro "IsGloballyDispatched" $f)}}
5810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", nullptr },
5820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect intercepted functions */}}
5840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "api.IsIntercepted" $f)}}
5850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>(§
5863e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}}) },
5870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect vkGetInstanceProcAddr to itself */}}
5890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if eq $f.Name "vkGetInstanceProcAddr"}}
5903e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
5910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect device functions to themselves as a workaround for
5930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu             layers that do not intercept in their vkGetInstanceProcAddr */}}
5940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "IsDeviceDispatched" $f)}}
5953e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
5960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
5980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
5990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
6000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
6010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
6020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(hooks) / sizeof(hooks[0]);
6030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  auto hook = std::lower_bound(
6040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    hooks, hooks + count, pName,
6050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    [](const Hook& h, const char* n) { return strcmp(h.name, n) < 0; });
6060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (hook <  hooks + count && strcmp(hook->name, pName) == 0) {
6075beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    if (!hook->proc) {
6085beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      vulkan::driver::Logger(instance).Err(
6095beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        instance, "invalid vkGetInstanceProcAddr(%p, \"%s\") call",
6105beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        instance, pName);
6115beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    }
6120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return hook->proc;
6130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
6150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu6160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
6200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetDeviceProcAddr for function interception.
6220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
6240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptDeviceProcAddr"}}
6250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
6260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (device == VK_NULL_HANDLE) {
6285beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    ALOGE("invalid vkGetDeviceProcAddr(VK_NULL_HANDLE, ...) call");
6290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
6300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu6320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const char* const known_non_device_names[] = {
6330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
6340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionSupported" $f)}}
6350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if not (Macro "IsDeviceDispatched" $f)}}
6360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          "{{$f.Name}}",
6370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
6380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
6390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
6400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
6410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
6420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(known_non_device_names) /
6430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    sizeof(known_non_device_names[0]);
6440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (!pName ||
6450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      std::binary_search(
6460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        known_non_device_names, known_non_device_names + count, pName,
6470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        [](const char* a, const char* b) { return (strcmp(a, b) < 0); })) {
6485beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    vulkan::driver::Logger(device).Err(§
6495beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      device, "invalid vkGetDeviceProcAddr(%p, \"%s\") call", device,§
6505beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      (pName) ? pName : "(null)");
6510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
6520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
6540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu655c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu  {{range $f := AllCommands $}}
656c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu    {{if (Macro "IsDeviceDispatched" $f)}}
657c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{     if (Macro "api.IsIntercepted" $f)}}
658c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
659c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu          reinterpret_cast<PFN_vkVoidFunction>(§
6603e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}});
661c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{else if eq $f.Name "vkGetDeviceProcAddr"}}
662c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
663c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu          reinterpret_cast<PFN_vkVoidFunction>(§
6643e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}});
665c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{end}}
666c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu    {{end}}
667c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu  {{end}}
668c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu6690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
6730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code to dispatch a function.
6750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
6770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.Dispatch"}}
6780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
6790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "api.IsIntercepted" $)}}
6803e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    {{Error "$.Name should not be generated"}}
6810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
6820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6833e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if not (IsVoid $.Return.Type)}}return §{{end}}
6843e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu
6853e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{$p0 := index $.CallParameters 0}}
6863e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  GetData({{$p0.Name}}).dispatch.§
6870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}}({{Macro "Arguments" $}});
6880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
692eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
693eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits a list of extensions intercepted by vulkan::driver.
694eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
695eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
696eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.InterceptedExtensions"}}
697eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_ANDROID_native_buffer
698eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_EXT_debug_report
699eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_android_surface
700948233a57f0f2f6643a70019ef3c8287fd8d3771Ian ElliottVK_KHR_incremental_present
701eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_surface
702eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_swapchain
703eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
704eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
705eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
706eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
707eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
708eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if an extension is intercepted by vulkan::driver.
709eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
710eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
711eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsExtensionIntercepted"}}
712eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext_name := index $.Arguments 0}}
713eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$filters := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
714eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
715eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $f := $filters}}
716eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if eq $ext_name $f}}true{{end}}
717eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
718eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
719eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
720eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
721eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
722eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
723eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if a function is intercepted by vulkan::driver.
724eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
725eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
726eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsIntercepted"}}
727eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
728eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
729eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
730eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Create functions of dispatchable objects */}}
731eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{     if eq $.Name "vkCreateInstance"}}true
732eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
733ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
734eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
735eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
736eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
737eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
738eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
739eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
740eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
741eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Enumeration of extensions */}}
742eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateInstanceExtensionProperties"}}true
743eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
744eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
745eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
746eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
747eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
748eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
749eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
750eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
751eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
752eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{Macro "driver.IsExtensionIntercepted" $ext}}
753eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
754eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
755eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
756eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
757eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
758eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
759eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
760eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
76136cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  Emits true if a function needs a ProcHook stub.
762eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
763eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
76436cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu{{define "driver.NeedProcHookStub"}}
765eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
766eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
76736cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{if and (Macro "driver.IsIntercepted" $) (Macro "IsDeviceDispatched" $)}}
768eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
769eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
770eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if not (Macro "IsExtensionInternal" $ext)}}true{{end}}
771eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
772eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
773eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
774eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
775eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
776eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
777eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
778eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of struct ProcHook.
779eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
780eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
781eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineProcHookType"}}
782eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  struct ProcHook {
783eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Type {
784eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        GLOBAL,
785eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        INSTANCE,
786eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        DEVICE,
787eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
788eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
789eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Extension {
790eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{$exts := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
791eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{range $e := $exts}}
792eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          {{TrimPrefix "VK_" $e}},
793eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{end}}
794eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu795eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_CORE, // valid bit
796eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_COUNT,
797eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_UNKNOWN,
798eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
799eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu800eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      const char* name;
801eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Type type;
802eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Extension extension;
803eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu804eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      PFN_vkVoidFunction proc;
80536cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      PFN_vkVoidFunction checked_proc;  // always nullptr for non-device hooks
806eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  };
807eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
808eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
809eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
810eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
811eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
812cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::driver.
813cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
814cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
815cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.C++.DefineInitProcExtMacro"}}
8165948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  #define INIT_PROC_EXT(ext, required, obj, proc) do {          \
817cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu      if (extensions[ProcHook::ext])                            \
8185948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes        INIT_PROC(required, obj, proc);                         \
819cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
820cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
821cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
822cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
823cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
824cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
82536cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  Emits a stub for ProcHook::checked_proc.
826eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
827eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
82836cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu{{define "driver.C++.DefineProcHookStub"}}
829eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
830eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
83136cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{if (Macro "driver.NeedProcHookStub" $)}}
832eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
833eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext_name := index $ext.Arguments 0}}
834eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
835eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$base := (Macro "BaseName" $)}}
836eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
83736cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu    VKAPI_ATTR {{Node "Type" $.Return}} checked{{$base}}({{Macro "Parameters" $}}) {
83836cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      {{$p0 := index $.CallParameters 0}}
83936cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      {{$ext_hook := Strings ("ProcHook::") (Macro "BaseName" $ext)}}
840eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
84136cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      if (GetData({{$p0.Name}}).hook_extensions[{{$ext_hook}}]) {
84236cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{if not (IsVoid $.Return.Type)}}return §{{end}}
84336cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{$base}}({{Macro "Arguments" $}});
84436cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      } else {
8455beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        Logger({{$p0.Name}}).Err({{$p0.Name}}, "{{$ext_name}} not enabled. {{$.Name}} not executed.");
84636cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
847eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      }
84836cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu    }
849eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu850eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
851eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
852eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
853eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
854eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
855eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
856eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a global ProcHook.
857eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
858eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
859eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineGlobalProcHook"}}
860eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
861eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
862eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
863eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
864eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := GetAnnotation $ "extension"}}
865eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if $ext}}
866eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{Error "invalid global extension"}}
867eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
868eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
869eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
870eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
871eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::GLOBAL,
872eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::EXTENSION_CORE,
873ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu    reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
874eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    nullptr,
875eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
876eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
877eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
878eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
879eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
880eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
881eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of an instance ProcHook.
882eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
883eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
884eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineInstanceProcHook"}}
885eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
886eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
887eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
888eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
889eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
890eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
891eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::INSTANCE,
892eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
893eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
894eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
895eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
896eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
897eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
898eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
899eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
900eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
901622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
902eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
903eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
904eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
905eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::EXTENSION_CORE,
906ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
907eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      nullptr,
908eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
909eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
910eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
911eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
912eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
913eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
914eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
915eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a device ProcHook.
916eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
917eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
918eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineDeviceProcHook"}}
919eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
920eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
921eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
922eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
923eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
924eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
925eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::DEVICE,
926eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
927eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
928eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
929eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
930eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
931eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
932eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
933eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
934eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
935622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
936eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>(checked{{$base}}),
937eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
938eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
9394901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      ProcHook::EXTENSION_CORE,
9404901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
9414901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      nullptr,
942eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
943eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
944eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
945eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
946eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
947eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
9480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
949cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a function is needed by vulkan::driver.
950cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
951cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
952cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDriverTableEntry"}}
953cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
954cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
955cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
956cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Create functions of dispatchable objects */}}
957cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{     if eq $.Name "vkCreateDevice"}}true
958cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
959cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
960cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
961cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
962cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
963cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
964cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
965cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Enumeration of extensions */}}
966cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
967cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
968cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* We cache physical devices in loader.cpp */}}
969cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
970cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
971cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
972cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
973cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
974cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* VK_KHR_swapchain->VK_ANDROID_native_buffer translation */}}
975cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkCreateImage"}}true
976cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyImage"}}true
977cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
978cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
979cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
980cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
981cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if $ext}}
982cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{$ext_name := index $ext.Arguments 0}}
983cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{     if eq $ext_name "VK_ANDROID_native_buffer"}}true
984cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{else if eq $ext_name "VK_EXT_debug_report"}}true
985cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
986cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
987cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
988cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
989cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
990cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
991cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
992cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
993cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if an instance-dispatched function is needed by vulkan::driver.
994cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
995cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
996cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsInstanceDriverTableEntry"}}
997cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
998cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
999cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsInstanceDispatched" $)}}
1000cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
1001cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
1002cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
1003cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1004cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1005cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
1006cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
1007cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a device-dispatched function is needed by vulkan::driver.
1008cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
1009cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
1010cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDeviceDriverTableEntry"}}
1011cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
1012cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1013cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsDeviceDispatched" $)}}
1014cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
1015cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
1016cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
1017cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1018cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1019cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
1020cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
10210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a function/extension name without the "vk"/"VK_" prefix.
10220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "BaseName"}}
10250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if IsFunction $}}{{TrimPrefix "vk" $.Name}}
10260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $.Name "extension"}}{{TrimPrefix "VK_" (index $.Arguments 0)}}
10270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}{{Error "invalid use of BaseName"}}
10280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a comma-separated list of C parameter names for the given command.
10350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "Arguments"}}
10380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{ForEach $.CallParameters "ParameterName" | JoinWith ", "}}
10410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsGloballyDispatched"}}
10490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Global")}}
10510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that undergo table dispatch. Only global
10590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  functions and functions handled in the loader top without calling into
10600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  lower layers are not dispatched.
10610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsInstanceDispatched"}}
10640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Instance")}}
10660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that can have device-specific dispatch.
10740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsDeviceDispatched"}}
10770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Device")}}
10790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if a function is core or from a supportable extension.
10870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionSupported"}}
10900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if not (GetAnnotation $ "pfn")}}
10920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
10930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if not $ext}}true
10940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if not (Macro "IsExtensionBlacklisted" $ext)}}true
10950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
10960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Decides whether a function should be exported from the Android Vulkan
11030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  library. Functions in the core API and in loader extensions are exported.
11040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionExported"}}
11070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
11080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
11100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
11110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if $ext}}
11120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{Macro "IsExtensionExported" $ext}}
11130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else}}
11140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      true
11150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
11160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
11180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if an extension is unsupportable on Android.
11230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionBlacklisted"}}
11260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
11270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_display"}}true
11280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_display_swapchain"}}true
11290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_xlib_surface"}}true
11300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_xcb_surface"}}true
11310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_wayland_surface"}}true
11320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_mir_surface"}}true
11330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_win32_surface"}}true
11340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
11360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Reports whether an extension is implemented entirely by the loader,
11410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  so drivers should not enumerate it.
11420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionExported"}}
11450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
11460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_surface"}}true
11470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_swapchain"}}true
11480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_android_surface"}}true
1149948233a57f0f2f6643a70019ef3c8287fd8d3771Ian Elliott  {{else if eq $ext "VK_KHR_incremental_present"}}true
11500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
1152eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1153eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1154eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
1155eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1156eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Reports whether an extension is internal to the loader and drivers,
1157eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  so the loader should not enumerate it.
1158eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1159eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
1160eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "IsExtensionInternal"}}
1161eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := index $.Arguments 0}}
1162eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{     if eq $ext "VK_ANDROID_native_buffer"}}true
1163eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
1164eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
1165