| #!/usr/bin/env python |
| # Copyright (c) 2018 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """code generator for gpu workaround definitions""" |
| |
| import os |
| import os.path |
| import sys |
| from optparse import OptionParser |
| |
| _LICENSE = """// Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| """ |
| |
| _DO_NOT_EDIT_WARNING = ("// This file is auto-generated from\n" + |
| "// " + __file__ + "\n" + |
| "// DO NOT EDIT!\n\n") |
| |
| def merge_files_into_workarounds(files): |
| workarounds = set() |
| for filename in files: |
| with open(filename, 'r') as f: |
| workarounds.update([workaround.strip() for workaround in f]) |
| return sorted(list(workarounds)) |
| |
| |
| def write_header(filename, workarounds): |
| max_workaround_len = len(max(workarounds, key=len)) |
| |
| with open(filename, 'w') as f: |
| f.write(_LICENSE) |
| f.write(_DO_NOT_EDIT_WARNING) |
| |
| indent = ' ' |
| macro = 'GPU_OP' |
| |
| # length of max string passed to write + 1 |
| max_len = len(indent) + len(macro) + 1 + max_workaround_len + 1 + 1 |
| write = lambda line: f.write(line + ' ' * (max_len - len(line)) + '\\\n') |
| |
| write('#define GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)') |
| for w in workarounds: |
| write(indent + macro + '(' + w.upper() + ',') |
| write(indent + ' ' * (len(macro) + 1) + w + ')') |
| |
| # one extra line to consume the the last \ |
| f.write('// The End\n') |
| |
| |
| def main(argv): |
| usage = "usage: %prog [options] file1 file2 file3 etc" |
| parser = OptionParser(usage=usage) |
| parser.add_option( |
| "--output-file", |
| dest="output_file", |
| default="gpu_driver_bug_workaround_autogen.h", |
| help="the name of the header file to write") |
| |
| (options, _) = parser.parse_args(args=argv) |
| |
| workarounds = merge_files_into_workarounds(parser.largs) |
| write_header(options.output_file, workarounds) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |