xref: /aosp_15_r20/external/angle/scripts/generate_loader.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/python3
2*8975f5c5SAndroid Build Coastguard Worker#
3*8975f5c5SAndroid Build Coastguard Worker# Copyright 2018 The ANGLE Project Authors. All rights reserved.
4*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
6*8975f5c5SAndroid Build Coastguard Worker#
7*8975f5c5SAndroid Build Coastguard Worker# generate_loader.py:
8*8975f5c5SAndroid Build Coastguard Worker#   Generates dynamic loaders for various binding interfaces.
9*8975f5c5SAndroid Build Coastguard Worker#   NOTE: don't run this script directly. Run scripts/run_code_generation.py.
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Workerimport sys, os, pprint, json
12*8975f5c5SAndroid Build Coastguard Workerimport registry_xml
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard WorkerDEFAULT_INTERNAL_PREFIX = "l_"
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Workerdef write_header(data_source_name,
19*8975f5c5SAndroid Build Coastguard Worker                 all_cmds,
20*8975f5c5SAndroid Build Coastguard Worker                 api,
21*8975f5c5SAndroid Build Coastguard Worker                 preamble,
22*8975f5c5SAndroid Build Coastguard Worker                 path,
23*8975f5c5SAndroid Build Coastguard Worker                 lib,
24*8975f5c5SAndroid Build Coastguard Worker                 load_fn_name,
25*8975f5c5SAndroid Build Coastguard Worker                 ns="",
26*8975f5c5SAndroid Build Coastguard Worker                 prefix=None,
27*8975f5c5SAndroid Build Coastguard Worker                 export="",
28*8975f5c5SAndroid Build Coastguard Worker                 internal_prefix=DEFAULT_INTERNAL_PREFIX,
29*8975f5c5SAndroid Build Coastguard Worker                 file_prefix=""):
30*8975f5c5SAndroid Build Coastguard Worker    file_name = "%s%s_loader_autogen.h" % (file_prefix, api)
31*8975f5c5SAndroid Build Coastguard Worker    header_path = registry_xml.path_to(path, file_name)
32*8975f5c5SAndroid Build Coastguard Worker
33*8975f5c5SAndroid Build Coastguard Worker    def pre(cmd):
34*8975f5c5SAndroid Build Coastguard Worker        if prefix == None:
35*8975f5c5SAndroid Build Coastguard Worker            return cmd
36*8975f5c5SAndroid Build Coastguard Worker        return prefix + cmd[len(api):]
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker    with open(header_path, "w") as out:
39*8975f5c5SAndroid Build Coastguard Worker        defines = [
40*8975f5c5SAndroid Build Coastguard Worker            "#define %s%s %s%s%s" % (ns, pre(cmd), internal_prefix, ns, pre(cmd))
41*8975f5c5SAndroid Build Coastguard Worker            for cmd in all_cmds
42*8975f5c5SAndroid Build Coastguard Worker        ]
43*8975f5c5SAndroid Build Coastguard Worker        var_protos = [
44*8975f5c5SAndroid Build Coastguard Worker            "%sextern PFN%sPROC %s%s%s;" % (export, cmd.upper(), internal_prefix, ns, pre(cmd))
45*8975f5c5SAndroid Build Coastguard Worker            for cmd in all_cmds
46*8975f5c5SAndroid Build Coastguard Worker        ]
47*8975f5c5SAndroid Build Coastguard Worker        loader_header = template_loader_h.format(
48*8975f5c5SAndroid Build Coastguard Worker            script_name=os.path.basename(sys.argv[0]),
49*8975f5c5SAndroid Build Coastguard Worker            data_source_name=data_source_name,
50*8975f5c5SAndroid Build Coastguard Worker            defines="\n".join(defines),
51*8975f5c5SAndroid Build Coastguard Worker            function_pointers="\n".join(var_protos),
52*8975f5c5SAndroid Build Coastguard Worker            api_upper=api.upper(),
53*8975f5c5SAndroid Build Coastguard Worker            api_lower=api,
54*8975f5c5SAndroid Build Coastguard Worker            preamble=preamble,
55*8975f5c5SAndroid Build Coastguard Worker            export=export,
56*8975f5c5SAndroid Build Coastguard Worker            lib=lib.upper(),
57*8975f5c5SAndroid Build Coastguard Worker            load_fn_name=load_fn_name,
58*8975f5c5SAndroid Build Coastguard Worker            file_prefix=file_prefix)
59*8975f5c5SAndroid Build Coastguard Worker
60*8975f5c5SAndroid Build Coastguard Worker        out.write(loader_header)
61*8975f5c5SAndroid Build Coastguard Worker        out.close()
62*8975f5c5SAndroid Build Coastguard Worker
63*8975f5c5SAndroid Build Coastguard Worker
64*8975f5c5SAndroid Build Coastguard Workerdef write_source(data_source_name,
65*8975f5c5SAndroid Build Coastguard Worker                 all_cmds,
66*8975f5c5SAndroid Build Coastguard Worker                 api,
67*8975f5c5SAndroid Build Coastguard Worker                 path,
68*8975f5c5SAndroid Build Coastguard Worker                 load_fn_name,
69*8975f5c5SAndroid Build Coastguard Worker                 ns="",
70*8975f5c5SAndroid Build Coastguard Worker                 prefix=None,
71*8975f5c5SAndroid Build Coastguard Worker                 export="",
72*8975f5c5SAndroid Build Coastguard Worker                 internal_prefix=DEFAULT_INTERNAL_PREFIX,
73*8975f5c5SAndroid Build Coastguard Worker                 file_prefix=""):
74*8975f5c5SAndroid Build Coastguard Worker    file_name = "%s%s_loader_autogen.cpp" % (file_prefix, api)
75*8975f5c5SAndroid Build Coastguard Worker    source_path = registry_xml.path_to(path, file_name)
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker    def pre(cmd):
78*8975f5c5SAndroid Build Coastguard Worker        if prefix == None:
79*8975f5c5SAndroid Build Coastguard Worker            return cmd
80*8975f5c5SAndroid Build Coastguard Worker        return prefix + cmd[len(api):]
81*8975f5c5SAndroid Build Coastguard Worker
82*8975f5c5SAndroid Build Coastguard Worker    with open(source_path, "w") as out:
83*8975f5c5SAndroid Build Coastguard Worker        var_defs = [
84*8975f5c5SAndroid Build Coastguard Worker            "%sPFN%sPROC %s%s%s;" % (export, cmd.upper(), internal_prefix, ns, pre(cmd))
85*8975f5c5SAndroid Build Coastguard Worker            for cmd in all_cmds
86*8975f5c5SAndroid Build Coastguard Worker        ]
87*8975f5c5SAndroid Build Coastguard Worker
88*8975f5c5SAndroid Build Coastguard Worker        setter = "    %s%s%s = reinterpret_cast<PFN%sPROC>(loadProc(\"%s\"));"
89*8975f5c5SAndroid Build Coastguard Worker        setters = [
90*8975f5c5SAndroid Build Coastguard Worker            setter % (internal_prefix, ns, pre(cmd), cmd.upper(), pre(cmd)) for cmd in all_cmds
91*8975f5c5SAndroid Build Coastguard Worker        ]
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker        loader_source = template_loader_cpp.format(
94*8975f5c5SAndroid Build Coastguard Worker            script_name=os.path.basename(sys.argv[0]),
95*8975f5c5SAndroid Build Coastguard Worker            data_source_name=data_source_name,
96*8975f5c5SAndroid Build Coastguard Worker            function_pointers="\n".join(var_defs),
97*8975f5c5SAndroid Build Coastguard Worker            set_pointers="\n".join(setters),
98*8975f5c5SAndroid Build Coastguard Worker            api_upper=api.upper(),
99*8975f5c5SAndroid Build Coastguard Worker            api_lower=api,
100*8975f5c5SAndroid Build Coastguard Worker            load_fn_name=load_fn_name,
101*8975f5c5SAndroid Build Coastguard Worker            file_prefix=file_prefix)
102*8975f5c5SAndroid Build Coastguard Worker
103*8975f5c5SAndroid Build Coastguard Worker        out.write(loader_source)
104*8975f5c5SAndroid Build Coastguard Worker        out.close()
105*8975f5c5SAndroid Build Coastguard Worker
106*8975f5c5SAndroid Build Coastguard Worker
107*8975f5c5SAndroid Build Coastguard Workerdef gen_libegl_loader():
108*8975f5c5SAndroid Build Coastguard Worker
109*8975f5c5SAndroid Build Coastguard Worker    data_source_name = "egl.xml and egl_angle_ext.xml"
110*8975f5c5SAndroid Build Coastguard Worker    xml = registry_xml.RegistryXML("egl.xml", "egl_angle_ext.xml")
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Worker    for major_version, minor_version in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]:
113*8975f5c5SAndroid Build Coastguard Worker        annotation = "{}_{}".format(major_version, minor_version)
114*8975f5c5SAndroid Build Coastguard Worker        name_prefix = "EGL_VERSION_"
115*8975f5c5SAndroid Build Coastguard Worker
116*8975f5c5SAndroid Build Coastguard Worker        feature_name = "{}{}".format(name_prefix, annotation)
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker        xml.AddCommands(feature_name, annotation)
119*8975f5c5SAndroid Build Coastguard Worker
120*8975f5c5SAndroid Build Coastguard Worker    xml.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl'])
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker    all_cmds = xml.all_cmd_names.get_all_commands()
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker    path = os.path.join("..", "src", "libEGL")
125*8975f5c5SAndroid Build Coastguard Worker    write_header(
126*8975f5c5SAndroid Build Coastguard Worker        data_source_name,
127*8975f5c5SAndroid Build Coastguard Worker        all_cmds,
128*8975f5c5SAndroid Build Coastguard Worker        "egl",
129*8975f5c5SAndroid Build Coastguard Worker        libegl_preamble,
130*8975f5c5SAndroid Build Coastguard Worker        path,
131*8975f5c5SAndroid Build Coastguard Worker        "LIBEGL",
132*8975f5c5SAndroid Build Coastguard Worker        "LoadLibEGL_EGL",
133*8975f5c5SAndroid Build Coastguard Worker        prefix="EGL_",
134*8975f5c5SAndroid Build Coastguard Worker        export="ANGLE_NO_EXPORT ")
135*8975f5c5SAndroid Build Coastguard Worker    write_source(data_source_name, all_cmds, "egl", path, "LoadLibEGL_EGL", prefix="EGL_")
136*8975f5c5SAndroid Build Coastguard Worker
137*8975f5c5SAndroid Build Coastguard Worker
138*8975f5c5SAndroid Build Coastguard Workerdef gen_gles_loader(gles_preamble, path, header_lib, export, internal_prefix, file_prefix, tag):
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker    data_source_name = "gl.xml and gl_angle_ext.xml"
141*8975f5c5SAndroid Build Coastguard Worker    xml = registry_xml.RegistryXML("gl.xml", "gl_angle_ext.xml")
142*8975f5c5SAndroid Build Coastguard Worker
143*8975f5c5SAndroid Build Coastguard Worker    # First run through the main GLES entry points.  Since ES2+ is the primary use
144*8975f5c5SAndroid Build Coastguard Worker    # case, we go through those first and then add ES1-only APIs at the end.
145*8975f5c5SAndroid Build Coastguard Worker    for major_version, minor_version in [[2, 0], [3, 0], [3, 1], [3, 2], [1, 0]]:
146*8975f5c5SAndroid Build Coastguard Worker        annotation = "{}_{}".format(major_version, minor_version)
147*8975f5c5SAndroid Build Coastguard Worker        name_prefix = "GL_ES_VERSION_"
148*8975f5c5SAndroid Build Coastguard Worker
149*8975f5c5SAndroid Build Coastguard Worker        is_gles1 = major_version == 1
150*8975f5c5SAndroid Build Coastguard Worker        if is_gles1:
151*8975f5c5SAndroid Build Coastguard Worker            name_prefix = "GL_VERSION_ES_CM_"
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker        feature_name = "{}{}".format(name_prefix, annotation)
154*8975f5c5SAndroid Build Coastguard Worker
155*8975f5c5SAndroid Build Coastguard Worker        xml.AddCommands(feature_name, annotation)
156*8975f5c5SAndroid Build Coastguard Worker
157*8975f5c5SAndroid Build Coastguard Worker    xml.AddExtensionCommands(registry_xml.supported_extensions, ['gles2', 'gles1'])
158*8975f5c5SAndroid Build Coastguard Worker
159*8975f5c5SAndroid Build Coastguard Worker    all_cmds = xml.all_cmd_names.get_all_commands()
160*8975f5c5SAndroid Build Coastguard Worker
161*8975f5c5SAndroid Build Coastguard Worker    # Ensure there are no duplicates
162*8975f5c5SAndroid Build Coastguard Worker    assert (len(all_cmds) == len(set(all_cmds))), "Duplicate command names found"
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker    write_header(
165*8975f5c5SAndroid Build Coastguard Worker        data_source_name,
166*8975f5c5SAndroid Build Coastguard Worker        all_cmds,
167*8975f5c5SAndroid Build Coastguard Worker        "gles",
168*8975f5c5SAndroid Build Coastguard Worker        gles_preamble,
169*8975f5c5SAndroid Build Coastguard Worker        path,
170*8975f5c5SAndroid Build Coastguard Worker        header_lib,
171*8975f5c5SAndroid Build Coastguard Worker        "Load%sGLES" % tag,
172*8975f5c5SAndroid Build Coastguard Worker        export=export,
173*8975f5c5SAndroid Build Coastguard Worker        internal_prefix=internal_prefix,
174*8975f5c5SAndroid Build Coastguard Worker        file_prefix=file_prefix)
175*8975f5c5SAndroid Build Coastguard Worker    write_source(
176*8975f5c5SAndroid Build Coastguard Worker        data_source_name,
177*8975f5c5SAndroid Build Coastguard Worker        all_cmds,
178*8975f5c5SAndroid Build Coastguard Worker        "gles",
179*8975f5c5SAndroid Build Coastguard Worker        path,
180*8975f5c5SAndroid Build Coastguard Worker        "Load%sGLES" % tag,
181*8975f5c5SAndroid Build Coastguard Worker        export=export,
182*8975f5c5SAndroid Build Coastguard Worker        internal_prefix=internal_prefix,
183*8975f5c5SAndroid Build Coastguard Worker        file_prefix=file_prefix)
184*8975f5c5SAndroid Build Coastguard Worker
185*8975f5c5SAndroid Build Coastguard Worker
186*8975f5c5SAndroid Build Coastguard Workerdef gen_egl_loader(egl_preamble, path, header_lib, export, internal_prefix, file_prefix, tag):
187*8975f5c5SAndroid Build Coastguard Worker
188*8975f5c5SAndroid Build Coastguard Worker    data_source_name = "egl.xml and egl_angle_ext.xml"
189*8975f5c5SAndroid Build Coastguard Worker    xml = registry_xml.RegistryXML("egl.xml", "egl_angle_ext.xml")
190*8975f5c5SAndroid Build Coastguard Worker
191*8975f5c5SAndroid Build Coastguard Worker    for major_version, minor_version in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]:
192*8975f5c5SAndroid Build Coastguard Worker        annotation = "{}_{}".format(major_version, minor_version)
193*8975f5c5SAndroid Build Coastguard Worker        name_prefix = "EGL_VERSION_"
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker        feature_name = "{}{}".format(name_prefix, annotation)
196*8975f5c5SAndroid Build Coastguard Worker
197*8975f5c5SAndroid Build Coastguard Worker        xml.AddCommands(feature_name, annotation)
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker    xml.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl'])
200*8975f5c5SAndroid Build Coastguard Worker
201*8975f5c5SAndroid Build Coastguard Worker    all_cmds = xml.all_cmd_names.get_all_commands()
202*8975f5c5SAndroid Build Coastguard Worker
203*8975f5c5SAndroid Build Coastguard Worker    write_header(
204*8975f5c5SAndroid Build Coastguard Worker        data_source_name,
205*8975f5c5SAndroid Build Coastguard Worker        all_cmds,
206*8975f5c5SAndroid Build Coastguard Worker        "egl",
207*8975f5c5SAndroid Build Coastguard Worker        egl_preamble,
208*8975f5c5SAndroid Build Coastguard Worker        path,
209*8975f5c5SAndroid Build Coastguard Worker        header_lib,
210*8975f5c5SAndroid Build Coastguard Worker        "Load%sEGL" % tag,
211*8975f5c5SAndroid Build Coastguard Worker        export=export,
212*8975f5c5SAndroid Build Coastguard Worker        internal_prefix=internal_prefix,
213*8975f5c5SAndroid Build Coastguard Worker        file_prefix=file_prefix)
214*8975f5c5SAndroid Build Coastguard Worker    write_source(
215*8975f5c5SAndroid Build Coastguard Worker        data_source_name,
216*8975f5c5SAndroid Build Coastguard Worker        all_cmds,
217*8975f5c5SAndroid Build Coastguard Worker        "egl",
218*8975f5c5SAndroid Build Coastguard Worker        path,
219*8975f5c5SAndroid Build Coastguard Worker        "Load%sEGL" % tag,
220*8975f5c5SAndroid Build Coastguard Worker        export=export,
221*8975f5c5SAndroid Build Coastguard Worker        internal_prefix=internal_prefix,
222*8975f5c5SAndroid Build Coastguard Worker        file_prefix=file_prefix)
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker
225*8975f5c5SAndroid Build Coastguard Workerdef gen_util_gles_and_egl_loaders():
226*8975f5c5SAndroid Build Coastguard Worker    path = os.path.join("..", "util")
227*8975f5c5SAndroid Build Coastguard Worker    export = "ANGLE_UTIL_EXPORT "
228*8975f5c5SAndroid Build Coastguard Worker    lib = "UTIL"
229*8975f5c5SAndroid Build Coastguard Worker    gen_gles_loader(util_gles_preamble, path, lib, export, DEFAULT_INTERNAL_PREFIX, "", "Util")
230*8975f5c5SAndroid Build Coastguard Worker    gen_egl_loader(util_egl_preamble, path, lib, export, DEFAULT_INTERNAL_PREFIX, "", "Util")
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker
233*8975f5c5SAndroid Build Coastguard Workerdef gen_trace_gles_and_egl_loaders():
234*8975f5c5SAndroid Build Coastguard Worker    path = os.path.join("..", "util", "capture")
235*8975f5c5SAndroid Build Coastguard Worker    export = "ANGLE_TRACE_LOADER_EXPORT "
236*8975f5c5SAndroid Build Coastguard Worker    lib = "ANGLE_TRACES_UTIL"
237*8975f5c5SAndroid Build Coastguard Worker    gen_gles_loader(trace_gles_preamble, path, lib, export, "t_", "trace_", "Trace")
238*8975f5c5SAndroid Build Coastguard Worker    gen_egl_loader(trace_egl_preamble, path, lib, export, "t_", "trace_", "Trace")
239*8975f5c5SAndroid Build Coastguard Worker
240*8975f5c5SAndroid Build Coastguard Worker
241*8975f5c5SAndroid Build Coastguard Workerdef gen_util_wgl_loader():
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard Worker    supported_wgl_extensions = [
244*8975f5c5SAndroid Build Coastguard Worker        "WGL_ARB_create_context", "WGL_ARB_extensions_string", "WGL_ARB_pixel_format",
245*8975f5c5SAndroid Build Coastguard Worker        "WGL_EXT_colorspace", "WGL_EXT_swap_control"
246*8975f5c5SAndroid Build Coastguard Worker    ]
247*8975f5c5SAndroid Build Coastguard Worker
248*8975f5c5SAndroid Build Coastguard Worker    source = "wgl.xml"
249*8975f5c5SAndroid Build Coastguard Worker    xml = registry_xml.RegistryXML(source)
250*8975f5c5SAndroid Build Coastguard Worker
251*8975f5c5SAndroid Build Coastguard Worker    for major_version, minor_version in [[1, 0]]:
252*8975f5c5SAndroid Build Coastguard Worker        annotation = "{}_{}".format(major_version, minor_version)
253*8975f5c5SAndroid Build Coastguard Worker        name_prefix = "WGL_VERSION_"
254*8975f5c5SAndroid Build Coastguard Worker
255*8975f5c5SAndroid Build Coastguard Worker        feature_name = "{}{}".format(name_prefix, annotation)
256*8975f5c5SAndroid Build Coastguard Worker
257*8975f5c5SAndroid Build Coastguard Worker        xml.AddCommands(feature_name, annotation)
258*8975f5c5SAndroid Build Coastguard Worker
259*8975f5c5SAndroid Build Coastguard Worker    xml.AddExtensionCommands(supported_wgl_extensions, ['wgl'])
260*8975f5c5SAndroid Build Coastguard Worker
261*8975f5c5SAndroid Build Coastguard Worker    all_cmds = xml.all_cmd_names.get_all_commands()
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker    path = os.path.join("..", "util", "windows")
264*8975f5c5SAndroid Build Coastguard Worker    write_header(
265*8975f5c5SAndroid Build Coastguard Worker        source, all_cmds, "wgl", util_wgl_preamble, path, "UTIL_WINDOWS", "LoadWGL", ns="_")
266*8975f5c5SAndroid Build Coastguard Worker    write_source(source, all_cmds, "wgl", path, "LoadWGL", ns="_")
267*8975f5c5SAndroid Build Coastguard Worker
268*8975f5c5SAndroid Build Coastguard Worker
269*8975f5c5SAndroid Build Coastguard Workerdef main():
270*8975f5c5SAndroid Build Coastguard Worker
271*8975f5c5SAndroid Build Coastguard Worker    # Handle inputs/outputs for run_code_generation.py's auto_script
272*8975f5c5SAndroid Build Coastguard Worker    if len(sys.argv) > 1:
273*8975f5c5SAndroid Build Coastguard Worker        inputs = registry_xml.xml_inputs
274*8975f5c5SAndroid Build Coastguard Worker        outputs = [
275*8975f5c5SAndroid Build Coastguard Worker            '../src/libEGL/egl_loader_autogen.cpp',
276*8975f5c5SAndroid Build Coastguard Worker            '../src/libEGL/egl_loader_autogen.h',
277*8975f5c5SAndroid Build Coastguard Worker            '../util/egl_loader_autogen.cpp',
278*8975f5c5SAndroid Build Coastguard Worker            '../util/egl_loader_autogen.h',
279*8975f5c5SAndroid Build Coastguard Worker            '../util/gles_loader_autogen.cpp',
280*8975f5c5SAndroid Build Coastguard Worker            '../util/gles_loader_autogen.h',
281*8975f5c5SAndroid Build Coastguard Worker            '../util/windows/wgl_loader_autogen.cpp',
282*8975f5c5SAndroid Build Coastguard Worker            '../util/windows/wgl_loader_autogen.h',
283*8975f5c5SAndroid Build Coastguard Worker            '../util/capture/trace_egl_loader_autogen.cpp',
284*8975f5c5SAndroid Build Coastguard Worker            '../util/capture/trace_egl_loader_autogen.h',
285*8975f5c5SAndroid Build Coastguard Worker            '../util/capture/trace_gles_loader_autogen.cpp',
286*8975f5c5SAndroid Build Coastguard Worker            '../util/capture/trace_gles_loader_autogen.h',
287*8975f5c5SAndroid Build Coastguard Worker        ]
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker        if sys.argv[1] == 'inputs':
290*8975f5c5SAndroid Build Coastguard Worker            print(','.join(inputs))
291*8975f5c5SAndroid Build Coastguard Worker        elif sys.argv[1] == 'outputs':
292*8975f5c5SAndroid Build Coastguard Worker            print(','.join(outputs))
293*8975f5c5SAndroid Build Coastguard Worker        else:
294*8975f5c5SAndroid Build Coastguard Worker            print('Invalid script parameters')
295*8975f5c5SAndroid Build Coastguard Worker            return 1
296*8975f5c5SAndroid Build Coastguard Worker        return 0
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker    gen_libegl_loader()
299*8975f5c5SAndroid Build Coastguard Worker    gen_util_gles_and_egl_loaders()
300*8975f5c5SAndroid Build Coastguard Worker    gen_util_wgl_loader()
301*8975f5c5SAndroid Build Coastguard Worker    gen_trace_gles_and_egl_loaders()
302*8975f5c5SAndroid Build Coastguard Worker    return 0
303*8975f5c5SAndroid Build Coastguard Worker
304*8975f5c5SAndroid Build Coastguard Worker
305*8975f5c5SAndroid Build Coastguard Workerlibegl_preamble = """#include <EGL/egl.h>
306*8975f5c5SAndroid Build Coastguard Worker#include <EGL/eglext.h>
307*8975f5c5SAndroid Build Coastguard Worker#include <export.h>
308*8975f5c5SAndroid Build Coastguard Worker"""
309*8975f5c5SAndroid Build Coastguard Worker
310*8975f5c5SAndroid Build Coastguard Workerutil_gles_preamble = """#if defined(GL_GLES_PROTOTYPES) && GL_GLES_PROTOTYPES
311*8975f5c5SAndroid Build Coastguard Worker#error "Don't define GL prototypes if you want to use a loader!"
312*8975f5c5SAndroid Build Coastguard Worker#endif  // defined(GL_GLES_PROTOTYPES)
313*8975f5c5SAndroid Build Coastguard Worker
314*8975f5c5SAndroid Build Coastguard Worker#include "angle_gl.h"
315*8975f5c5SAndroid Build Coastguard Worker#include "util/util_export.h"
316*8975f5c5SAndroid Build Coastguard Worker"""
317*8975f5c5SAndroid Build Coastguard Worker
318*8975f5c5SAndroid Build Coastguard Workerutil_egl_preamble = """#include "util/util_export.h"
319*8975f5c5SAndroid Build Coastguard Worker
320*8975f5c5SAndroid Build Coastguard Worker#include <EGL/egl.h>
321*8975f5c5SAndroid Build Coastguard Worker#include <EGL/eglext.h>
322*8975f5c5SAndroid Build Coastguard Worker"""
323*8975f5c5SAndroid Build Coastguard Worker
324*8975f5c5SAndroid Build Coastguard Workertrace_gles_preamble = """#if defined(GL_GLES_PROTOTYPES) && GL_GLES_PROTOTYPES
325*8975f5c5SAndroid Build Coastguard Worker#error "Don't define GL prototypes if you want to use a loader!"
326*8975f5c5SAndroid Build Coastguard Worker#endif  // defined(GL_GLES_PROTOTYPES)
327*8975f5c5SAndroid Build Coastguard Worker
328*8975f5c5SAndroid Build Coastguard Worker#include "angle_gl.h"
329*8975f5c5SAndroid Build Coastguard Worker#include "traces_export.h"
330*8975f5c5SAndroid Build Coastguard Worker"""
331*8975f5c5SAndroid Build Coastguard Worker
332*8975f5c5SAndroid Build Coastguard Workertrace_egl_preamble = """
333*8975f5c5SAndroid Build Coastguard Worker#include <EGL/egl.h>
334*8975f5c5SAndroid Build Coastguard Worker#include <EGL/eglext.h>
335*8975f5c5SAndroid Build Coastguard Worker
336*8975f5c5SAndroid Build Coastguard Worker#include "traces_export.h"
337*8975f5c5SAndroid Build Coastguard Worker"""
338*8975f5c5SAndroid Build Coastguard Worker
339*8975f5c5SAndroid Build Coastguard Workerutil_wgl_preamble = """
340*8975f5c5SAndroid Build Coastguard Worker#include <WGL/wgl.h>
341*8975f5c5SAndroid Build Coastguard Worker#include <GLES2/gl2.h>
342*8975f5c5SAndroid Build Coastguard Worker
343*8975f5c5SAndroid Build Coastguard Worker// We add an underscore before each function name to ensure common names like "ChoosePixelFormat"
344*8975f5c5SAndroid Build Coastguard Worker// and "SwapBuffers" don't conflict with our function pointers. We can't use a namespace because
345*8975f5c5SAndroid Build Coastguard Worker// some functions conflict with preprocessor definitions.
346*8975f5c5SAndroid Build Coastguard Worker"""
347*8975f5c5SAndroid Build Coastguard Worker
348*8975f5c5SAndroid Build Coastguard Workertemplate_loader_h = """// GENERATED FILE - DO NOT EDIT.
349*8975f5c5SAndroid Build Coastguard Worker// Generated by {script_name} using data from {data_source_name}.
350*8975f5c5SAndroid Build Coastguard Worker//
351*8975f5c5SAndroid Build Coastguard Worker// Copyright 2018 The ANGLE Project Authors. All rights reserved.
352*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
353*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
354*8975f5c5SAndroid Build Coastguard Worker//
355*8975f5c5SAndroid Build Coastguard Worker// {api_lower}_loader_autogen.h:
356*8975f5c5SAndroid Build Coastguard Worker//   Simple {api_upper} function loader.
357*8975f5c5SAndroid Build Coastguard Worker
358*8975f5c5SAndroid Build Coastguard Worker#ifndef {lib}_{api_upper}_LOADER_AUTOGEN_H_
359*8975f5c5SAndroid Build Coastguard Worker#define {lib}_{api_upper}_LOADER_AUTOGEN_H_
360*8975f5c5SAndroid Build Coastguard Worker
361*8975f5c5SAndroid Build Coastguard Worker{preamble}
362*8975f5c5SAndroid Build Coastguard Worker{defines}
363*8975f5c5SAndroid Build Coastguard Worker
364*8975f5c5SAndroid Build Coastguard Worker#if defined(__cplusplus)
365*8975f5c5SAndroid Build Coastguard Workerextern "C" {{
366*8975f5c5SAndroid Build Coastguard Worker#endif  // defined(__cplusplus)
367*8975f5c5SAndroid Build Coastguard Worker{function_pointers}
368*8975f5c5SAndroid Build Coastguard Worker
369*8975f5c5SAndroid Build Coastguard Workertypedef void (*GenericProc)(void);
370*8975f5c5SAndroid Build Coastguard Workertypedef GenericProc (KHRONOS_APIENTRY *LoadProc)(const char *);
371*8975f5c5SAndroid Build Coastguard Worker{export}void {load_fn_name}(LoadProc loadProc);
372*8975f5c5SAndroid Build Coastguard Worker
373*8975f5c5SAndroid Build Coastguard Worker#if defined(__cplusplus)
374*8975f5c5SAndroid Build Coastguard Worker}}  // extern "C"
375*8975f5c5SAndroid Build Coastguard Worker#endif  // defined(__cplusplus)
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Worker#endif  // {lib}_{api_upper}_LOADER_AUTOGEN_H_
378*8975f5c5SAndroid Build Coastguard Worker"""
379*8975f5c5SAndroid Build Coastguard Worker
380*8975f5c5SAndroid Build Coastguard Workertemplate_loader_cpp = """// GENERATED FILE - DO NOT EDIT.
381*8975f5c5SAndroid Build Coastguard Worker// Generated by {script_name} using data from {data_source_name}.
382*8975f5c5SAndroid Build Coastguard Worker//
383*8975f5c5SAndroid Build Coastguard Worker// Copyright 2018 The ANGLE Project Authors. All rights reserved.
384*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
385*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file.
386*8975f5c5SAndroid Build Coastguard Worker//
387*8975f5c5SAndroid Build Coastguard Worker// {api_lower}_loader_autogen.cpp:
388*8975f5c5SAndroid Build Coastguard Worker//   Simple {api_upper} function loader.
389*8975f5c5SAndroid Build Coastguard Worker
390*8975f5c5SAndroid Build Coastguard Worker#include "{file_prefix}{api_lower}_loader_autogen.h"
391*8975f5c5SAndroid Build Coastguard Worker
392*8975f5c5SAndroid Build Coastguard Workerextern "C" {{
393*8975f5c5SAndroid Build Coastguard Worker{function_pointers}
394*8975f5c5SAndroid Build Coastguard Worker
395*8975f5c5SAndroid Build Coastguard Workervoid {load_fn_name}(LoadProc loadProc)
396*8975f5c5SAndroid Build Coastguard Worker{{
397*8975f5c5SAndroid Build Coastguard Worker{set_pointers}
398*8975f5c5SAndroid Build Coastguard Worker}}
399*8975f5c5SAndroid Build Coastguard Worker}}  // extern "C"
400*8975f5c5SAndroid Build Coastguard Worker"""
401*8975f5c5SAndroid Build Coastguard Worker
402*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
403*8975f5c5SAndroid Build Coastguard Worker    sys.exit(main())
404