Frank Henigman | dda048c | 2018-01-11 20:09:09 -0500 | [diff] [blame] | 1 | #!/usr/bin/python2 |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 2 | # |
| 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 Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 10 | import hashlib |
| 11 | import json |
| 12 | import os |
| 13 | import subprocess |
| 14 | import sys |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 15 | |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 16 | script_dir = os.path.abspath(os.path.dirname(os.path.abspath(__file__))) |
| 17 | root_dir = os.path.abspath(os.path.join(script_dir, '..')) |
Jamie Madill | d47044a | 2018-04-27 11:45:03 -0400 | [diff] [blame] | 18 | |
| 19 | # auto_script is a standard way for scripts to return their inputs and outputs. |
| 20 | |
Geoff Lang | 5695a5b | 2018-07-05 14:29:30 -0400 | [diff] [blame] | 21 | def get_child_script_dirname(script): |
| 22 | # All script names are relative to ANGLE's root |
| 23 | return os.path.dirname(os.path.abspath(os.path.join(root_dir, script))) |
| 24 | |
Geoff Lang | 9a25780 | 2018-07-05 14:31:08 -0400 | [diff] [blame] | 25 | # Replace all backslashes with forward slashes to be platform independent |
| 26 | def clean_path_slashes(path): |
| 27 | return path.replace("\\", "/") |
| 28 | |
| 29 | # Takes a script input file name which is relative to the code generation script's directory and |
| 30 | # changes it to be relative to the angle root directory |
| 31 | def rebase_script_input_path(script_path, input_file_path): |
| 32 | return os.path.relpath(os.path.join(os.path.dirname(script_path), input_file_path), root_dir); |
| 33 | |
Jamie Madill | d47044a | 2018-04-27 11:45:03 -0400 | [diff] [blame] | 34 | def grab_from_script(script, param): |
| 35 | res = subprocess.check_output(['python', script, param]).strip() |
Geoff Lang | 9a25780 | 2018-07-05 14:31:08 -0400 | [diff] [blame] | 36 | return [clean_path_slashes(rebase_script_input_path(script, name)) for name in res.split(',')] |
Jamie Madill | d47044a | 2018-04-27 11:45:03 -0400 | [diff] [blame] | 37 | |
| 38 | def auto_script(script): |
| 39 | # Set the CWD to the script directory. |
Geoff Lang | 5695a5b | 2018-07-05 14:29:30 -0400 | [diff] [blame] | 40 | os.chdir(get_child_script_dirname(script)) |
Jamie Madill | d47044a | 2018-04-27 11:45:03 -0400 | [diff] [blame] | 41 | base_script = os.path.basename(script) |
| 42 | return { |
| 43 | 'script': script, |
| 44 | 'inputs': grab_from_script(base_script, 'inputs'), |
Jamie Madill | d47044a | 2018-04-27 11:45:03 -0400 | [diff] [blame] | 45 | } |
| 46 | |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 47 | hash_fname = "run_code_generation_hashes.json" |
| 48 | |
Jamie Madill | d47044a | 2018-04-27 11:45:03 -0400 | [diff] [blame] | 49 | # TODO(jmadill): Convert everyting to auto-script. |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 50 | generators = { |
| 51 | 'ANGLE format': { |
| 52 | 'inputs': [ |
| 53 | 'src/libANGLE/renderer/angle_format.py', |
| 54 | 'src/libANGLE/renderer/angle_format_data.json', |
| 55 | 'src/libANGLE/renderer/angle_format_map.json', |
| 56 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 57 | 'script': 'src/libANGLE/renderer/gen_angle_format_table.py', |
| 58 | }, |
Luc Ferron | 4ea3b45 | 2018-03-13 11:48:26 -0400 | [diff] [blame] | 59 | 'ANGLE load functions table': { |
| 60 | 'inputs': [ |
| 61 | 'src/libANGLE/renderer/load_functions_data.json', |
| 62 | ], |
Luc Ferron | 4ea3b45 | 2018-03-13 11:48:26 -0400 | [diff] [blame] | 63 | 'script': 'src/libANGLE/renderer/gen_load_functions_table.py', |
| 64 | }, |
Brandon Jones | b77884b | 2018-10-10 09:07:12 -0700 | [diff] [blame] | 65 | 'D3D11 blit shader selection': { |
| 66 | 'inputs': [], |
| 67 | 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py', |
| 68 | }, |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 69 | 'D3D11 format': { |
| 70 | 'inputs': [ |
| 71 | 'src/libANGLE/renderer/angle_format.py', |
| 72 | 'src/libANGLE/renderer/d3d/d3d11/texture_format_data.json', |
| 73 | 'src/libANGLE/renderer/d3d/d3d11/texture_format_map.json', |
| 74 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 75 | 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py', |
| 76 | }, |
| 77 | 'DXGI format': { |
| 78 | 'inputs': [ |
| 79 | 'src/libANGLE/renderer/angle_format.py', |
| 80 | 'src/libANGLE/renderer/angle_format_map.json', |
| 81 | 'src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json', |
jchen10 | 547edfe | 2018-09-25 21:17:56 +0800 | [diff] [blame] | 82 | 'src/libANGLE/renderer/gen_angle_format_table.py', |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 83 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 84 | 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py', |
| 85 | }, |
| 86 | 'DXGI format support': { |
| 87 | 'inputs': [ |
| 88 | 'src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json', |
| 89 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 90 | 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py', |
| 91 | }, |
| 92 | 'GL copy conversion table': { |
| 93 | 'inputs': [ |
| 94 | 'src/libANGLE/es3_copy_conversion_formats.json', |
| 95 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 96 | 'script': 'src/libANGLE/gen_copy_conversion_table.py', |
| 97 | }, |
| 98 | 'GL entry point': { |
| 99 | 'inputs': [ |
| 100 | 'scripts/entry_point_packed_gl_enums.json', |
| 101 | 'scripts/gl.xml', |
Jamie Madill | 8dc27f9 | 2018-11-29 11:45:44 -0500 | [diff] [blame^] | 102 | 'scripts/gl_angle_ext.xml', |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 103 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 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 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 111 | 'script': 'src/libANGLE/gen_format_map.py', |
| 112 | }, |
| 113 | 'uniform type': { |
| 114 | 'inputs': [], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 115 | 'script': 'src/common/gen_uniform_type_table.py', |
| 116 | }, |
| 117 | 'OpenGL dispatch table': { |
| 118 | 'inputs': [ |
| 119 | 'scripts/gl.xml', |
| 120 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 121 | 'script': 'src/libANGLE/renderer/gl/generate_gl_dispatch_table.py', |
| 122 | }, |
Geoff Lang | 8ceea81 | 2018-04-10 03:07:13 -0400 | [diff] [blame] | 123 | 'packed enum': { |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 124 | 'inputs': [ |
Jamie Madill | d4703d5 | 2018-05-24 17:31:43 -0400 | [diff] [blame] | 125 | 'src/common/packed_gl_enums.json', |
| 126 | 'src/common/packed_egl_enums.json', |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 127 | ], |
Jamie Madill | d4703d5 | 2018-05-24 17:31:43 -0400 | [diff] [blame] | 128 | 'script': 'src/common/gen_packed_gl_enums.py', |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 129 | }, |
Jamie Madill | 5ad5299 | 2017-11-14 12:43:40 -0500 | [diff] [blame] | 130 | 'proc table': { |
| 131 | 'inputs': [ |
| 132 | 'src/libGLESv2/proc_table_data.json', |
| 133 | ], |
Jamie Madill | 5ad5299 | 2017-11-14 12:43:40 -0500 | [diff] [blame] | 134 | 'script': 'src/libGLESv2/gen_proc_table.py', |
| 135 | }, |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 136 | 'Vulkan format': { |
| 137 | 'inputs': [ |
| 138 | 'src/libANGLE/renderer/angle_format.py', |
| 139 | 'src/libANGLE/renderer/angle_format_map.json', |
| 140 | 'src/libANGLE/renderer/vulkan/vk_format_map.json', |
| 141 | ], |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 142 | 'script': 'src/libANGLE/renderer/vulkan/gen_vk_format_table.py', |
| 143 | }, |
Luc Ferron | 0aa1ffe | 2018-02-08 13:42:36 -0500 | [diff] [blame] | 144 | 'Vulkan mandatory format support table': { |
| 145 | 'inputs': [ |
| 146 | 'src/libANGLE/renderer/angle_format.py', |
Frank Henigman | 388f991 | 2018-06-15 17:18:09 -0400 | [diff] [blame] | 147 | 'third_party/vulkan-headers/src/registry/vk.xml', |
Luc Ferron | 0aa1ffe | 2018-02-08 13:42:36 -0500 | [diff] [blame] | 148 | 'src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json', |
| 149 | ], |
Luc Ferron | 0aa1ffe | 2018-02-08 13:42:36 -0500 | [diff] [blame] | 150 | 'script': 'src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py', |
| 151 | }, |
Jamie Madill | d47044a | 2018-04-27 11:45:03 -0400 | [diff] [blame] | 152 | 'Vulkan internal shader programs': |
| 153 | auto_script('src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py'), |
Olli Etuaho | 5fec7ab | 2018-04-04 11:58:33 +0300 | [diff] [blame] | 154 | 'Emulated HLSL functions': { |
| 155 | 'inputs': [ |
| 156 | 'src/compiler/translator/emulated_builtin_function_data_hlsl.json' |
| 157 | ], |
Olli Etuaho | 5fec7ab | 2018-04-04 11:58:33 +0300 | [diff] [blame] | 158 | 'script': 'src/compiler/translator/gen_emulated_builtin_function_tables.py' |
| 159 | }, |
Olli Etuaho | 140152e | 2018-02-08 14:46:44 +0200 | [diff] [blame] | 160 | 'ESSL static builtins': { |
| 161 | 'inputs': [ |
| 162 | 'src/compiler/translator/builtin_function_declarations.txt', |
Olli Etuaho | 391bda2 | 2018-02-23 11:43:14 +0200 | [diff] [blame] | 163 | 'src/compiler/translator/builtin_variables.json', |
Olli Etuaho | 140152e | 2018-02-08 14:46:44 +0200 | [diff] [blame] | 164 | ], |
Olli Etuaho | 140152e | 2018-02-08 14:46:44 +0200 | [diff] [blame] | 165 | 'script': 'src/compiler/translator/gen_builtin_symbols.py', |
| 166 | }, |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 167 | } |
| 168 | |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 169 | def md5(fname): |
| 170 | hash_md5 = hashlib.md5() |
Frank Henigman | 569b9cb | 2018-07-07 21:44:35 -0400 | [diff] [blame] | 171 | with open(fname, "r") as f: |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 172 | for chunk in iter(lambda: f.read(4096), b""): |
| 173 | hash_md5.update(chunk) |
| 174 | return hash_md5.hexdigest() |
| 175 | |
| 176 | def any_input_dirty(name, inputs): |
Geoff Lang | b1cc789 | 2018-07-05 15:05:21 -0400 | [diff] [blame] | 177 | found_dirty_input = False |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 178 | for finput in inputs: |
| 179 | key = name + ":" + finput |
| 180 | new_hashes[key] = md5(finput) |
| 181 | if (not key in old_hashes) or (old_hashes[key] != new_hashes[key]): |
Geoff Lang | b1cc789 | 2018-07-05 15:05:21 -0400 | [diff] [blame] | 182 | found_dirty_input = True |
| 183 | return found_dirty_input |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 184 | |
| 185 | os.chdir(script_dir) |
| 186 | old_hashes = json.load(open(hash_fname)) |
| 187 | new_hashes = {} |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 188 | any_dirty = False |
| 189 | |
| 190 | for name, info in sorted(generators.iteritems()): |
| 191 | |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 192 | # Reset the CWD to the root ANGLE directory. |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 193 | os.chdir(root_dir) |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 194 | script = info['script'] |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 195 | |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 196 | if any_input_dirty(name, info['inputs'] + [script]): |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 197 | any_dirty = True |
| 198 | |
| 199 | # Set the CWD to the script directory. |
Geoff Lang | 5695a5b | 2018-07-05 14:29:30 -0400 | [diff] [blame] | 200 | os.chdir(get_child_script_dirname(script)) |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 201 | |
| 202 | print('Running ' + name + ' code generator') |
| 203 | if subprocess.call(['python', os.path.basename(script)]) != 0: |
| 204 | sys.exit(1) |
| 205 | |
| 206 | if any_dirty: |
| 207 | args = [] |
| 208 | if os.name == 'nt': |
| 209 | args += ['git.bat'] |
| 210 | else: |
| 211 | args += ['git'] |
Jamie Madill | 1c597ee | 2018-05-24 14:19:31 -0400 | [diff] [blame] | 212 | # The diff can be so large the arguments to clang-format can break the Windows command |
| 213 | # line length limits. Work around this by calling git cl format with --full. |
| 214 | args += ['cl', 'format', '--full'] |
Jamie Madill | a8b73ed | 2017-11-02 09:22:29 -0400 | [diff] [blame] | 215 | print('Calling git cl format') |
Frank Henigman | dda048c | 2018-01-11 20:09:09 -0500 | [diff] [blame] | 216 | subprocess.call(args) |
Jamie Madill | a72f400 | 2018-06-29 17:05:01 -0400 | [diff] [blame] | 217 | |
| 218 | os.chdir(script_dir) |
| 219 | json.dump(new_hashes, open(hash_fname, "w"), indent=2, sort_keys=True, |
| 220 | separators=(',', ':\n ')) |