code-generator.tmpl revision 7823e124e00576e20e47ec717cbe8bc89f0f2bf2
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>
947823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <algorithm>
967823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn977823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn#include <log/log.h>
980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu993e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// to catch mismatches between vulkan.h and this file
1003e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu#undef VK_NO_PROTOTYPES
1010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include "api.h"
1020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace vulkan {«
1040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace api {«
1050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu106cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "C++.DefineInitProcMacro" "dispatch"}}
107cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu108cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "api.C++.DefineInitProcExtMacro"}}
1090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1108925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wunamespace {«
1118925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1128925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu// clang-format off
1138925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1148925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{range $f := AllCommands $}}
1158925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{Macro "api.C++.DefineExtensionStub" $f}}
1168925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{end}}
1178925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu// clang-format on
1188925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1198925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu»} // anonymous
1208925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu1218925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wubool InitDispatchTable(
1228925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    VkInstance instance,
1238925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    PFN_vkGetInstanceProcAddr get_proc,
1248925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions) {
1250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    auto& data = GetData(instance);
1260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    bool success = true;
1270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format off
1290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
1300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "api.IsInstanceDispatchTableEntry" $f)}}
1310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "C++.InitProc" $f}}
1320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
1340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format on
1350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return success;
1370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu}
1380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1398925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wubool InitDispatchTable(
1408925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    VkDevice dev,
1418925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    PFN_vkGetDeviceProcAddr get_proc,
1428925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    const std::bitset<driver::ProcHook::EXTENSION_COUNT> &extensions) {
1430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    auto& data = GetData(dev);
1440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    bool success = true;
1450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format off
1470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
1480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "api.IsDeviceDispatchTableEntry" $f)}}
1490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "C++.InitProc" $f}}
1500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
1520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format on
1530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return success;
1550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu}
1560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// clang-format off
1580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1593e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wunamespace {«
1603e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1613e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// forward declarations needed by GetInstanceProcAddr and GetDeviceProcAddr
1620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{range $f := AllCommands $}}
1633e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if and (Macro "IsFunctionExported" $f) (not (Macro "api.IsIntercepted" $f))}}
1643e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    VKAPI_ATTR {{Node "Type" $f.Return}} {{Macro "BaseName" $f}}({{Macro "Parameters" $f}});
1653e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{end}}
1663e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{end}}
1673e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1683e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{range $f := AllCommands $}}
1693e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if and (Macro "IsFunctionExported" $f) (not (Macro "api.IsIntercepted" $f))}}
1703e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    VKAPI_ATTR {{Node "Type" $f.Return}} {{Macro "BaseName" $f}}({{Macro "Parameters" $f}}) {
1710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{     if eq $f.Name "vkGetInstanceProcAddr"}}
1720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "api.C++.InterceptInstanceProcAddr" $}}
1730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{else if eq $f.Name "vkGetDeviceProcAddr"}}
1740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "api.C++.InterceptDeviceProcAddr" $}}
1750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
1770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{Macro "api.C++.Dispatch" $f}}
1780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    }
1790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
1810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
1820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1833e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu»}  // anonymous namespace
1843e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1853e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// clang-format on
1863e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1873e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu»} // namespace api
1883e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu»} // namespace vulkan
1893e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1903e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu// clang-format off
1913e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu1923e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{range $f := AllCommands $}}
1933e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if (Macro "IsFunctionExported" $f)}}
1943e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    __attribute__((visibility("default")))
1953e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    VKAPI_ATTR {{Node "Type" $f.Return}} {{$f.Name}}({{Macro "Parameters" $f}}) {
1963e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu      {{if not (IsVoid $f.Return.Type)}}return §{{end}}
1973e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu      vulkan::api::{{Macro "BaseName" $f}}({{Macro "Arguments" $f}});
1983e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    }
1993e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu2003e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{end}}
2013e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu{{end}}
2023e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu2030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// clang-format on
2040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu¶{{end}}
2050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
2060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
2070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
208eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
209eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  driver_gen.h
210eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
211eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
212eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver_gen.h"}}
213eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "Copyright"}}
214eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu215eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
216eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu217eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#ifndef LIBVULKAN_DRIVER_GEN_H
218eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#define LIBVULKAN_DRIVER_GEN_H
219eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu220cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu#include <bitset>
221eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <vulkan/vulkan.h>
222eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <vulkan/vk_android_native_buffer.h>
223eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu224eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace vulkan {«
225eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace driver {«
226eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu227eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "driver.C++.DefineProcHookType"}}
228eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu229cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wustruct InstanceDriverTable {
230cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format off
231cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{range $f := AllCommands $}}
232cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
233cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
234cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
235cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
236cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format on
237cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu};
238cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu239cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wustruct DeviceDriverTable {
240cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format off
241cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{range $f := AllCommands $}}
242cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
243cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
244cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
245cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
246cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format on
247cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu};
248cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu249eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook* GetProcHook(const char* name);
250eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuProcHook::Extension GetProcHookExtension(const char* name);
251eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu252cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc,
253cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions);
254cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
255cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions);
256cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu257eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace driver
258eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace vulkan
259eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu260eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#endif // LIBVULKAN_DRIVER_TABLE_H
261eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu¶{{end}}
262eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
263eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
264eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
265eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
266eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  driver_gen.cpp
267eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
268eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
269eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver_gen.cpp"}}
270eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "Copyright"}}
271eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu272eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
273eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu274eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <string.h>
2757823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn276eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <algorithm>
2777823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn2787823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn#include <log/log.h>
279eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu280eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include "driver.h"
281eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu282eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace vulkan {«
283eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace driver {«
284eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu285eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace {«
286eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu287eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format off
288eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu289eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{range $f := AllCommands $}}
29036cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{Macro "driver.C++.DefineProcHookStub" $f}}
291eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
292eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format on
293eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu294eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook g_proc_hooks[] = {
295eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format off
296eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $f := SortBy (AllCommands $) "FunctionName"}}
297eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if (Macro "driver.IsIntercepted" $f)}}
298eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{     if (Macro "IsGloballyDispatched" $f)}}
299eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineGlobalProcHook" $f}}
300eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else if (Macro "IsInstanceDispatched" $f)}}
301eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineInstanceProcHook" $f}}
302eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else if (Macro "IsDeviceDispatched" $f)}}
303eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineDeviceProcHook" $f}}
304eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
305eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
306eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
307eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format on
308eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu};
309eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu310eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // anonymous
311eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu312eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook* GetProcHook(const char* name) {
313eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto& begin = g_proc_hooks;
314eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto& end = g_proc_hooks +
315eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
316eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto hook = std::lower_bound(begin, end, name,
317eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
318eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    return (hook <  end && strcmp(hook->name, name) == 0) ? hook : nullptr;
319eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu}
320eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu321eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuProcHook::Extension GetProcHookExtension(const char* name) {
322eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$exts := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
323eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format off
324eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $e := $exts}}
325eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    if (strcmp(name, "{{$e}}") == 0) return ProcHook::{{TrimPrefix "VK_" $e}};
326eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
327eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format on
328eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  return ProcHook::EXTENSION_UNKNOWN;
329eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu}
330eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu331cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "C++.DefineInitProcMacro" "driver"}}
332cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu333cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "driver.C++.DefineInitProcExtMacro"}}
334cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu335cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc,
336cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions)
337cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{
338cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    auto& data = GetData(instance);
339cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    bool success = true;
340cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu341cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format off
342cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{range $f := AllCommands $}}
343cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
344cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        {{Macro "C++.InitProc" $f}}
345cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
346cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
347cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format on
348cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu349cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    return success;
350cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu}
351cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu352cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wubool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc,
353cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu                     const std::bitset<ProcHook::EXTENSION_COUNT> &extensions)
354cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{
355cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    auto& data = GetData(dev);
356cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    bool success = true;
357cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu358cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format off
359cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{range $f := AllCommands $}}
360cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
361cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        {{Macro "C++.InitProc" $f}}
362cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
363cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
364cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format on
365cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu366cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    return success;
367cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu}
368cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu369eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace driver
370eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace vulkan
371eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu372eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format on
373eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu¶{{end}}
374eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
375eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
376eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
3770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
378cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits a declaration of a dispatch/driver table entry.
3790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
3800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
381cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "C++.DeclareTableEntry"}}
3820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
3830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "FunctionPtrName" $}} {{Macro "BaseName" $}}
3850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
3860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
3890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
390cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC macro.
3910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
3920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
393cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "C++.DefineInitProcMacro"}}
3940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  #define UNLIKELY(expr) __builtin_expect((expr), 0)
3950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu3960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  #define INIT_PROC(obj, proc) do {                             \
3970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      data.{{$}}.proc = reinterpret_cast<PFN_vk ## proc>(       \
3980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu              get_proc(obj, "vk" # proc));                      \
3990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      if (UNLIKELY(!data.{{$}}.proc)) {                         \
4000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          ALOGE("missing " # obj " proc: vk" # proc);           \
4010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          success = false;                                      \
4020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      }                                                         \
4030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  } while(0)
4040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
4090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code to invoke INIT_PROC or INIT_PROC_EXT.
4100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
4110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "C++.InitProc"}}
4130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := GetAnnotation $ "extension"}}
4160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if $ext}}
4170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    INIT_PROC_EXT({{Macro "BaseName" $ext}}, §
4180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
4190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    INIT_PROC(§
4200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsInstanceDispatched" $)}}
4230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    instance, §
4240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
4250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    dev, §
4260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}});
4290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and instance-dispatched.
4350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsInstanceDispatchTableEntry"}}
4380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsInstanceDispatched" $)}}
441dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{/* deprecated and unused internally */}}
442dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{if not (eq $.Name "vkEnumerateDeviceLayerProperties")}}
443dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu      true
444dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{end}}
4450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and device-dispatched.
4520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsDeviceDispatchTableEntry"}}
4550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsDeviceDispatched" $)}}
4580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
4590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is intercepted by vulkan::api.
4660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsIntercepted"}}
4690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
4720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Global functions cannot be dispatched at all */}}
4730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{     if (Macro "IsGloballyDispatched" $)}}true
4740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* VkPhysicalDevice functions that manage device layers */}}
4760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
4770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceLayerProperties"}}true
4780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
4790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Destroy functions of dispatchable objects */}}
4810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
4820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
4830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
4850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
490cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
491cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::api.
492cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
493cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
494cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "api.C++.DefineInitProcExtMacro"}}
4958925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  // Exported extension functions may be invoked even when their extensions
4968925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  // are disabled.  Dispatch to stubs when that happens.
497cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  #define INIT_PROC_EXT(ext, obj, proc) do {                    \
4988925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      if (extensions[driver::ProcHook::ext])                    \
4998925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu        INIT_PROC(obj, proc);                                   \
5008925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      else                                                      \
5018925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu        data.dispatch.proc = disabled ## proc;                  \
502cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
503cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
5048925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5058925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5068925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{/*
5078925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu-------------------------------------------------------------------------------
5088925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  Emits a stub for an exported extension function.
5098925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu-------------------------------------------------------------------------------
5108925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu*/}}
5118925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{define "api.C++.DefineExtensionStub"}}
5128925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{AssertType $ "Function"}}
5138925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5148925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{$ext := GetAnnotation $ "extension"}}
5158925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{if and $ext (Macro "IsFunctionExported" $)}}
5168925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    {{$ext_name := index $ext.Arguments 0}}
5178925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5188925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    {{$base := (Macro "BaseName" $)}}
5198925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5205beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$p0 := (index $.CallParameters 0)}}
5215beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$ptail := (Tail 1 $.CallParameters)}}
5225beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu
5235beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$first_type := (Macro "Parameter" $p0)}}
5245beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$tail_types := (ForEach $ptail "ParameterType" | JoinWith ", ")}}
5255beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu
5265beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    VKAPI_ATTR {{Node "Type" $.Return}} disabled{{$base}}({{$first_type}}, {{$tail_types}}) {
5275beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      driver::Logger({{$p0.Name}}).Err({{$p0.Name}}, §
5285beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        "{{$ext_name}} not enabled. Exported {{$.Name}} not executed.");
5298925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
5308925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    }
5318925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu5328925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{end}}
5338925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{end}}
534cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
535cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
536cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
5370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetInstanceProcAddr for function interception.
5390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
5410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptInstanceProcAddr"}}
5420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
5430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // global functions
5455beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu  if (instance == VK_NULL_HANDLE) {
5460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
5470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsGloballyDispatched" $f)}}
5480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
5493e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}});
5500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
5510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
5520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5535beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    ALOGE("invalid vkGetInstanceProcAddr(VK_NULL_HANDLE, \"%s\") call", pName);
5540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
5550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
5560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const struct Hook {
5580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    const char* name;
5590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    PFN_vkVoidFunction proc;
5600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  } hooks[] = {
5610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
5620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionExported" $f)}}
5630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* hide global functions */}}
5640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if (Macro "IsGloballyDispatched" $f)}}
5650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", nullptr },
5660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect intercepted functions */}}
5680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "api.IsIntercepted" $f)}}
5690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>(§
5703e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}}) },
5710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect vkGetInstanceProcAddr to itself */}}
5730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if eq $f.Name "vkGetInstanceProcAddr"}}
5743e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
5750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect device functions to themselves as a workaround for
5770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu             layers that do not intercept in their vkGetInstanceProcAddr */}}
5780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "IsDeviceDispatched" $f)}}
5793e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
5800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
5820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
5830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
5840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
5850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
5860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(hooks) / sizeof(hooks[0]);
5870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  auto hook = std::lower_bound(
5880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    hooks, hooks + count, pName,
5890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    [](const Hook& h, const char* n) { return strcmp(h.name, n) < 0; });
5900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (hook <  hooks + count && strcmp(hook->name, pName) == 0) {
5915beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    if (!hook->proc) {
5925beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      vulkan::driver::Logger(instance).Err(
5935beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        instance, "invalid vkGetInstanceProcAddr(%p, \"%s\") call",
5945beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        instance, pName);
5955beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    }
5960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return hook->proc;
5970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
5980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
5990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu6000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
6040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetDeviceProcAddr for function interception.
6060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
6080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptDeviceProcAddr"}}
6090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
6100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (device == VK_NULL_HANDLE) {
6125beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    ALOGE("invalid vkGetDeviceProcAddr(VK_NULL_HANDLE, ...) call");
6130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
6140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu6160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const char* const known_non_device_names[] = {
6170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
6180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionSupported" $f)}}
6190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if not (Macro "IsDeviceDispatched" $f)}}
6200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          "{{$f.Name}}",
6210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
6220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
6230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
6240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
6250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
6260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(known_non_device_names) /
6270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    sizeof(known_non_device_names[0]);
6280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (!pName ||
6290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      std::binary_search(
6300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        known_non_device_names, known_non_device_names + count, pName,
6310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        [](const char* a, const char* b) { return (strcmp(a, b) < 0); })) {
6325beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    vulkan::driver::Logger(device).Err(§
6335beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      device, "invalid vkGetDeviceProcAddr(%p, \"%s\") call", device,§
6345beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      (pName) ? pName : "(null)");
6350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
6360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
6380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu639c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu  {{range $f := AllCommands $}}
640c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu    {{if (Macro "IsDeviceDispatched" $f)}}
641c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{     if (Macro "api.IsIntercepted" $f)}}
642c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
643c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu          reinterpret_cast<PFN_vkVoidFunction>(§
6443e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}});
645c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{else if eq $f.Name "vkGetDeviceProcAddr"}}
646c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
647c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu          reinterpret_cast<PFN_vkVoidFunction>(§
6483e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}});
649c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{end}}
650c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu    {{end}}
651c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu  {{end}}
652c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu6530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
6570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code to dispatch a function.
6590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
6610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.Dispatch"}}
6620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
6630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "api.IsIntercepted" $)}}
6643e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    {{Error "$.Name should not be generated"}}
6650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
6660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6673e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if not (IsVoid $.Return.Type)}}return §{{end}}
6683e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu
6693e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{$p0 := index $.CallParameters 0}}
6703e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  GetData({{$p0.Name}}).dispatch.§
6710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}}({{Macro "Arguments" $}});
6720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
676eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
677eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits a list of extensions intercepted by vulkan::driver.
678eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
679eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
680eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.InterceptedExtensions"}}
681eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_ANDROID_native_buffer
682eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_EXT_debug_report
683eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_android_surface
684eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_surface
685eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_swapchain
686eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
687eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
688eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
689eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
690eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
691eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if an extension is intercepted by vulkan::driver.
692eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
693eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
694eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsExtensionIntercepted"}}
695eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext_name := index $.Arguments 0}}
696eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$filters := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
697eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
698eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $f := $filters}}
699eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if eq $ext_name $f}}true{{end}}
700eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
701eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
702eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
703eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
704eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
705eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
706eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if a function is intercepted by vulkan::driver.
707eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
708eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
709eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsIntercepted"}}
710eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
711eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
712eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
713eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Create functions of dispatchable objects */}}
714eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{     if eq $.Name "vkCreateInstance"}}true
715eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
716ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
717eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
718eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
719eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
720eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
721eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
722eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
723eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
724eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Enumeration of extensions */}}
725eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateInstanceExtensionProperties"}}true
726eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
727eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
728eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
729eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
730eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
731eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
732eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
733eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
734eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
735eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{Macro "driver.IsExtensionIntercepted" $ext}}
736eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
737eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
738eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
739eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
740eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
741eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
742eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
743eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
74436cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  Emits true if a function needs a ProcHook stub.
745eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
746eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
74736cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu{{define "driver.NeedProcHookStub"}}
748eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
749eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
75036cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{if and (Macro "driver.IsIntercepted" $) (Macro "IsDeviceDispatched" $)}}
751eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
752eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
753eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if not (Macro "IsExtensionInternal" $ext)}}true{{end}}
754eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
755eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
756eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
757eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
758eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
759eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
760eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
761eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of struct ProcHook.
762eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
763eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
764eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineProcHookType"}}
765eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  struct ProcHook {
766eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Type {
767eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        GLOBAL,
768eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        INSTANCE,
769eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        DEVICE,
770eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
771eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
772eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Extension {
773eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{$exts := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
774eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{range $e := $exts}}
775eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          {{TrimPrefix "VK_" $e}},
776eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{end}}
777eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu778eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_CORE, // valid bit
779eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_COUNT,
780eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_UNKNOWN,
781eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
782eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu783eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      const char* name;
784eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Type type;
785eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Extension extension;
786eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu787eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      PFN_vkVoidFunction proc;
78836cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      PFN_vkVoidFunction checked_proc;  // always nullptr for non-device hooks
789eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  };
790eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
791eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
792eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
793eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
794eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
795cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::driver.
796cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
797cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
798cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.C++.DefineInitProcExtMacro"}}
799cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  #define INIT_PROC_EXT(ext, obj, proc) do {                    \
800cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu      if (extensions[ProcHook::ext])                            \
801cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        INIT_PROC(obj, proc);                                   \
802cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
803cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
804cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
805cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
806cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
807cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
80836cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  Emits a stub for ProcHook::checked_proc.
809eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
810eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
81136cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu{{define "driver.C++.DefineProcHookStub"}}
812eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
813eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
81436cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{if (Macro "driver.NeedProcHookStub" $)}}
815eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
816eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext_name := index $ext.Arguments 0}}
817eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
818eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$base := (Macro "BaseName" $)}}
819eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
82036cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu    VKAPI_ATTR {{Node "Type" $.Return}} checked{{$base}}({{Macro "Parameters" $}}) {
82136cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      {{$p0 := index $.CallParameters 0}}
82236cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      {{$ext_hook := Strings ("ProcHook::") (Macro "BaseName" $ext)}}
823eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
82436cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      if (GetData({{$p0.Name}}).hook_extensions[{{$ext_hook}}]) {
82536cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{if not (IsVoid $.Return.Type)}}return §{{end}}
82636cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{$base}}({{Macro "Arguments" $}});
82736cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      } else {
8285beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        Logger({{$p0.Name}}).Err({{$p0.Name}}, "{{$ext_name}} not enabled. {{$.Name}} not executed.");
82936cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
830eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      }
83136cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu    }
832eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu833eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
834eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
835eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
836eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
837eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
838eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
839eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a global ProcHook.
840eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
841eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
842eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineGlobalProcHook"}}
843eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
844eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
845eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
846eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
847eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := GetAnnotation $ "extension"}}
848eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if $ext}}
849eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{Error "invalid global extension"}}
850eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
851eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
852eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
853eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
854eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::GLOBAL,
855eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::EXTENSION_CORE,
856ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu    reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
857eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    nullptr,
858eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
859eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
860eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
861eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
862eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
863eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
864eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of an instance ProcHook.
865eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
866eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
867eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineInstanceProcHook"}}
868eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
869eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
870eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
871eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
872eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
873eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
874eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::INSTANCE,
875eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
876eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
877eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
878eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
879eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
880eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
881eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
882eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
883eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
884622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
885eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
886eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
887eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
888eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::EXTENSION_CORE,
889ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
890eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      nullptr,
891eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
892eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
893eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
894eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
895eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
896eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
897eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
898eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a device ProcHook.
899eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
900eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
901eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineDeviceProcHook"}}
902eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
903eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
904eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
905eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
906eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
907eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
908eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::DEVICE,
909eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
910eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
911eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
912eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
913eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
914eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
915eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
916eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
917eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
918622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
919eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>(checked{{$base}}),
920eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
921eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
9224901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      ProcHook::EXTENSION_CORE,
9234901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
9244901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      nullptr,
925eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
926eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
927eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
928eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
929eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
930eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
9310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
932cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a function is needed by vulkan::driver.
933cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
934cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
935cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDriverTableEntry"}}
936cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
937cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
938cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
939cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Create functions of dispatchable objects */}}
940cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{     if eq $.Name "vkCreateDevice"}}true
941cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
942cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
943cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
944cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
945cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
946cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
947cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
948cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Enumeration of extensions */}}
949cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
950cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
951cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* We cache physical devices in loader.cpp */}}
952cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
953cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
954cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
955cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
956cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
957cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* VK_KHR_swapchain->VK_ANDROID_native_buffer translation */}}
958cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkCreateImage"}}true
959cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyImage"}}true
960cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
961cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
962cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
963cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
964cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if $ext}}
965cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{$ext_name := index $ext.Arguments 0}}
966cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{     if eq $ext_name "VK_ANDROID_native_buffer"}}true
967cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{else if eq $ext_name "VK_EXT_debug_report"}}true
968cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
969cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
970cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
971cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
972cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
973cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
974cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
975cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
976cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if an instance-dispatched function is needed by vulkan::driver.
977cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
978cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
979cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsInstanceDriverTableEntry"}}
980cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
981cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
982cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsInstanceDispatched" $)}}
983cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
984cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
985cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
986cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
987cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
988cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
989cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
990cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a device-dispatched function is needed by vulkan::driver.
991cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
992cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
993cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDeviceDriverTableEntry"}}
994cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
995cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
996cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsDeviceDispatched" $)}}
997cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
998cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
999cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
1000cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1001cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1002cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
1003cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
10040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a function/extension name without the "vk"/"VK_" prefix.
10050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "BaseName"}}
10080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if IsFunction $}}{{TrimPrefix "vk" $.Name}}
10090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $.Name "extension"}}{{TrimPrefix "VK_" (index $.Arguments 0)}}
10100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}{{Error "invalid use of BaseName"}}
10110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a comma-separated list of C parameter names for the given command.
10180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "Arguments"}}
10210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{ForEach $.CallParameters "ParameterName" | JoinWith ", "}}
10240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsGloballyDispatched"}}
10320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Global")}}
10340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that undergo table dispatch. Only global
10420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  functions and functions handled in the loader top without calling into
10430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  lower layers are not dispatched.
10440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsInstanceDispatched"}}
10470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Instance")}}
10490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that can have device-specific dispatch.
10570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsDeviceDispatched"}}
10600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Device")}}
10620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if a function is core or from a supportable extension.
10700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionSupported"}}
10730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if not (GetAnnotation $ "pfn")}}
10750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
10760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if not $ext}}true
10770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if not (Macro "IsExtensionBlacklisted" $ext)}}true
10780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
10790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Decides whether a function should be exported from the Android Vulkan
10860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  library. Functions in the core API and in loader extensions are exported.
10870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionExported"}}
10900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
10930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
10940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if $ext}}
10950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{Macro "IsExtensionExported" $ext}}
10960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else}}
10970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      true
10980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
10990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
11010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if an extension is unsupportable on Android.
11060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionBlacklisted"}}
11090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
11100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_display"}}true
11110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_display_swapchain"}}true
11120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_xlib_surface"}}true
11130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_xcb_surface"}}true
11140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_wayland_surface"}}true
11150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_mir_surface"}}true
11160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_win32_surface"}}true
11170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
11190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Reports whether an extension is implemented entirely by the loader,
11240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  so drivers should not enumerate it.
11250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionExported"}}
11280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
11290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_surface"}}true
11300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_swapchain"}}true
11310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_android_surface"}}true
11320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
1134eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1135eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1136eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
1137eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1138eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Reports whether an extension is internal to the loader and drivers,
1139eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  so the loader should not enumerate it.
1140eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1141eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
1142eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "IsExtensionInternal"}}
1143eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := index $.Arguments 0}}
1144eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{     if eq $ext "VK_ANDROID_native_buffer"}}true
1145eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
1146eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
1147