blob: 041e84c89b72cb4380d9574a256342a1594e6f41 [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
Jamie Madilla72f4002018-06-29 17:05:01 -040010import hashlib
11import json
12import os
13import subprocess
14import sys
Jamie Madilla8b73ed2017-11-02 09:22:29 -040015
Jamie Madilla72f4002018-06-29 17:05:01 -040016script_dir = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
17root_dir = os.path.abspath(os.path.join(script_dir, '..'))
Jamie Madilld47044a2018-04-27 11:45:03 -040018
19# auto_script is a standard way for scripts to return their inputs and outputs.
20
21def grab_from_script(script, param):
22 res = subprocess.check_output(['python', script, param]).strip()
23 return [os.path.abspath(os.path.join(os.path.dirname(script), name)) for name in res.split(',')]
24
25def auto_script(script):
26 # Set the CWD to the script directory.
27 os.chdir(os.path.dirname(os.path.abspath(script)))
28 base_script = os.path.basename(script)
29 return {
30 'script': script,
31 'inputs': grab_from_script(base_script, 'inputs'),
Jamie Madilld47044a2018-04-27 11:45:03 -040032 }
33
Jamie Madilla72f4002018-06-29 17:05:01 -040034hash_fname = "run_code_generation_hashes.json"
35
Jamie Madilld47044a2018-04-27 11:45:03 -040036# TODO(jmadill): Convert everyting to auto-script.
Jamie Madilla8b73ed2017-11-02 09:22:29 -040037generators = {
38 'ANGLE format': {
39 'inputs': [
40 'src/libANGLE/renderer/angle_format.py',
41 'src/libANGLE/renderer/angle_format_data.json',
42 'src/libANGLE/renderer/angle_format_map.json',
43 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040044 'script': 'src/libANGLE/renderer/gen_angle_format_table.py',
45 },
Luc Ferron4ea3b452018-03-13 11:48:26 -040046 'ANGLE load functions table': {
47 'inputs': [
48 'src/libANGLE/renderer/load_functions_data.json',
49 ],
Luc Ferron4ea3b452018-03-13 11:48:26 -040050 'script': 'src/libANGLE/renderer/gen_load_functions_table.py',
51 },
Jamie Madilla8b73ed2017-11-02 09:22:29 -040052 'D3D11 format': {
53 'inputs': [
54 'src/libANGLE/renderer/angle_format.py',
55 'src/libANGLE/renderer/d3d/d3d11/texture_format_data.json',
56 'src/libANGLE/renderer/d3d/d3d11/texture_format_map.json',
57 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040058 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py',
59 },
60 'DXGI format': {
61 'inputs': [
62 'src/libANGLE/renderer/angle_format.py',
63 'src/libANGLE/renderer/angle_format_map.json',
64 'src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json',
65 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040066 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py',
67 },
68 'DXGI format support': {
69 'inputs': [
70 'src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json',
71 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040072 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py',
73 },
74 'GL copy conversion table': {
75 'inputs': [
76 'src/libANGLE/es3_copy_conversion_formats.json',
77 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040078 'script': 'src/libANGLE/gen_copy_conversion_table.py',
79 },
80 'GL entry point': {
81 'inputs': [
82 'scripts/entry_point_packed_gl_enums.json',
83 'scripts/gl.xml',
84 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040085 'script': 'scripts/generate_entry_points.py',
86 },
87 'GL format map': {
88 'inputs': [
89 'src/libANGLE/es3_format_type_combinations.json',
90 'src/libANGLE/format_map_data.json',
91 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040092 'script': 'src/libANGLE/gen_format_map.py',
93 },
94 'uniform type': {
95 'inputs': [],
Jamie Madilla8b73ed2017-11-02 09:22:29 -040096 'script': 'src/common/gen_uniform_type_table.py',
97 },
98 'OpenGL dispatch table': {
99 'inputs': [
100 'scripts/gl.xml',
101 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400102 'script': 'src/libANGLE/renderer/gl/generate_gl_dispatch_table.py',
103 },
Geoff Lang8ceea812018-04-10 03:07:13 -0400104 'packed enum': {
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400105 'inputs': [
Jamie Madilld4703d52018-05-24 17:31:43 -0400106 'src/common/packed_gl_enums.json',
107 'src/common/packed_egl_enums.json',
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400108 ],
Jamie Madilld4703d52018-05-24 17:31:43 -0400109 'script': 'src/common/gen_packed_gl_enums.py',
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400110 },
Jamie Madill5ad52992017-11-14 12:43:40 -0500111 'proc table': {
112 'inputs': [
113 'src/libGLESv2/proc_table_data.json',
114 ],
Jamie Madill5ad52992017-11-14 12:43:40 -0500115 'script': 'src/libGLESv2/gen_proc_table.py',
116 },
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400117 'Vulkan format': {
118 'inputs': [
119 'src/libANGLE/renderer/angle_format.py',
120 'src/libANGLE/renderer/angle_format_map.json',
121 'src/libANGLE/renderer/vulkan/vk_format_map.json',
122 ],
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400123 'script': 'src/libANGLE/renderer/vulkan/gen_vk_format_table.py',
124 },
Luc Ferron0aa1ffe2018-02-08 13:42:36 -0500125 'Vulkan mandatory format support table': {
126 'inputs': [
127 'src/libANGLE/renderer/angle_format.py',
Frank Henigman388f9912018-06-15 17:18:09 -0400128 'third_party/vulkan-headers/src/registry/vk.xml',
Luc Ferron0aa1ffe2018-02-08 13:42:36 -0500129 'src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json',
130 ],
Luc Ferron0aa1ffe2018-02-08 13:42:36 -0500131 'script': 'src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py',
132 },
Jamie Madilld47044a2018-04-27 11:45:03 -0400133 'Vulkan internal shader programs':
134 auto_script('src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py'),
Olli Etuaho5fec7ab2018-04-04 11:58:33 +0300135 'Emulated HLSL functions': {
136 'inputs': [
137 'src/compiler/translator/emulated_builtin_function_data_hlsl.json'
138 ],
Olli Etuaho5fec7ab2018-04-04 11:58:33 +0300139 'script': 'src/compiler/translator/gen_emulated_builtin_function_tables.py'
140 },
Olli Etuaho140152e2018-02-08 14:46:44 +0200141 'ESSL static builtins': {
142 'inputs': [
143 'src/compiler/translator/builtin_function_declarations.txt',
Olli Etuaho391bda22018-02-23 11:43:14 +0200144 'src/compiler/translator/builtin_variables.json',
Olli Etuaho140152e2018-02-08 14:46:44 +0200145 ],
Olli Etuaho140152e2018-02-08 14:46:44 +0200146 'script': 'src/compiler/translator/gen_builtin_symbols.py',
147 },
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400148}
149
Jamie Madilla72f4002018-06-29 17:05:01 -0400150def md5(fname):
151 hash_md5 = hashlib.md5()
152 with open(fname, "rb") as f:
153 for chunk in iter(lambda: f.read(4096), b""):
154 hash_md5.update(chunk)
155 return hash_md5.hexdigest()
156
157def any_input_dirty(name, inputs):
158 for finput in inputs:
159 key = name + ":" + finput
160 new_hashes[key] = md5(finput)
161 if (not key in old_hashes) or (old_hashes[key] != new_hashes[key]):
162 return True
163 return False
164
165os.chdir(script_dir)
166old_hashes = json.load(open(hash_fname))
167new_hashes = {}
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400168any_dirty = False
169
170for name, info in sorted(generators.iteritems()):
171
Jamie Madilla72f4002018-06-29 17:05:01 -0400172 # Reset the CWD to the root ANGLE directory.
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400173 os.chdir(root_dir)
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400174 script = info['script']
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400175
Jamie Madilla72f4002018-06-29 17:05:01 -0400176 if any_input_dirty(name, info['inputs'] + [script]):
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400177 any_dirty = True
178
179 # Set the CWD to the script directory.
180 os.chdir(os.path.dirname(os.path.abspath(script)))
181
182 print('Running ' + name + ' code generator')
183 if subprocess.call(['python', os.path.basename(script)]) != 0:
184 sys.exit(1)
185
186if any_dirty:
187 args = []
188 if os.name == 'nt':
189 args += ['git.bat']
190 else:
191 args += ['git']
Jamie Madill1c597ee2018-05-24 14:19:31 -0400192 # The diff can be so large the arguments to clang-format can break the Windows command
193 # line length limits. Work around this by calling git cl format with --full.
194 args += ['cl', 'format', '--full']
Jamie Madilla8b73ed2017-11-02 09:22:29 -0400195 print('Calling git cl format')
Frank Henigmandda048c2018-01-11 20:09:09 -0500196 subprocess.call(args)
Jamie Madilla72f4002018-06-29 17:05:01 -0400197
198 os.chdir(script_dir)
199 json.dump(new_hashes, open(hash_fname, "w"), indent=2, sort_keys=True,
200 separators=(',', ':\n '))