blob: 51fd073c5b1a11c3385be147dd09a3a45be09281 [file] [log] [blame]
Frank Henigmandda048c2018-01-11 20:09:09 -05001#!/usr/bin/python2
Jamie Madilla8b73ed2017-11-02 09:22:29 -04002#
3# Copyright 2017 The ANGLE Project Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6#
7# run_code_reneration.py:
8# Runs ANGLE format table and other script run_code_renerationgeneration.
9
10import os, subprocess, sys
11
Jamie Madilld47044a2018-04-27 11:45:03 -040012root_dir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
13
14# auto_script is a standard way for scripts to return their inputs and outputs.
15
16def grab_from_script(script, param):
17 res = subprocess.check_output(['python', script, param]).strip()
18 return [os.path.abspath(os.path.join(os.path.dirname(script), name)) for name in res.split(',')]
19
20def auto_script(script):
21 # Set the CWD to the script directory.
22 os.chdir(os.path.dirname(os.path.abspath(script)))
23 base_script = os.path.basename(script)
24 return {
25 'script': script,
26 'inputs': grab_from_script(base_script, 'inputs'),
27 'outputs': grab_from_script(base_script, 'outputs'),
28 }
29
30# TODO(jmadill): Convert everyting to auto-script.
Jamie Madilla8b73ed2017-11-02 09:22:29 -040031generators = {
32 'ANGLE format': {
33 'inputs': [
34 'src/libANGLE/renderer/angle_format.py',
35 'src/libANGLE/renderer/angle_format_data.json',
36 'src/libANGLE/renderer/angle_format_map.json',
37 ],
38 'outputs': [
39 'src/libANGLE/renderer/Format_table_autogen.cpp',
40 'src/libANGLE/renderer/Format_ID_autogen.inl',
41 ],
42 'script': 'src/libANGLE/renderer/gen_angle_format_table.py',
43 },
Luc Ferron4ea3b452018-03-13 11:48:26 -040044 'ANGLE load functions table': {
45 'inputs': [
46 'src/libANGLE/renderer/load_functions_data.json',
47 ],
48 'outputs': [
49 'src/libANGLE/renderer/load_functions_table_autogen.cpp',
50 ],
51 'script': 'src/libANGLE/renderer/gen_load_functions_table.py',
52 },
Jamie Madilla8b73ed2017-11-02 09:22:29 -040053 'D3D11 format': {
54 'inputs': [
55 'src/libANGLE/renderer/angle_format.py',
56 'src/libANGLE/renderer/d3d/d3d11/texture_format_data.json',
57 'src/libANGLE/renderer/d3d/d3d11/texture_format_map.json',
58 ],
59 'outputs': [
60 'src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp',
61 ],
62 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py',
63 },
64 'DXGI format': {
65 'inputs': [
66 'src/libANGLE/renderer/angle_format.py',
67 'src/libANGLE/renderer/angle_format_map.json',
68 'src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json',
69 ],
70 'outputs': [
71 'src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp',
72 ],
73 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py',
74 },
75 'DXGI format support': {
76 'inputs': [
77 'src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json',
78 ],
79 'outputs': [
80 'src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp',
81 ],
82 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py',
83 },
84 'GL copy conversion table': {
85 'inputs': [
86 'src/libANGLE/es3_copy_conversion_formats.json',
87 ],
88 'outputs': [
89 'src/libANGLE/es3_copy_conversion_table_autogen.cpp',
90 ],
91 'script': 'src/libANGLE/gen_copy_conversion_table.py',
92 },
93 'GL entry point': {
94 'inputs': [
95 'scripts/entry_point_packed_gl_enums.json',
96 'scripts/gl.xml',
97 ],
98 'outputs': [
99 'src/libGLESv2/entry_points_gles_2_0_autogen.cpp',
100 'src/libGLESv2/entry_points_gles_2_0_autogen.h',
101 'src/libGLESv2/entry_points_gles_3_0_autogen.cpp',
102 'src/libGLESv2/entry_points_gles_3_0_autogen.h',
103 ],
104 'script': 'scripts/generate_entry_points.py',
105 },
106 'GL format map': {
107 'inputs': [
108 'src/libANGLE/es3_format_type_combinations.json',
109 'src/libANGLE/format_map_data.json',
110 ],
111 'outputs': [
112 'src/libANGLE/format_map_autogen.cpp',
113 ],
114 'script': 'src/libANGLE/gen_format_map.py',
115 },
116 'uniform type': {
117 'inputs': [],
118 'outputs': [
119 'src/common/uniform_type_info_autogen.cpp',
120 ],
121 'script': 'src/common/gen_uniform_type_table.py',
122 },
123 'OpenGL dispatch table': {
124 'inputs': [
125 'scripts/gl.xml',
126 ],
127 'outputs': [
128 'src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp',
129 'src/libANGLE/renderer/gl/DispatchTableGL_autogen.h',
130 'src/libANGLE/renderer/gl/null_functions.h',
131 'src/libANGLE/renderer/gl/null_functions.cpp',
132 ],
133 'script': 'src/libANGLE/renderer/gl/generate_gl_dispatch_table.py',
134 },
Geoff Lang8ceea812018-04-10 03:07:13 -0400135 'packed enum': {
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400136 'inputs': [
Jamie Madilld4703d52018-05-24 17:31:43 -0400137 'src/common/packed_gl_enums.json',
138 'src/common/packed_egl_enums.json',
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400139 ],
140 'outputs': [
Jamie Madilld4703d52018-05-24 17:31:43 -0400141 'src/common/PackedEGLEnums_autogen.cpp',
142 'src/common/PackedEGLEnums_autogen.h',
143 'src/common/PackedGLEnums_autogen.cpp',
144 'src/common/PackedGLEnums_autogen.h',
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400145 ],
Jamie Madilld4703d52018-05-24 17:31:43 -0400146 'script': 'src/common/gen_packed_gl_enums.py',
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400147 },
Jamie Madill5ad52992017-11-14 12:43:40 -0500148 'proc table': {
149 'inputs': [
150 'src/libGLESv2/proc_table_data.json',
151 ],
152 'outputs': [
153 'src/libGLESv2/proc_table_autogen.cpp',
154 ],
155 'script': 'src/libGLESv2/gen_proc_table.py',
156 },
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400157 'Vulkan format': {
158 'inputs': [
159 'src/libANGLE/renderer/angle_format.py',
160 'src/libANGLE/renderer/angle_format_map.json',
161 'src/libANGLE/renderer/vulkan/vk_format_map.json',
162 ],
163 'outputs': [
164 'src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp',
165 ],
166 'script': 'src/libANGLE/renderer/vulkan/gen_vk_format_table.py',
167 },
Luc Ferron0aa1ffe2018-02-08 13:42:36 -0500168 'Vulkan mandatory format support table': {
169 'inputs': [
170 'src/libANGLE/renderer/angle_format.py',
Frank Henigman388f9912018-06-15 17:18:09 -0400171 'third_party/vulkan-headers/src/registry/vk.xml',
Luc Ferron0aa1ffe2018-02-08 13:42:36 -0500172 'src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json',
173 ],
174 'outputs': [
175 'src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp',
176 ],
177 'script': 'src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py',
178 },
Jamie Madilld47044a2018-04-27 11:45:03 -0400179 'Vulkan internal shader programs':
180 auto_script('src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py'),
Olli Etuaho5fec7ab2018-04-04 11:58:33 +0300181 'Emulated HLSL functions': {
182 'inputs': [
183 'src/compiler/translator/emulated_builtin_function_data_hlsl.json'
184 ],
185 'outputs': [
186 'src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp'
187 ],
188 'script': 'src/compiler/translator/gen_emulated_builtin_function_tables.py'
189 },
Olli Etuaho140152e2018-02-08 14:46:44 +0200190 'ESSL static builtins': {
191 'inputs': [
192 'src/compiler/translator/builtin_function_declarations.txt',
Olli Etuaho391bda22018-02-23 11:43:14 +0200193 'src/compiler/translator/builtin_variables.json',
Olli Etuaho140152e2018-02-08 14:46:44 +0200194 ],
195 'outputs': [
Olli Etuahoc26214d2018-03-16 10:43:11 +0200196 'src/compiler/translator/tree_util/BuiltIn_autogen.h',
Olli Etuaho89398b62018-03-21 17:30:50 +0200197 'src/compiler/translator/builtin_symbols_hash_autogen.txt',
Olli Etuaho2bfe9f62018-03-02 16:53:29 +0200198 'src/compiler/translator/ParseContext_autogen.h',
Olli Etuaho140152e2018-02-08 14:46:44 +0200199 'src/compiler/translator/SymbolTable_autogen.cpp',
Olli Etuahob391ec42018-03-12 17:04:59 +0200200 'src/compiler/translator/SymbolTable_autogen.h',
Olli Etuaho7618eaf2018-03-07 11:25:40 +0200201 'src/tests/compiler_tests/ImmutableString_test_autogen.cpp',
Olli Etuaho140152e2018-02-08 14:46:44 +0200202 ],
203 'script': 'src/compiler/translator/gen_builtin_symbols.py',
204 },
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400205}
206
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400207any_dirty = False
208
209for name, info in sorted(generators.iteritems()):
210
211 # Set the CWD to the root ANGLE directory.
212 os.chdir(root_dir)
213
214 script = info['script']
215 dirty = False
216
217 for finput in info['inputs'] + [script]:
218 input_mtime = os.path.getmtime(finput)
219 for foutput in info['outputs']:
220 if not os.path.exists(foutput):
Jamie Madill5ad52992017-11-14 12:43:40 -0500221 print('Output ' + foutput + ' not found for ' + name + ' table')
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400222 dirty = True
223 else:
224 output_mtime = os.path.getmtime(foutput)
Jamie Madill0ade8e82018-04-27 11:45:02 -0400225 # Use a fuzzy comparison to avoid tiny time delta errors.
226 if input_mtime - output_mtime > 0.1:
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400227 dirty = True
228
229 if dirty:
230 any_dirty = True
231
232 # Set the CWD to the script directory.
233 os.chdir(os.path.dirname(os.path.abspath(script)))
234
235 print('Running ' + name + ' code generator')
236 if subprocess.call(['python', os.path.basename(script)]) != 0:
237 sys.exit(1)
238
239if any_dirty:
240 args = []
241 if os.name == 'nt':
242 args += ['git.bat']
243 else:
244 args += ['git']
Jamie Madill1c597ee2018-05-24 14:19:31 -0400245 # The diff can be so large the arguments to clang-format can break the Windows command
246 # line length limits. Work around this by calling git cl format with --full.
247 args += ['cl', 'format', '--full']
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400248 print('Calling git cl format')
Frank Henigmandda048c2018-01-11 20:09:09 -0500249 subprocess.call(args)