#!/usr/bin/env python3
# Copyright 2018 The Chromium Authors
# 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 argparse
import os
import sys
import typing
_LICENSE = """// Copyright 2018 The Chromium Authors
// 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" +
"// //gpu/config/build_workaround_header.py\n" +
"// DO NOT EDIT!\n\n")
def merge_files_into_workarounds(files: typing.List[str]) -> typing.List[str]:
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: str, workarounds: typing.List[str]) -> None:
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():
parser = argparse.ArgumentParser(
description='Generate GPU workaround definitions')
parser.add_argument(
"--output-file",
default="gpu_driver_bug_workaround_autogen.h",
help="the name of the header file to write")
parser.add_argument(
'files',
nargs='+',
help='1 or more files to process')
args = parser.parse_args()
workarounds = merge_files_into_workarounds(args.files)
write_header(args.output_file, workarounds)
if __name__ == '__main__':
sys.exit(main())