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) {
3226aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes  {{$exts := Strings (Macro "driver.KnownExtensions") | 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 Wu3965948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  #define INIT_PROC(required, obj, proc) do {                   \
3970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      data.{{$}}.proc = reinterpret_cast<PFN_vk ## proc>(       \
3980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu              get_proc(obj, "vk" # proc));                      \
3995948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes      if (UNLIKELY(required && !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}}
417d1abd7456e10f46200a90e8a0e5a1a8bef0a388aJesse Hall    INIT_PROC_EXT({{Macro "BaseName" $ext}}, §
4180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
419d1abd7456e10f46200a90e8a0e5a1a8bef0a388aJesse Hall    INIT_PROC(§
4200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
422d1abd7456e10f46200a90e8a0e5a1a8bef0a388aJesse Hall  {{if GetAnnotation $ "optional"}}false{{else}}true{{end}}, §
423d1abd7456e10f46200a90e8a0e5a1a8bef0a388aJesse Hall
4240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsInstanceDispatched" $)}}
4250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    instance, §
4260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
4270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    dev, §
4280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}});
4310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and instance-dispatched.
4370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsInstanceDispatchTableEntry"}}
4400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsInstanceDispatched" $)}}
443dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{/* deprecated and unused internally */}}
444dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{if not (eq $.Name "vkEnumerateDeviceLayerProperties")}}
445dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu      true
446dbd33bcca26a38d24a1ae25d894175ea9ad1033aChia-I Wu    {{end}}
4470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and device-dispatched.
4540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsDeviceDispatchTableEntry"}}
4570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsDeviceDispatched" $)}}
4600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
4610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is intercepted by vulkan::api.
4680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsIntercepted"}}
4710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
4740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Global functions cannot be dispatched at all */}}
4750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{     if (Macro "IsGloballyDispatched" $)}}true
4760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* VkPhysicalDevice functions that manage device layers */}}
4780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
4790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceLayerProperties"}}true
4800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
4810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Destroy functions of dispatchable objects */}}
4830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
4840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
4850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
4870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
492cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
493cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::api.
494cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
495cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
496cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "api.C++.DefineInitProcExtMacro"}}
4978925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  // Exported extension functions may be invoked even when their extensions
4988925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  // are disabled.  Dispatch to stubs when that happens.
4995948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  #define INIT_PROC_EXT(ext, required, obj, proc) do {          \
5008925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      if (extensions[driver::ProcHook::ext])                    \
5015948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes        INIT_PROC(required, obj, proc);                         \
5028925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      else                                                      \
5038925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu        data.dispatch.proc = disabled ## proc;                  \
504cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
505cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
5068925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5078925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5088925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{/*
5098925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu-------------------------------------------------------------------------------
5108925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  Emits a stub for an exported extension function.
5118925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu-------------------------------------------------------------------------------
5128925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu*/}}
5138925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{define "api.C++.DefineExtensionStub"}}
5148925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{AssertType $ "Function"}}
5158925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5168925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{$ext := GetAnnotation $ "extension"}}
5178925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{if and $ext (Macro "IsFunctionExported" $)}}
5188925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    {{$ext_name := index $ext.Arguments 0}}
5198925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5208925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    {{$base := (Macro "BaseName" $)}}
5218925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu
5225beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$p0 := (index $.CallParameters 0)}}
5235beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$ptail := (Tail 1 $.CallParameters)}}
5245beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu
5255beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$first_type := (Macro "Parameter" $p0)}}
5265beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    {{$tail_types := (ForEach $ptail "ParameterType" | JoinWith ", ")}}
5275beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu
5285beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    VKAPI_ATTR {{Node "Type" $.Return}} disabled{{$base}}({{$first_type}}, {{$tail_types}}) {
5295beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      driver::Logger({{$p0.Name}}).Err({{$p0.Name}}, §
5305beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        "{{$ext_name}} not enabled. Exported {{$.Name}} not executed.");
5318925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu      {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
5328925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu    }
5338925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu5348925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu  {{end}}
5358925efd0a87d96885834a00f3bdef220edf6d8eaChia-I Wu{{end}}
536cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
537cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
538cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
5390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetInstanceProcAddr for function interception.
5410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
5430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptInstanceProcAddr"}}
5440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
5450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // global functions
5475beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu  if (instance == VK_NULL_HANDLE) {
5480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
5490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsGloballyDispatched" $f)}}
5500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
5513e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}});
5520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
5530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
5540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5555beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    ALOGE("invalid vkGetInstanceProcAddr(VK_NULL_HANDLE, \"%s\") call", pName);
5560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
5570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
5580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const struct Hook {
5600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    const char* name;
5610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    PFN_vkVoidFunction proc;
5620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  } hooks[] = {
5630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
5640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionExported" $f)}}
5650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* hide global functions */}}
5660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if (Macro "IsGloballyDispatched" $f)}}
5670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", nullptr },
5680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect intercepted functions */}}
5700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "api.IsIntercepted" $f)}}
5710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>(§
5723e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}}) },
5730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect vkGetInstanceProcAddr to itself */}}
5750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if eq $f.Name "vkGetInstanceProcAddr"}}
5763e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
5770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect device functions to themselves as a workaround for
5790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu             layers that do not intercept in their vkGetInstanceProcAddr */}}
5800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "IsDeviceDispatched" $f)}}
5813e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{Macro "BaseName" $f}}) },
5820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
5840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
5850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
5860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
5870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
5880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(hooks) / sizeof(hooks[0]);
5890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  auto hook = std::lower_bound(
5900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    hooks, hooks + count, pName,
5910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    [](const Hook& h, const char* n) { return strcmp(h.name, n) < 0; });
5920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (hook <  hooks + count && strcmp(hook->name, pName) == 0) {
5935beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    if (!hook->proc) {
5945beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      vulkan::driver::Logger(instance).Err(
5955beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        instance, "invalid vkGetInstanceProcAddr(%p, \"%s\") call",
5965beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        instance, pName);
5975beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    }
5980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return hook->proc;
5990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
6010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu6020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
6060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetDeviceProcAddr for function interception.
6080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
6100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptDeviceProcAddr"}}
6110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
6120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (device == VK_NULL_HANDLE) {
6145beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    ALOGE("invalid vkGetDeviceProcAddr(VK_NULL_HANDLE, ...) call");
6150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
6160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu6180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const char* const known_non_device_names[] = {
6190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
6200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionSupported" $f)}}
6210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if not (Macro "IsDeviceDispatched" $f)}}
6220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          "{{$f.Name}}",
6230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
6240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
6250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
6260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
6270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
6280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(known_non_device_names) /
6290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    sizeof(known_non_device_names[0]);
6300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (!pName ||
6310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      std::binary_search(
6320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        known_non_device_names, known_non_device_names + count, pName,
6330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        [](const char* a, const char* b) { return (strcmp(a, b) < 0); })) {
6345beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu    vulkan::driver::Logger(device).Err(§
6355beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      device, "invalid vkGetDeviceProcAddr(%p, \"%s\") call", device,§
6365beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu      (pName) ? pName : "(null)");
6370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
6380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
6390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
6400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu641c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu  {{range $f := AllCommands $}}
642c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu    {{if (Macro "IsDeviceDispatched" $f)}}
643c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{     if (Macro "api.IsIntercepted" $f)}}
644c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
645c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu          reinterpret_cast<PFN_vkVoidFunction>(§
6463e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}});
647c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{else if eq $f.Name "vkGetDeviceProcAddr"}}
648c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
649c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu          reinterpret_cast<PFN_vkVoidFunction>(§
6503e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu            {{Macro "BaseName" $f}});
651c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu      {{end}}
652c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu    {{end}}
653c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu  {{end}}
654c56603e0b35e31c5f1cd134d6b916a16ff710504Chia-I Wu6550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
6590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code to dispatch a function.
6610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
6620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
6630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.Dispatch"}}
6640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
6650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "api.IsIntercepted" $)}}
6663e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu    {{Error "$.Name should not be generated"}}
6670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
6680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6693e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{if not (IsVoid $.Return.Type)}}return §{{end}}
6703e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu
6713e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  {{$p0 := index $.CallParameters 0}}
6723e654dc68a954b150c141c4a2e96418883bd7c9bChia-I Wu  GetData({{$p0.Name}}).dispatch.§
6730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}}({{Macro "Arguments" $}});
6740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
6750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
6770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
678eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
679eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits a list of extensions intercepted by vulkan::driver.
680eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
681eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
682eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.InterceptedExtensions"}}
683eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_ANDROID_native_buffer
684eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_EXT_debug_report
685d634c483bcbd564acd81dcf5d15fc5fa8ab410f4Courtney GoeltzenleuchterVK_EXT_hdr_metadata
686e278daf850a664a1f15c760c64a74d3649b6f812Courtney GoeltzenleuchterVK_EXT_swapchain_colorspace
687d634c483bcbd564acd81dcf5d15fc5fa8ab410f4Courtney GoeltzenleuchterVK_GOOGLE_display_timing
688eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_android_surface
689948233a57f0f2f6643a70019ef3c8287fd8d3771Ian ElliottVK_KHR_incremental_present
690e278daf850a664a1f15c760c64a74d3649b6f812Courtney GoeltzenleuchterVK_KHR_shared_presentable_image
691eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_surface
692eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_swapchain
6932452cf7e653c425191791a4fb546106d6a277654Chris ForbesVK_KHR_get_surface_capabilities2
694eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
695eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
696eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
697eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
698eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
6996aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes  Emits a list of extensions known to vulkan::driver.
7006aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes------------------------------------------------------------------------------
7016aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes*/}}
7026aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes{{define "driver.KnownExtensions"}}
7036aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes{{Macro "driver.InterceptedExtensions"}}
7046aa30db7a9bbe06b59fddd554d797c6e466ca891Chris ForbesVK_KHR_get_physical_device_properties2
7056aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes{{end}}
7066aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes
7076aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes
7086aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes{{/*
7096aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes------------------------------------------------------------------------------
710eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if an extension is intercepted by vulkan::driver.
711eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
712eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
713eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsExtensionIntercepted"}}
714eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext_name := index $.Arguments 0}}
715eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$filters := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
716eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
717eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $f := $filters}}
718eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if eq $ext_name $f}}true{{end}}
719eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
720eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
721eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
722eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
723eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
724eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
725eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if a function is intercepted by vulkan::driver.
726eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
727eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
728eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsIntercepted"}}
729eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
730eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
731eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
732eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Create functions of dispatchable objects */}}
733eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{     if eq $.Name "vkCreateInstance"}}true
734eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
735ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
736eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
737eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
738eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
739eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
740eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
741eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
742eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
743eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Enumeration of extensions */}}
744eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateInstanceExtensionProperties"}}true
745eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
746eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
747eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
748eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
749eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
750eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
751eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
752eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
753eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
754eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{Macro "driver.IsExtensionIntercepted" $ext}}
755eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
756eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
757eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
758eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
759eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
760eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
761eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
762eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
76336cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  Emits true if a function needs a ProcHook stub.
764eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
765eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
76636cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu{{define "driver.NeedProcHookStub"}}
767eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
768eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
76936cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{if and (Macro "driver.IsIntercepted" $) (Macro "IsDeviceDispatched" $)}}
770eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
771eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
772eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if not (Macro "IsExtensionInternal" $ext)}}true{{end}}
773eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
774eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
775eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
776eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
777eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
778eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
779eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
780eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of struct ProcHook.
781eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
782eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
783eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineProcHookType"}}
784eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  struct ProcHook {
785eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Type {
786eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        GLOBAL,
787eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        INSTANCE,
788eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        DEVICE,
789eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
790eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
791eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Extension {
7926aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes        {{$exts := Strings (Macro "driver.KnownExtensions") | SplitOn "\n"}}
793eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{range $e := $exts}}
794eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          {{TrimPrefix "VK_" $e}},
795eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{end}}
796eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu797eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_CORE, // valid bit
798eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_COUNT,
799eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_UNKNOWN,
800eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
801eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu802eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      const char* name;
803eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Type type;
804eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Extension extension;
805eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu806eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      PFN_vkVoidFunction proc;
80736cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      PFN_vkVoidFunction checked_proc;  // always nullptr for non-device hooks
808eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  };
809eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
810eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
811eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
812eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
813eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
814cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::driver.
815cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
816cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
817cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.C++.DefineInitProcExtMacro"}}
8185948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes  #define INIT_PROC_EXT(ext, required, obj, proc) do {          \
819cbe07ef239121dc99a31a19b9593d76d76abb08bChia-I Wu      if (extensions[ProcHook::ext])                            \
8205948b3eae87af490b7cec36d043b5a9bca6de8c0Chris Forbes        INIT_PROC(required, obj, proc);                         \
821cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
822cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
823cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
824cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
825cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
826cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
82736cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  Emits a stub for ProcHook::checked_proc.
828eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
829eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
83036cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu{{define "driver.C++.DefineProcHookStub"}}
831eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
832eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
83336cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu  {{if (Macro "driver.NeedProcHookStub" $)}}
834eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
835eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext_name := index $ext.Arguments 0}}
836eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
837eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$base := (Macro "BaseName" $)}}
838eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
83936cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu    VKAPI_ATTR {{Node "Type" $.Return}} checked{{$base}}({{Macro "Parameters" $}}) {
84036cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      {{$p0 := index $.CallParameters 0}}
84136cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      {{$ext_hook := Strings ("ProcHook::") (Macro "BaseName" $ext)}}
842eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
84336cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      if (GetData({{$p0.Name}}).hook_extensions[{{$ext_hook}}]) {
84436cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{if not (IsVoid $.Return.Type)}}return §{{end}}
84536cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{$base}}({{Macro "Arguments" $}});
84636cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu      } else {
8475beb2ac5e0b676e55be9f0b768ba3fd3697f3216Chia-I Wu        Logger({{$p0.Name}}).Err({{$p0.Name}}, "{{$ext_name}} not enabled. {{$.Name}} not executed.");
84836cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu        {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
849eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      }
85036cc00a1739f7d926cc20671ae9900a5460dd6aeChia-I Wu    }
851eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu852eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
853eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
854eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
855eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
856eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
857eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
858eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a global ProcHook.
859eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
860eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
861eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineGlobalProcHook"}}
862eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
863eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
864eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
865eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
866eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := GetAnnotation $ "extension"}}
867eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if $ext}}
868eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{Error "invalid global extension"}}
869eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
870eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
871eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
872eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
873eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::GLOBAL,
874eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::EXTENSION_CORE,
875ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu    reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
876eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    nullptr,
877eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
878eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
879eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
880eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
881eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
882eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
883eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of an instance ProcHook.
884eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
885eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
886eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineInstanceProcHook"}}
887eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
888eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
889eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
890eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
891eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
892eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
893eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::INSTANCE,
894eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
895eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
896eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
897eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
898eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
899eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
900eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
901eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
902eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
903622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
904eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
905eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
906eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
907eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::EXTENSION_CORE,
908ff4a6c772aaf3ff0b71348647330031a059b1f51Chia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
909eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      nullptr,
910eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
911eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
912eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
913eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
914eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
915eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
916eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
917eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a device ProcHook.
918eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
919eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
920eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineDeviceProcHook"}}
921eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
922eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
923eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
924eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
925eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
926eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
927eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::DEVICE,
928eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
929eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
930eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
931eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
932eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
933eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
934eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
935eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
936eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
937622622377a1ac71a81a88e335f170c4a08835f06Chia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
938eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>(checked{{$base}}),
939eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
940eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
9414901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      ProcHook::EXTENSION_CORE,
9424901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
9434901db70b12801cf1966937a58eb7566bfdeb4ceChia-I Wu      nullptr,
944eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
945eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
946eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
947eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
948eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
949eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
9500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
951cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a function is needed by vulkan::driver.
952cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
953cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
954cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDriverTableEntry"}}
955cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
956cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
957cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
958cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Create functions of dispatchable objects */}}
959cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{     if eq $.Name "vkCreateDevice"}}true
960cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
961cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
962cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
963cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
964cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
965cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
966cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
967cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Enumeration of extensions */}}
968cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
969cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
970cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* We cache physical devices in loader.cpp */}}
971cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
972cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
973cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
974cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
975cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
976cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* VK_KHR_swapchain->VK_ANDROID_native_buffer translation */}}
977cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkCreateImage"}}true
978cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyImage"}}true
979cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
98085bb0c5a57be2b456079c14448127fa9bb8cff66Jesse Hall    {{else if eq $.Name "vkGetPhysicalDeviceProperties"}}true
9816aa30db7a9bbe06b59fddd554d797c6e466ca891Chris Forbes    {{else if eq $.Name "vkGetPhysicalDeviceProperties2KHR"}}true
982cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
983cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
984cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
985cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if $ext}}
986cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{$ext_name := index $ext.Arguments 0}}
987cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{     if eq $ext_name "VK_ANDROID_native_buffer"}}true
988cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{else if eq $ext_name "VK_EXT_debug_report"}}true
989cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
990cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
991cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
992cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
993cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
994cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
995cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
996cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
997cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if an instance-dispatched function is needed by vulkan::driver.
998cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
999cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
1000cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsInstanceDriverTableEntry"}}
1001cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
1002cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1003cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsInstanceDispatched" $)}}
1004cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
1005cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
1006cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
1007cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1008cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1009cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
1010cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
1011cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a device-dispatched function is needed by vulkan::driver.
1012cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
1013cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
1014cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDeviceDriverTableEntry"}}
1015cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
1016cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1017cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsDeviceDispatched" $)}}
1018cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
1019cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
1020cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
1021cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1022cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
1023cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
1024cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
10250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a function/extension name without the "vk"/"VK_" prefix.
10260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "BaseName"}}
10290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if IsFunction $}}{{TrimPrefix "vk" $.Name}}
10300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $.Name "extension"}}{{TrimPrefix "VK_" (index $.Arguments 0)}}
10310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}{{Error "invalid use of BaseName"}}
10320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a comma-separated list of C parameter names for the given command.
10390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
10400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "Arguments"}}
10420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{ForEach $.CallParameters "ParameterName" | JoinWith ", "}}
10450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsGloballyDispatched"}}
10530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Global")}}
10550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that undergo table dispatch. Only global
10630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  functions and functions handled in the loader top without calling into
10640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  lower layers are not dispatched.
10650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsInstanceDispatched"}}
10680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Instance")}}
10700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that can have device-specific dispatch.
10780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsDeviceDispatched"}}
10810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Device")}}
10830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
10840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if a function is core or from a supportable extension.
10910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionSupported"}}
10940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if not (GetAnnotation $ "pfn")}}
10960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
10970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if not $ext}}true
10980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if not (Macro "IsExtensionBlacklisted" $ext)}}true
10990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
11000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
11020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Decides whether a function should be exported from the Android Vulkan
11070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  library. Functions in the core API and in loader extensions are exported.
11080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionExported"}}
11110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
11120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
11140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
11150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if $ext}}
11160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{Macro "IsExtensionExported" $ext}}
11170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else}}
11180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      true
11190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
11200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
11220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if an extension is unsupportable on Android.
11270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionBlacklisted"}}
11300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
11310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_display"}}true
11320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_display_swapchain"}}true
113377ad05be8fa7f4d63b384cc134a55e25731cdaf6Jesse Hall  {{else if eq $ext "VK_KHR_mir_surface"}}true
11340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_xcb_surface"}}true
113577ad05be8fa7f4d63b384cc134a55e25731cdaf6Jesse Hall  {{else if eq $ext "VK_KHR_xlib_surface"}}true
11360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_wayland_surface"}}true
11370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_win32_surface"}}true
1138ad250840766ea76def08c0d9f0b04a09c32dab79Jesse Hall  {{else if eq $ext "VK_KHX_external_memory_win32"}}true
1139ad250840766ea76def08c0d9f0b04a09c32dab79Jesse Hall  {{else if eq $ext "VK_KHX_win32_keyed_mutex"}}true
1140ad250840766ea76def08c0d9f0b04a09c32dab79Jesse Hall  {{else if eq $ext "VK_KHX_external_semaphore_win32"}}true
114177ad05be8fa7f4d63b384cc134a55e25731cdaf6Jesse Hall  {{else if eq $ext "VK_EXT_acquire_xlib_display"}}true
114277ad05be8fa7f4d63b384cc134a55e25731cdaf6Jesse Hall  {{else if eq $ext "VK_EXT_direct_mode_display"}}true
114377ad05be8fa7f4d63b384cc134a55e25731cdaf6Jesse Hall  {{else if eq $ext "VK_EXT_display_surface_counter"}}true
114477ad05be8fa7f4d63b384cc134a55e25731cdaf6Jesse Hall  {{else if eq $ext "VK_EXT_display_control"}}true
1145ad250840766ea76def08c0d9f0b04a09c32dab79Jesse Hall  {{else if eq $ext "VK_MVK_ios_surface"}}true
1146ad250840766ea76def08c0d9f0b04a09c32dab79Jesse Hall  {{else if eq $ext "VK_MVK_macos_surface"}}true
114777ad05be8fa7f4d63b384cc134a55e25731cdaf6Jesse Hall  {{else if eq $ext "VK_NN_vi_surface"}}true
1148eb02c479aad0bc442520fe63f7ffa4d77fe2fa24Jesse Hall  {{else if eq $ext "VK_NV_external_memory_win32"}}true
1149eb02c479aad0bc442520fe63f7ffa4d77fe2fa24Jesse Hall  {{else if eq $ext "VK_NV_win32_keyed_mutex"}}true
11500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
11520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
11540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
11550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
1156d634c483bcbd564acd81dcf5d15fc5fa8ab410f4Courtney Goeltzenleuchter  Reports whether an extension has functions exported by the loader.
1157d634c483bcbd564acd81dcf5d15fc5fa8ab410f4Courtney Goeltzenleuchter  E.g. applications can directly link to an extension function.
1158d634c483bcbd564acd81dcf5d15fc5fa8ab410f4Courtney Goeltzenleuchter  Currently only support WSI extensions this way.
11590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
11600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
11610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionExported"}}
11620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
11630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_surface"}}true
11640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_swapchain"}}true
11650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_android_surface"}}true
11660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
11670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
1168eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1169eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1170eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
1171eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1172eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Reports whether an extension is internal to the loader and drivers,
1173eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  so the loader should not enumerate it.
1174eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1175eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
1176eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "IsExtensionInternal"}}
1177eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := index $.Arguments 0}}
1178eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{     if eq $ext "VK_ANDROID_native_buffer"}}true
1179eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
1180eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
1181