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