Reland "Add stub gpu workaround generators"

This is a reland of 94d25b970b97c68ddd0b4ceb71f2233aac05e6b5

Original change's description:
> Add stub gpu workaround generators
> 
> Like https://chromium-review.googlesource.com/c/chromium/src/+/1005362,
> this patch adds a way for Chrome and Skia to share a set of driver
> workaround names so that they can be turned on by Chrome (or Skia) as
> needed.
> 
> To avoid weird cross-repository dependencies, the generator script is
> duplicated in Skia.
> 
> This patch just adds a few dummy workaround names to make sure the build
> process is working.  The followup to this is to add workaround init
> to GrContext/GrContextOptions and to start implementing individual
> workarounds.
> 
> Implementing these workarounds is to support Chrome's "out of process
> raster" which will use Ganesh without a command buffer, and so will not
> have the workarounds that the command buffer provides.
> 
> Bug: chromium:829614
> Change-Id: I40745a777a95805995991fedb81657ae418b52d9
> Reviewed-on: https://skia-review.googlesource.com/120608
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Commit-Queue: Adrienne Walker <enne@chromium.org>

Bug: chromium:829614
Change-Id: Idb3309ffa894f7585ee493388b56565e9d4a3101
Reviewed-on: https://skia-review.googlesource.com/122800
Auto-Submit: Adrienne Walker <enne@chromium.org>
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/tools/build_workaround_header.py b/tools/build_workaround_header.py
new file mode 100755
index 0000000..b855832
--- /dev/null
+++ b/tools/build_workaround_header.py
@@ -0,0 +1,69 @@
+#!/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:]))