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