1cb93a386Sopenharmony_ci#!/usr/bin/env python
2cb93a386Sopenharmony_ci# Copyright (c) 2018 The Chromium Authors. All rights reserved.
3cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
4cb93a386Sopenharmony_ci# found in the LICENSE file.
5cb93a386Sopenharmony_ci"""code generator for gpu workaround definitions"""
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_ciimport os
8cb93a386Sopenharmony_ciimport os.path
9cb93a386Sopenharmony_ciimport sys
10cb93a386Sopenharmony_cifrom optparse import OptionParser
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ci_LICENSE = """// Copyright 2018 The Chromium Authors. All rights reserved.
13cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
14cb93a386Sopenharmony_ci// found in the LICENSE file.
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_ci"""
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ci_DO_NOT_EDIT_WARNING = ("// This file is auto-generated from " +
19cb93a386Sopenharmony_ci                        os.path.basename(__file__) + "\n" +
20cb93a386Sopenharmony_ci                        "// DO NOT EDIT!\n\n")
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_cidef merge_files_into_workarounds(files):
23cb93a386Sopenharmony_ci  workarounds = set()
24cb93a386Sopenharmony_ci  for filename in files:
25cb93a386Sopenharmony_ci    with open(filename, 'r') as f:
26cb93a386Sopenharmony_ci      workarounds.update([workaround.strip() for workaround in f])
27cb93a386Sopenharmony_ci  return sorted(list(workarounds))
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_cidef write_header(filename, workarounds):
31cb93a386Sopenharmony_ci  max_workaround_len = len(max(workarounds, key=len))
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_ci  with open(filename, 'w') as f:
34cb93a386Sopenharmony_ci    f.write(_LICENSE)
35cb93a386Sopenharmony_ci    f.write(_DO_NOT_EDIT_WARNING)
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_ci    indent = '  '
38cb93a386Sopenharmony_ci    macro = 'GPU_OP'
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ci    # length of max string passed to write + 1
41cb93a386Sopenharmony_ci    max_len = len(indent) + len(macro) + 1 + max_workaround_len + 1 + 1
42cb93a386Sopenharmony_ci    write = lambda line: f.write(line + ' ' * (max_len - len(line)) + '\\\n')
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_ci    write('#define GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)')
45cb93a386Sopenharmony_ci    for w in workarounds:
46cb93a386Sopenharmony_ci      write(indent + macro + '(' + w.upper() + ',')
47cb93a386Sopenharmony_ci      write(indent + ' ' * (len(macro) + 1) + w + ')')
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    # one extra line to put 'The End' comment.
50cb93a386Sopenharmony_ci    f.write('// The End\n')
51cb93a386Sopenharmony_ci
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_cidef main(argv):
54cb93a386Sopenharmony_ci  usage = "usage: %prog [options] file1 file2 file3 etc"
55cb93a386Sopenharmony_ci  parser = OptionParser(usage=usage)
56cb93a386Sopenharmony_ci  parser.add_option(
57cb93a386Sopenharmony_ci      "--output-file",
58cb93a386Sopenharmony_ci      dest="output_file",
59cb93a386Sopenharmony_ci      default="gpu_driver_bug_workaround_autogen.h",
60cb93a386Sopenharmony_ci      help="the name of the header file to write")
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ci  (options, _) = parser.parse_args(args=argv)
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ci  workarounds = merge_files_into_workarounds(parser.largs)
65cb93a386Sopenharmony_ci  write_header(options.output_file, workarounds)
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ciif __name__ == '__main__':
69cb93a386Sopenharmony_ci  sys.exit(main(sys.argv[1:]))
70