code-generator.tmpl revision cc5e2765a9d56b03b69d0c3f25b94721f82d034e
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 Wu400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <vulkan/vulkan.h>
410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace vulkan {«
430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace api {«
440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wustruct InstanceDispatchTable {
460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{range $f := AllCommands $}}
480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if (Macro "api.IsInstanceDispatchTableEntry" $f)}}
49cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu};
540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wustruct DeviceDispatchTable {
560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{range $f := AllCommands $}}
580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if (Macro "api.IsDeviceDispatchTableEntry" $f)}}
59cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu};
640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wubool InitDispatchTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc);
660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wubool InitDispatchTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc);
670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu»} // namespace api
690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu»} // namespace vulkan
700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#endif // LIBVULKAN_API_GEN_H
720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu¶{{end}}
730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  api_gen.cpp
780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api_gen.cpp"}}
810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{Macro "Copyright"}}
820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <string.h>
860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <algorithm>
870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include <log/log.h>
880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu#include "api.h"
900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace vulkan {«
920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wunamespace api {«
930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu94cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "C++.DefineInitProcMacro" "dispatch"}}
95cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu96cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "api.C++.DefineInitProcExtMacro"}}
970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wubool InitDispatchTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc) {
990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    auto& data = GetData(instance);
1000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    bool success = true;
1010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format off
1030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
1040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "api.IsInstanceDispatchTableEntry" $f)}}
1050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "C++.InitProc" $f}}
1060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
1080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format on
1090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return success;
1110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu}
1120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wubool InitDispatchTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc) {
1140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    auto& data = GetData(dev);
1150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    bool success = true;
1160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format off
1180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
1190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "api.IsDeviceDispatchTableEntry" $f)}}
1200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "C++.InitProc" $f}}
1210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
1230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    // clang-format on
1240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return success;
1260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu}
1270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu»} // namespace api
1290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu»} // namespace vulkan
1300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// clang-format off
1320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{range $f := AllCommands $}}
1340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionExported" $f)}}
1350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    __attribute__((visibility("default")))
1360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    VKAPI_ATTR {{Node "Type" $f.Return}} {{$f.Name}}({{Macro "Parameters" $f}}) {
1370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{     if eq $f.Name "vkGetInstanceProcAddr"}}
1380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "api.C++.InterceptInstanceProcAddr" $}}
1390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{else if eq $f.Name "vkGetDeviceProcAddr"}}
1400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{Macro "api.C++.InterceptDeviceProcAddr" $}}
1410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
1420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
1430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{Macro "api.C++.Dispatch" $f}}
1440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    }
1450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
1470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
1480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu1490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu// clang-format on
1500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu¶{{end}}
1510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
1520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
1530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
154eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
155eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  driver_gen.h
156eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
157eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
158eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver_gen.h"}}
159eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "Copyright"}}
160eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu161eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// WARNING: This file is generated. See ../README.md for instructions.
162eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu163eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#ifndef LIBVULKAN_DRIVER_GEN_H
164eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#define LIBVULKAN_DRIVER_GEN_H
165eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu166eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <vulkan/vulkan.h>
167eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <vulkan/vk_android_native_buffer.h>
168eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu169eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace vulkan {«
170eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace driver {«
171eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu172eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{Macro "driver.C++.DefineProcHookType"}}
173eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu174cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wustruct InstanceDriverTable {
175cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format off
176cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{range $f := AllCommands $}}
177cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
178cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
179cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
180cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
181cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format on
182cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu};
183cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu184cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wustruct DeviceDriverTable {
185cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format off
186cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{range $f := AllCommands $}}
187cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
188cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{Macro "C++.DeclareTableEntry" $f}};
189cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
190cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
191cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // clang-format on
192cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu};
193cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu194eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook* GetProcHook(const char* name);
195eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuProcHook::Extension GetProcHookExtension(const char* name);
196eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu197cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wubool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc);
198cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wubool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc);
199cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu200eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace driver
201eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace vulkan
202eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu203eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#endif // LIBVULKAN_DRIVER_TABLE_H
204eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu¶{{end}}
205eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
206eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
207eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
208eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
209eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  driver_gen.cpp
210eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
211eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
212eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver_gen.cpp"}}
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#include <string.h>
218eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <algorithm>
219eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include <log/log.h>
220eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu221eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include "driver.h"
222eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu#include "loader.h"
223eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu224eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace vulkan {«
225eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace driver {«
226eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu227eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wunamespace {«
228eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu229eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format off
230eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu231eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{range $f := AllCommands $}}
232eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{Macro "driver.C++.DefineProcHookStubs" $f}}
233eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
234eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format on
235eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu236eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook g_proc_hooks[] = {
237eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format off
238eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $f := SortBy (AllCommands $) "FunctionName"}}
239eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if (Macro "driver.IsIntercepted" $f)}}
240eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{     if (Macro "IsGloballyDispatched" $f)}}
241eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineGlobalProcHook" $f}}
242eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else if (Macro "IsInstanceDispatched" $f)}}
243eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineInstanceProcHook" $f}}
244eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else if (Macro "IsDeviceDispatched" $f)}}
245eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{Macro "driver.C++.DefineDeviceProcHook" $f}}
246eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
247eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
248eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
249eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format on
250eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu};
251eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu252eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // anonymous
253eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu254eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wuconst ProcHook* GetProcHook(const char* name) {
255eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto& begin = g_proc_hooks;
256eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto& end = g_proc_hooks +
257eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
258eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    const auto hook = std::lower_bound(begin, end, name,
259eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
260eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    return (hook <  end && strcmp(hook->name, name) == 0) ? hook : nullptr;
261eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu}
262eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu263eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuProcHook::Extension GetProcHookExtension(const char* name) {
264eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$exts := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
265eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format off
266eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $e := $exts}}
267eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    if (strcmp(name, "{{$e}}") == 0) return ProcHook::{{TrimPrefix "VK_" $e}};
268eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
269eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  // clang-format on
270eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  return ProcHook::EXTENSION_UNKNOWN;
271eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu}
272eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu273cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "C++.DefineInitProcMacro" "driver"}}
274cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu275cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{Macro "driver.C++.DefineInitProcExtMacro"}}
276cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu277cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wubool InitDriverTable(VkInstance instance, PFN_vkGetInstanceProcAddr get_proc)
278cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{
279cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    auto& data = GetData(instance);
280cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    bool success = true;
281cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu282cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format off
283cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{range $f := AllCommands $}}
284cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{if (Macro "driver.IsInstanceDriverTableEntry" $f)}}
285cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        {{Macro "C++.InitProc" $f}}
286cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
287cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
288cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format on
289cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu290cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    return success;
291cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu}
292cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu293cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wubool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc)
294cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{
295cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    auto& data = GetData(dev);
296cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    bool success = true;
297cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu298cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format off
299cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{range $f := AllCommands $}}
300cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{if (Macro "driver.IsDeviceDriverTableEntry" $f)}}
301cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        {{Macro "C++.InitProc" $f}}
302cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
303cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
304cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    // clang-format on
305cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu306cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    return success;
307cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu}
308cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu309eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace driver
310eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu»} // namespace vulkan
311eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu312eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu// clang-format on
313eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu¶{{end}}
314eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
315eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
316eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
3170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
318cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits a declaration of a dispatch/driver table entry.
3190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
3200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
321cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "C++.DeclareTableEntry"}}
3220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
3230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "FunctionPtrName" $}} {{Macro "BaseName" $}}
3250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
3260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
3290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
330cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC macro.
3310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
3320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
333cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "C++.DefineInitProcMacro"}}
3340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  #define UNLIKELY(expr) __builtin_expect((expr), 0)
3350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu3360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  #define INIT_PROC(obj, proc) do {                             \
3370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      data.{{$}}.proc = reinterpret_cast<PFN_vk ## proc>(       \
3380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu              get_proc(obj, "vk" # proc));                      \
3390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      if (UNLIKELY(!data.{{$}}.proc)) {                         \
3400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          ALOGE("missing " # obj " proc: vk" # proc);           \
3410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          success = false;                                      \
3420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      }                                                         \
3430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  } while(0)
3440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
3450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
3480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
3490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code to invoke INIT_PROC or INIT_PROC_EXT.
3500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
3510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
3520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "C++.InitProc"}}
3530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
3540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := GetAnnotation $ "extension"}}
3560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if $ext}}
3570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    INIT_PROC_EXT({{Macro "BaseName" $ext}}, §
3580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
3590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    INIT_PROC(§
3600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
3610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsInstanceDispatched" $)}}
3630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    instance, §
3640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
3650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    dev, §
3660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
3670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}});
3690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
3700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
3730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
3740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and instance-dispatched.
3750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
3760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
3770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsInstanceDispatchTableEntry"}}
3780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
3790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsInstanceDispatched" $)}}
3810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
3820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
3830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
3840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
3870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
3880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is exported and device-dispatched.
3890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
3900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
3910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsDeviceDispatchTableEntry"}}
3920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
3930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionExported" $) (Macro "IsDeviceDispatched" $)}}
3950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
3960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
3970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
3980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
3990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
4010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits true if a function is intercepted by vulkan::api.
4030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.IsIntercepted"}}
4060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
4070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
4090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Global functions cannot be dispatched at all */}}
4100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{     if (Macro "IsGloballyDispatched" $)}}true
4110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* VkPhysicalDevice functions that manage device layers */}}
4130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
4140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceLayerProperties"}}true
4150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
4160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{/* Destroy functions of dispatchable objects */}}
4180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
4190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
4200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
4220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
4230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
4240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
427cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
428cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::api.
429cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
430cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
431cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "api.C++.DefineInitProcExtMacro"}}
432cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  // TODO do we want to point to a stub or nullptr when ext is not enabled?
433cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  #define INIT_PROC_EXT(ext, obj, proc) do {                    \
434cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      INIT_PROC(obj, proc);                                     \
435cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
436cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
437cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
438cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
439cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
4400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetInstanceProcAddr for function interception.
4420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
4430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
4440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptInstanceProcAddr"}}
4450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
4460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // global functions
4480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (!instance) {
4490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := AllCommands $}}
4500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsGloballyDispatched" $f)}}
4510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        if (strcmp(pName, "{{$f.Name}}") == 0) return §
4520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          reinterpret_cast<PFN_vkVoidFunction>(§
4530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu            vulkan::api::{{Macro "BaseName" $f}});
4540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
4550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
4560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu4570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    ALOGE("vkGetInstanceProcAddr called with %s without instance",  pName);
4580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
4590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
4600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu4610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const struct Hook {
4620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    const char* name;
4630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    PFN_vkVoidFunction proc;
4640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  } hooks[] = {
4650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
4660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionExported" $f)}}
4670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* hide global functions */}}
4680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if (Macro "IsGloballyDispatched" $f)}}
4690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", nullptr },
4700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect intercepted functions */}}
4720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "api.IsIntercepted" $f)}}
4730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>(§
4740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu            vulkan::api::{{Macro "BaseName" $f}}) },
4750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect vkGetInstanceProcAddr to itself */}}
4770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if eq $f.Name "vkGetInstanceProcAddr"}}
4780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{$f.Name}}) },
4790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{/* redirect device functions to themselves as a workaround for
4810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu             layers that do not intercept in their vkGetInstanceProcAddr */}}
4820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{else if (Macro "IsDeviceDispatched" $f)}}
4830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          { "{{$f.Name}}", reinterpret_cast<PFN_vkVoidFunction>({{$f.Name}}) },
4840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
4850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
4860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
4870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
4880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
4890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
4900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(hooks) / sizeof(hooks[0]);
4910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  auto hook = std::lower_bound(
4920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    hooks, hooks + count, pName,
4930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    [](const Hook& h, const char* n) { return strcmp(h.name, n) < 0; });
4940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (hook <  hooks + count && strcmp(hook->name, pName) == 0) {
4950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    if (!hook->proc)
4960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      ALOGE("vkGetInstanceProcAddr called with %s with instance",  pName);
4970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return hook->proc;
4980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
4990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
5000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
5020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
5050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code for vkGetDeviceProcAddr for function interception.
5070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
5090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.InterceptDeviceProcAddr"}}
5100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "API"}}
5110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (device == VK_NULL_HANDLE) {
5130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    ALOGE("vkGetDeviceProcAddr called with invalid device");
5140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
5150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
5160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  static const char* const known_non_device_names[] = {
5180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{range $f := SortBy (AllCommands $) "FunctionName"}}
5190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{if (Macro "IsFunctionSupported" $f)}}
5200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{if not (Macro "IsDeviceDispatched" $f)}}
5210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu          "{{$f.Name}}",
5220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        {{end}}
5230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{end}}
5240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
5250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  };
5260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format on
5270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  constexpr size_t count = sizeof(known_non_device_names) /
5280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    sizeof(known_non_device_names[0]);
5290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  if (!pName ||
5300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      std::binary_search(
5310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        known_non_device_names, known_non_device_names + count, pName,
5320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu        [](const char* a, const char* b) { return (strcmp(a, b) < 0); })) {
5330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    ALOGE("vkGetDeviceProcAddr called with %s", pName);
5340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    return nullptr;
5350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  }
5360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  // clang-format off
5370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu5380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
5390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
5420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits code to dispatch a function.
5440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
5450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
5460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "api.C++.Dispatch"}}
5470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
5480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "api.IsIntercepted" $)}}// call into api.cpp{{end}}
5500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if not (IsVoid $.Return.Type)}}return §{{end}}
5510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "api.IsIntercepted" $)}}
5530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    vulkan::api::§
5540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}
5550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$p0 := index $.CallParameters 0}}
5560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    vulkan::api::GetData({{$p0.Name}}).dispatch.§
5570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
5580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{Macro "BaseName" $}}({{Macro "Arguments" $}});
5600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
5610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
5630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
564eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
565eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits a list of extensions intercepted by vulkan::driver.
566eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
567eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
568eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.InterceptedExtensions"}}
569eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_ANDROID_native_buffer
570eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_EXT_debug_report
571eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_android_surface
572eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_surface
573eb7db124e46da9a9210cf868353f5ea79502ffecChia-I WuVK_KHR_swapchain
574eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
575eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
576eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
577eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
578eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
579eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if an extension is intercepted by vulkan::driver.
580eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
581eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
582eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsExtensionIntercepted"}}
583eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext_name := index $.Arguments 0}}
584eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$filters := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
585eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
586eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{range $f := $filters}}
587eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if eq $ext_name $f}}true{{end}}
588eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
589eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
590eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
591eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
592eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
593eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
594eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if a function is intercepted by vulkan::driver.
595eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
596eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
597eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.IsIntercepted"}}
598eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
599eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
600eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
601eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Create functions of dispatchable objects */}}
602eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{     if eq $.Name "vkCreateInstance"}}true
603eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkCreateDevice"}}true
604eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
605eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
606eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
607eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
608eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
609eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
610eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
611eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* Enumeration of extensions */}}
612eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateInstanceExtensionProperties"}}true
613eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
614eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
615eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{/* We cache physical devices in loader.cpp */}}
616eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
617eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
618eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
619eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
620eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
621eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
622eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
623eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
624eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
625eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{Macro "driver.IsExtensionIntercepted" $ext}}
626eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
627eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
628eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
629eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
630eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
631eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
632eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
633eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
634eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits true if a function needs ProcHook stubs.
635eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
636eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
637eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.NeedProcHookStubs"}}
638eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
639eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
640eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if (Macro "driver.IsIntercepted" $)}}
641eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
642eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
643eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if not (Macro "IsExtensionInternal" $ext)}}true{{end}}
644eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
645eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
646eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
647eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
648eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
649eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
650eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
651eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of struct ProcHook.
652eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
653eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
654eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineProcHookType"}}
655eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  struct ProcHook {
656eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Type {
657eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        GLOBAL,
658eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        INSTANCE,
659eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        DEVICE,
660eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
661eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
662eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      enum Extension {
663eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{$exts := Strings (Macro "driver.InterceptedExtensions") | SplitOn "\n"}}
664eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{range $e := $exts}}
665eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          {{TrimPrefix "VK_" $e}},
666eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{end}}
667eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu668eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_CORE, // valid bit
669eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_COUNT,
670eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        EXTENSION_UNKNOWN,
671eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      };
672eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu673eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      const char* name;
674eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Type type;
675eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      Extension extension;
676eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu677eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      PFN_vkVoidFunction proc;
678eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      PFN_vkVoidFunction disabled_proc; // nullptr for global hooks
679eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      PFN_vkVoidFunction checked_proc;  // nullptr for global/instance hooks
680eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  };
681eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
682eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
683eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
684eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
685eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
686cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits INIT_PROC_EXT macro for vulkan::driver.
687cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
688cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
689cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.C++.DefineInitProcExtMacro"}}
690cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  #define INIT_PROC_EXT(ext, obj, proc) do {                    \
691cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      if (data.hal_extensions[ProcHook::ext])           \
692cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu        INIT_PROC(obj, proc);                                   \
693cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  } while(0)
694cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
695cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
696cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
697cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
698cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
699eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definitions of stub functions for ProcHook.
700eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
701eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
702eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineProcHookStubs"}}
703eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
704eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
705eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if (Macro "driver.NeedProcHookStubs" $)}}
706eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
707eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext_name := index $ext.Arguments 0}}
708eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
709eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$base := (Macro "BaseName" $)}}
710eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$unnamed_params := (ForEach $.CallParameters "ParameterType" | JoinWith ", ")}}
711eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
712eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    VKAPI_ATTR {{Node "Type" $.Return}} disabled{{$base}}({{$unnamed_params}}) {
713eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ALOGE("{{$ext_name}} not enabled. {{$.Name}} not executed.");
714eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if not (IsVoid $.Return.Type)}}return VK_SUCCESS;{{end}}
715eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    }
716eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if (Macro "IsDeviceDispatched" $)}}
717eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu718eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      VKAPI_ATTR {{Node "Type" $.Return}} checked{{$base}}({{Macro "Parameters" $}}) {
719eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{if not (IsVoid $.Return.Type)}}return §{{end}}
720eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
721eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{$p0 := index $.CallParameters 0}}
722eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{$ext_hook := Strings ("ProcHook::") (Macro "BaseName" $ext)}}
723eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        (GetData({{$p0.Name}}).hook_extensions[{{$ext_hook}}]) ? §
724eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          {{$base}}_Bottom({{Macro "Arguments" $}}) : §
725eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          disabled{{$base}}({{Macro "Arguments" $}});
726eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      }
727eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
728eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu729eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
730eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
731eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
732eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
733eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
734eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
735eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a global ProcHook.
736eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
737eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
738eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineGlobalProcHook"}}
739eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
740eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
741eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
742eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
743eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := GetAnnotation $ "extension"}}
744eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{if $ext}}
745eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{Error "invalid global extension"}}
746eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
747eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
748eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
749eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
750eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::GLOBAL,
751eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::EXTENSION_CORE,
752eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if eq $.Name "vkEnumerateInstanceExtensionProperties"}}
753eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
754eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
755eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
756eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
757eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    nullptr,
758eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    nullptr,
759eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
760eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
761eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
762eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
763eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
764eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
765eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of an instance ProcHook.
766eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
767eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
768eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineInstanceProcHook"}}
769eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
770eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
771eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
772eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
773eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
774eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
775eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::INSTANCE,
776eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
777eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
778eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
779eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
780eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
781eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
782eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
783eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
784eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
785eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
786eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
787eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>(disabled{{$base}}),
788eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
789eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
790eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
791eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::EXTENSION_CORE,
792eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
793eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if eq $.Name "vkGetInstanceProcAddr"}}
794eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
795eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
796eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
797eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
798eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      nullptr,
799eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      nullptr,
800eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
801eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
802eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
803eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
804eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
805eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
806eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
807eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Emits definition of a device ProcHook.
808eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu-------------------------------------------------------------------------------
809eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
810eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "driver.C++.DefineDeviceProcHook"}}
811eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{AssertType $ "Function"}}
812eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
813eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$base := (Macro "BaseName" $)}}
814eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
815eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {
816eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    "{{$.Name}}",
817eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    ProcHook::DEVICE,
818eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
819eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
820eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{if $ext}}
821eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      ProcHook::{{Macro "BaseName" $ext}},
822eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
823eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{if (Macro "IsExtensionInternal" $ext)}}
824eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
825eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
826eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
827eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{else}}
828eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
829eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>(disabled{{$base}}),
830eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        reinterpret_cast<PFN_vkVoidFunction>(checked{{$base}}),
831eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu      {{end}}
832eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{else}}
833eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        ProcHook::EXTENSION_CORE,
834eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
835eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{if eq $.Name "vkGetDeviceProcAddr"}}
836eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
837eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{else}}
838eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu          reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
839eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        {{end}}
840eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
841eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu        nullptr,
842eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu    {{end}}
843eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  },
844eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
845eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
846eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
847eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
8480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
849cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a function is needed by vulkan::driver.
850cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
851cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
852cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDriverTableEntry"}}
853cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
854cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
855cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
856cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Create functions of dispatchable objects */}}
857cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{     if eq $.Name "vkCreateDevice"}}true
858cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceQueue"}}true
859cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkAllocateCommandBuffers"}}true
860cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
861cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Destroy functions of dispatchable objects */}}
862cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyInstance"}}true
863cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyDevice"}}true
864cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
865cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* Enumeration of extensions */}}
866cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumerateDeviceExtensionProperties"}}true
867cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
868cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* We cache physical devices in loader.cpp */}}
869cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkEnumeratePhysicalDevices"}}true
870cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
871cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetInstanceProcAddr"}}true
872cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkGetDeviceProcAddr"}}true
873cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
874cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{/* VK_KHR_swapchain->VK_ANDROID_native_buffer translation */}}
875cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkCreateImage"}}true
876cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{else if eq $.Name "vkDestroyImage"}}true
877cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
878cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
879cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
880cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{$ext := GetAnnotation $ "extension"}}
881cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{if $ext}}
882cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{$ext_name := index $ext.Arguments 0}}
883cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{     if eq $ext_name "VK_ANDROID_native_buffer"}}true
884cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{else if eq $ext_name "VK_EXT_debug_report"}}true
885cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu      {{end}}
886cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    {{end}}
887cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
888cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
889cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
890cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
891cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
892cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
893cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if an instance-dispatched function is needed by vulkan::driver.
894cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
895cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
896cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsInstanceDriverTableEntry"}}
897cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
898cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
899cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsInstanceDispatched" $)}}
900cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
901cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
902cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
903cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
904cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
905cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
906cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
907cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  Emits true if a device-dispatched function is needed by vulkan::driver.
908cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu------------------------------------------------------------------------------
909cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu*/}}
910cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{define "driver.IsDeviceDriverTableEntry"}}
911cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{AssertType $ "Function"}}
912cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
913cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{if and (Macro "driver.IsDriverTableEntry" $) (Macro "IsDeviceDispatched" $)}}
914cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu    true
915cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu  {{end}}
916cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{end}}
917cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
918cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu
919cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu{{/*
920cc5e2765a9d56b03b69d0c3f25b94721f82d034eChia-I Wu-------------------------------------------------------------------------------
9210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a function/extension name without the "vk"/"VK_" prefix.
9220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
9230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
9240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "BaseName"}}
9250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if IsFunction $}}{{TrimPrefix "vk" $.Name}}
9260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $.Name "extension"}}{{TrimPrefix "VK_" (index $.Arguments 0)}}
9270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else}}{{Error "invalid use of BaseName"}}
9280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
9290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
9300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
9330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
9340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emits a comma-separated list of C parameter names for the given command.
9350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu-------------------------------------------------------------------------------
9360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
9370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "Arguments"}}
9380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
9390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{ForEach $.CallParameters "ParameterName" | JoinWith ", "}}
9410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
9420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
9450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
9480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsGloballyDispatched"}}
9490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
9500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Global")}}
9510c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
9520c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
9530c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
9540c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9550c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9560c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
9570c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9580c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that undergo table dispatch. Only global
9590c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  functions and functions handled in the loader top without calling into
9600c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  lower layers are not dispatched.
9610c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9620c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
9630c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsInstanceDispatched"}}
9640c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
9650c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Instance")}}
9660c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
9670c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
9680c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
9690c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9700c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9710c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
9720c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9730c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" for supported functions that can have device-specific dispatch.
9740c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9750c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
9760c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsDeviceDispatched"}}
9770c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
9780c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if and (Macro "IsFunctionSupported" $) (eq (Macro "Vtbl" $) "Device")}}
9790c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    true
9800c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
9810c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
9820c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9830c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9840c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
9850c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9860c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if a function is core or from a supportable extension.
9870c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
9880c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
9890c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionSupported"}}
9900c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
9910c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if not (GetAnnotation $ "pfn")}}
9920c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
9930c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if not $ext}}true
9940c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else if not (Macro "IsExtensionBlacklisted" $ext)}}true
9950c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
9960c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
9970c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
9980c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
9990c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10000c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10010c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10020c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Decides whether a function should be exported from the Android Vulkan
10030c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  library. Functions in the core API and in loader extensions are exported.
10040c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10050c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10060c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsFunctionExported"}}
10070c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{AssertType $ "Function"}}
10080c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10090c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{if (Macro "IsFunctionSupported" $)}}
10100c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{$ext := GetAnnotation $ "extension"}}
10110c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{if $ext}}
10120c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      {{Macro "IsExtensionExported" $ext}}
10130c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{else}}
10140c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu      true
10150c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu    {{end}}
10160c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10170c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10180c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10190c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10200c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10210c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10220c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Emit "true" if an extension is unsupportable on Android.
10230c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10240c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10250c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionBlacklisted"}}
10260c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
10270c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_display"}}true
10280c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_display_swapchain"}}true
10290c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_xlib_surface"}}true
10300c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_xcb_surface"}}true
10310c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_wayland_surface"}}true
10320c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_mir_surface"}}true
10330c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_win32_surface"}}true
10340c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10350c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
10360c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10370c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu
10380c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{/*
10390c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10400c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  Reports whether an extension is implemented entirely by the loader,
10410c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  so drivers should not enumerate it.
10420c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu------------------------------------------------------------------------------
10430c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu*/}}
10440c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{define "IsExtensionExported"}}
10450c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{$ext := index $.Arguments 0}}
10460c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{     if eq $ext "VK_KHR_surface"}}true
10470c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_swapchain"}}true
10480c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{else if eq $ext "VK_KHR_android_surface"}}true
10490c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu  {{end}}
10500c2032490b80178ec823bf22a7f5d08398851cc3Chia-I Wu{{end}}
1051eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1052eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu
1053eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{/*
1054eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1055eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  Reports whether an extension is internal to the loader and drivers,
1056eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  so the loader should not enumerate it.
1057eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu------------------------------------------------------------------------------
1058eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu*/}}
1059eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{define "IsExtensionInternal"}}
1060eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{$ext := index $.Arguments 0}}
1061eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{     if eq $ext "VK_ANDROID_native_buffer"}}true
1062eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu  {{end}}
1063eb7db124e46da9a9210cf868353f5ea79502ffecChia-I Wu{{end}}
1064