Index: gpu/config/process_json.py |
diff --git a/gpu/config/process_json.py b/gpu/config/process_json.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..d34c5048170bb0ef60aec2bbf8fffbff276624ec |
--- /dev/null |
+++ b/gpu/config/process_json.py |
@@ -0,0 +1,757 @@ |
+#!/usr/bin/env python |
+# Copyright 2017 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. |
+ |
+import json |
+import os |
+import platform |
+import sys |
+from subprocess import call |
+ |
+"""Generate data struct from GPU blacklist and driver bug workarounds json.""" |
+ |
+_LICENSE = """// Copyright 2017 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 |
+// gpu/config/process_json.py |
+// It's formatted by clang-format using chromium coding style: |
+// clang-format -i -style=chromium filename |
+// DO NOT EDIT! |
+ |
+""" |
+ |
+ |
+def load_software_rendering_list_features(feature_type_filename): |
+ header_file = open(feature_type_filename, 'rb') |
+ start = False |
+ features = [] |
+ for line in header_file: |
+ if line.startswith('enum GpuFeatureType {'): |
+ assert not start |
+ start = True |
+ continue |
+ if not start: |
+ continue |
+ line = line.strip() |
+ line = line.split(' ', 1)[0] |
+ line = line.split(',', 1)[0] |
+ if line.startswith('NUMBER_OF_GPU_FEATURE_TYPES'): |
+ assert start |
+ start = False |
+ break |
+ elif line.startswith('GPU_FEATURE_TYPE_'): |
+ name = line[len('GPU_FEATURE_TYPE_'):] |
+ features.append(name.lower()) |
+ else: |
+ assert False |
+ assert not start |
+ assert len(features) > 0 |
+ header_file.close() |
+ return features |
+ |
+ |
+def load_gpu_driver_bug_workarounds(workaround_type_filename): |
+ header_file = open(workaround_type_filename, 'rb') |
+ start = False |
+ workaround = None |
+ workarounds = [] |
+ for line in header_file: |
+ if line.startswith('#define GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)'): |
+ assert not start |
+ start = True |
+ continue |
+ if not start: |
+ continue |
+ line = line.strip() |
+ if line.startswith('GPU_OP('): |
+ assert not workaround |
+ workaround = line[len('GPU_OP('):] |
+ workaround = workaround.split(',', 1)[0].lower() |
+ continue |
+ if workaround: |
+ line = line.split(')', 1)[0] |
+ assert line == workaround |
+ workarounds.append(line) |
+ workaround = None |
+ continue |
+ start = False |
+ break |
+ assert not start |
+ assert len(workarounds) > 0 |
+ header_file.close() |
+ return workarounds |
+ |
+ |
+def get_feature_set(features, total_feature_set): |
+ assert len(features) > 0 |
+ feature_set = set([]) |
+ for feature in features: |
+ if feature == 'all': |
+ feature_set = set(total_feature_set) |
+ elif isinstance(feature, dict): |
+ for key in feature: |
+ if key == 'exceptions': |
+ for exception in feature['exceptions']: |
+ assert exception in feature_set |
+ feature_set.remove(exception) |
+ else: |
+ raise KeyException('only exceptions are allowed') |
+ else: |
+ assert feature in total_feature_set |
+ feature_set.add(feature) |
+ return feature_set |
+ |
+ |
+def write_features(entry_id, feature_set, feature_name_prefix, |
+ data_helper_file): |
+ data_helper_file.write('const int kFeatureListForEntry%d[%d] = {\n' % |
+ (entry_id, len(feature_set))) |
+ for feature in feature_set: |
+ data_helper_file.write(feature_name_prefix + feature.upper()) |
+ data_helper_file.write(',\n') |
+ data_helper_file.write('};\n\n') |
+ |
+ |
+def write_disabled_extension_list(entry_id, data, data_file, data_helper_file): |
+ if data: |
+ var_name = 'kDisabledExtensionsForEntry' + str(entry_id) |
+ # define the list |
+ data_helper_file.write('const char* %s[%d] = {\n' % (var_name, len(data))) |
+ for item in data: |
+ write_string(item, data_helper_file) |
+ data_helper_file.write(',\n') |
+ data_helper_file.write('};\n\n') |
+ # use the list |
+ data_file.write('arraysize(%s), // DisabledExtensions size\n' % var_name) |
+ data_file.write('%s, // DisabledExtensions\n' % var_name) |
+ else: |
+ data_file.write('0, // DisabledExtensions size\n') |
+ data_file.write('nullptr, // DisabledExtensions\n') |
+ |
+ |
+def write_gl_strings(entry_id, is_exception, exception_id, data, |
+ data_file, data_helper_file): |
+ if data: |
+ var_name = 'kGLStringsForEntry' + str(entry_id) |
+ if is_exception: |
+ var_name += 'Exception' + str(exception_id) |
+ # define the GL strings |
+ data_helper_file.write('const GpuControlList::GLStrings %s = {\n' % |
+ var_name) |
+ for item in data: |
+ write_string(item, data_helper_file) |
+ data_helper_file.write(',\n') |
+ data_helper_file.write('};\n\n') |
+ # reference the GL strings |
+ data_file.write('&%s, // GL strings\n' % var_name) |
+ else: |
+ data_file.write('nullptr, // GL strings\n') |
+ |
+ |
+def write_version(version_info, name_tag, data_file): |
+ op = '' |
+ style = '' |
+ version1 = '' |
+ version2 = '' |
+ if version_info: |
+ op = version_info['op'] |
+ if 'style' in version_info: |
+ style = version_info['style'] |
+ version1 = version_info['value'] |
+ if 'value2' in version_info: |
+ version2 = version_info['value2'] |
+ data_file.write('{') |
+ op_map = { |
+ '=': 'kEQ', |
+ '<': 'kLT', |
+ '<=': 'kLE', |
+ '>': 'kGT', |
+ '>=': 'kGE', |
+ 'any': 'kAny', |
+ 'between': 'kBetween', |
+ '': 'kUnknown', |
+ } |
+ assert op_map.has_key(op) |
+ data_file.write('GpuControlList::%s, ' % op_map[op]) |
+ style_map = { |
+ 'lexical': 'Lexical', |
+ 'numerical': 'Numerical', |
+ '': 'Numerical', |
+ } |
+ assert style_map.has_key(style) |
+ data_file.write('GpuControlList::kVersionStyle%s, ' % style_map[style]) |
+ write_string(version1, data_file) |
+ data_file.write(', ') |
+ write_string(version2, data_file) |
+ data_file.write('}, // %s\n' % name_tag) |
+ |
+ |
+def write_driver_info(entry_id, is_exception, exception_id, driver_vendor, |
+ driver_version, driver_date, data_file, data_helper_file): |
+ var_name = 'kDriverInfoForEntry' + str(entry_id) |
+ if is_exception: |
+ var_name += 'Exception' + str(exception_id) |
+ # define the GL strings |
+ data_helper_file.write('const GpuControlList::DriverInfo %s = {\n' % |
+ var_name) |
+ write_string_value(driver_vendor, 'driver_vendor', data_helper_file) |
+ write_version(driver_version, 'driver_version', data_helper_file) |
+ write_version(driver_date, 'driver_date', data_helper_file) |
+ data_helper_file.write('};\n\n') |
+ # reference the GL strings |
+ data_file.write('&%s, // driver info\n' % var_name) |
+ |
+ |
+def write_number_list(entry_id, data_type, name_tag, data, is_exception, |
+ exception_id, data_file, data_helper_file): |
+ if data: |
+ var_name = 'k' + name_tag + 'ForEntry' + str(entry_id) |
+ if is_exception: |
+ var_name += 'Exception' + str(exception_id) |
+ # define the list |
+ data_helper_file.write('const %s %s[%d] = {\n' % |
+ (data_type, var_name, len(data))) |
+ for item in data: |
+ data_helper_file.write(str(item)) |
+ data_helper_file.write(',\n') |
+ data_helper_file.write('};\n\n') |
+ # reference the list |
+ data_file.write('arraysize(%s), // %s size\n' % (var_name, name_tag)) |
+ data_file.write('%s, // %s\n' % (var_name, name_tag)) |
+ else: |
+ data_file.write('0, // %s size\n' % name_tag) |
+ data_file.write('nullptr, // %s\n' % name_tag) |
+ |
+ |
+def write_string(string, data_file): |
+ if string == '': |
+ data_file.write('nullptr') |
+ else: |
+ data_file.write('"%s"' % string.replace('\\', '\\\\')) |
+ |
+ |
+def write_string_value(string, name_tag, data_file): |
+ write_string(string, data_file) |
+ data_file.write(', // %s\n' % name_tag) |
+ |
+ |
+def write_boolean_value(value, name_tag, data_file): |
+ data_file.write('%s, // %s\n' % (str(value).lower(), name_tag)) |
+ |
+ |
+def write_machine_model_info(entry_id, is_exception, exception_id, |
+ machine_model_name, machine_model_version, |
+ data_file, data_helper_file): |
+ model_name_var_name = None |
+ if machine_model_name: |
+ model_name_var_name = 'kMachineModelNameForEntry' + str(entry_id) |
+ if is_exception: |
+ model_name_var_name += 'Exception' + str(exception_id) |
+ data_helper_file.write('const char* %s[%d] = {\n' % |
+ (model_name_var_name, len(machine_model_name))) |
+ for item in machine_model_name: |
+ write_string(item, data_helper_file) |
+ data_helper_file.write(',\n') |
+ data_helper_file.write('};\n\n') |
+ var_name = None |
+ if machine_model_name or machine_model_version: |
+ var_name = 'kMachineModelInfoForEntry' + str(entry_id) |
+ if is_exception: |
+ var_name += 'Exception' + str(exception_id) |
+ # define machine model info |
+ data_helper_file.write( |
+ 'const GpuControlList::MachineModelInfo %s = {\n' % var_name) |
+ if machine_model_name: |
+ data_helper_file.write('arraysize(%s), // machine model name size\n' % |
+ model_name_var_name) |
+ data_helper_file.write('%s, // machine model names\n' % |
+ model_name_var_name) |
+ else: |
+ data_helper_file.write('0, // machine model name size\n') |
+ data_helper_file.write('nullptr, // machine model names\n') |
+ write_version(machine_model_version, 'machine model version', |
+ data_helper_file) |
+ data_helper_file.write('};\n\n') |
+ # reference the machine model info |
+ data_file.write('&%s, // machine model info\n' % var_name) |
+ else: |
+ data_file.write('nullptr, // machine model info\n') |
+ |
+ |
+def write_os_type(os_type, data_file): |
+ map = { |
+ 'win': 'kOsWin', |
+ 'macosx': 'kOsMacosx', |
+ 'android': 'kOsAndroid', |
+ 'linux': 'kOsLinux', |
+ 'chromeos': 'kOsChromeOS', |
+ '': 'kOsAny', |
+ } |
+ assert map.has_key(os_type) |
+ data_file.write('GpuControlList::%s, // os_type\n' % map[os_type]) |
+ |
+ |
+def write_multi_gpu_category(multi_gpu_category, data_file): |
+ map = { |
+ 'primary': 'Primary', |
+ 'secondary': 'Secondary', |
+ 'active': 'Active', |
+ 'any': 'Any', |
+ '': 'None', |
+ } |
+ assert map.has_key(multi_gpu_category) |
+ data_file.write( |
+ 'GpuControlList::kMultiGpuCategory%s, // multi_gpu_category\n' % |
+ map[multi_gpu_category]) |
+ |
+ |
+def write_multi_gpu_style(multi_gpu_style, data_file): |
+ map = { |
+ 'optimus': 'Optimus', |
+ 'amd_switchable': 'AMDSwitchable', |
+ 'amd_switchable_discrete': 'AMDSwitchableDiscrete', |
+ 'amd_switchable_integrated': 'AMDSwitchableIntegrated', |
+ '': 'None', |
+ } |
+ assert map.has_key(multi_gpu_style) |
+ data_file.write( |
+ 'GpuControlList::kMultiGpuStyle%s, // multi_gpu_style\n' % |
+ map[multi_gpu_style]) |
+ |
+ |
+def write_gl_type(gl_type, data_file): |
+ map = { |
+ 'gl': 'GL', |
+ 'gles': 'GLES', |
+ 'angle': 'ANGLE', |
+ '': 'None', |
+ } |
+ assert map.has_key(gl_type) |
+ data_file.write('GpuControlList::kGLType%s, // gl_type\n' % map[gl_type]) |
+ |
+ |
+def write_conditions(entry_id, is_exception, exception_id, entry, |
+ data_file, data_helper_file, data_exception_file): |
+ os_type = '' |
+ os_version = None |
+ vendor_id = 0 |
+ device_id = None |
+ multi_gpu_category = '' |
+ multi_gpu_style = '' |
+ driver_vendor = '' |
+ driver_version = None |
+ driver_date = None |
+ gl_renderer = '' |
+ gl_vendor = '' |
+ gl_extensions = '' |
+ gl_version_string = '' |
+ gl_type = '' |
+ gl_version = None |
+ pixel_shader_version = None |
+ in_process_gpu = False |
+ gl_reset_notification_strategy = None |
+ direct_rendering = True |
+ gpu_count = None |
+ machine_model_name = None |
+ machine_model_version = None |
+ exception_count = 0 |
+ exception_var = 'nullptr' |
+ # process the entry |
+ for key in entry: |
+ if key == 'id': |
+ assert not is_exception |
+ assert entry['id'] == entry_id |
+ continue |
+ elif key == 'description': |
+ assert not is_exception |
+ continue |
+ elif key == 'features': |
+ assert not is_exception |
+ continue |
+ elif key == 'disabled_extensions': |
+ assert not is_exception |
+ continue |
+ elif key == 'comment': |
+ continue |
+ elif key == 'webkit_bugs': |
+ assert not is_exception |
+ continue |
+ elif key == 'cr_bugs': |
+ assert not is_exception |
+ continue |
+ elif key == 'os': |
+ os_info = entry[key] |
+ os_type = os_info['type'] |
+ if 'version' in os_info: |
+ os_version = os_info['version'] |
+ elif key == 'vendor_id': |
+ vendor_id = int(entry[key], 0) |
+ elif key == 'device_id': |
+ device_id = entry[key] |
+ elif key == 'multi_gpu_category': |
+ multi_gpu_category = entry[key] |
+ elif key == 'multi_gpu_style': |
+ multi_gpu_style = entry[key] |
+ elif key == 'driver_vendor': |
+ driver_vendor = entry[key] |
+ elif key == 'driver_version': |
+ driver_version = entry[key] |
+ elif key == 'driver_date': |
+ driver_date = entry[key] |
+ elif key == 'gl_vendor': |
+ gl_vendor = entry[key] |
+ elif key == 'gl_renderer': |
+ gl_renderer = entry[key] |
+ elif key == 'gl_version_string': |
+ gl_version_string = entry[key] |
+ elif key == 'gl_type': |
+ gl_type = entry[key] |
+ elif key == 'gl_version': |
+ gl_version = entry[key] |
+ elif key == 'gl_extensions': |
+ gl_extensions = entry[key] |
+ elif key == 'pixel_shader_version': |
+ pixel_shader_version = entry[key] |
+ elif key == 'in_process_gpu': |
+ assert entry[key] |
+ in_process_gpu = True |
+ elif key == 'gl_reset_notification_strategy': |
+ gl_reset_notification_strategy = entry[key] |
+ elif key == 'direct_rendering': |
+ assert not entry[key] |
+ direct_rendering = False |
+ elif key == 'gpu_count': |
+ gpu_count = entry[key] |
+ elif key == 'machine_model_name': |
+ machine_model_name = entry[key] |
+ elif key == 'machine_model_version': |
+ machine_model_version = entry[key] |
+ elif key == 'exceptions': |
+ assert not is_exception |
+ assert exception_count == 0 |
+ else: |
+ raise ValueError('unknown key: ' + key + ' in entry ' + str(entry)) |
+ # write out the entry |
+ write_os_type(os_type, data_file) |
+ write_version(os_version, 'os_version', data_file) |
+ data_file.write(format(vendor_id, '#04x')) |
+ data_file.write(', // vendor_id\n') |
+ write_number_list(entry_id, 'uint32_t', 'DeviceIDs', device_id, is_exception, |
+ exception_id, data_file, data_helper_file) |
+ write_multi_gpu_category(multi_gpu_category, data_file) |
+ write_multi_gpu_style(multi_gpu_style, data_file) |
+ # group driver info |
+ if driver_vendor != '' or driver_version != None or driver_date != None: |
+ write_driver_info(entry_id, is_exception, exception_id, driver_vendor, |
+ driver_version, driver_date, data_file, data_helper_file) |
+ else: |
+ data_file.write('nullptr, // driver info\n') |
+ # group GL strings |
+ gl_strings = None |
+ if (gl_vendor != '' or gl_renderer != '' or gl_extensions != '' or |
+ gl_version_string != ''): |
+ gl_strings = [gl_vendor, gl_renderer, gl_extensions, gl_version_string] |
+ write_gl_strings(entry_id, is_exception, exception_id, gl_strings, |
+ data_file, data_helper_file) |
+ # group machine model info |
+ write_machine_model_info(entry_id, is_exception, exception_id, |
+ machine_model_name, machine_model_version, |
+ data_file, data_helper_file) |
+ # group a bunch of less used conditions |
+ if (gl_version != None or pixel_shader_version != None or in_process_gpu or |
+ gl_reset_notification_strategy != None or (not direct_rendering) or |
+ gpu_count != None): |
+ write_entry_more_data(entry_id, is_exception, exception_id, gl_type, |
+ gl_version, pixel_shader_version, in_process_gpu, |
+ gl_reset_notification_strategy, direct_rendering, |
+ gpu_count, data_file, data_helper_file) |
+ else: |
+ data_file.write('nullptr, // more conditions\n') |
+ |
+ |
+def write_entry_more_data(entry_id, is_exception, exception_id, gl_type, |
+ gl_version, pixel_shader_version, in_process_gpu, |
+ gl_reset_notification_strategy, direct_rendering, |
+ gpu_count, data_file, data_helper_file): |
+ # write more data |
+ var_name = 'kMoreForEntry' + str(entry_id) |
+ if is_exception: |
+ var_name += 'Exception' + str(exception_id) |
+ data_helper_file.write('const GpuControlList::More %s = {\n' % var_name) |
+ write_gl_type(gl_type, data_helper_file) |
+ write_version(gl_version, 'gl_version', data_helper_file) |
+ write_version(pixel_shader_version, 'pixel_shader_version', data_helper_file) |
+ write_boolean_value(in_process_gpu, 'in_process_gpu', data_helper_file) |
+ if not gl_reset_notification_strategy: |
+ gl_reset_notification_strategy = '0' |
+ data_helper_file.write('%s, // gl_reset_notification_strategy\n' % |
+ gl_reset_notification_strategy) |
+ write_boolean_value(direct_rendering, 'direct_rendering', data_helper_file) |
+ write_version(gpu_count, 'gpu_count', data_helper_file) |
+ data_helper_file.write('};\n\n') |
+ # reference more data in entry |
+ data_file.write('&%s, // more data\n' % var_name) |
+ |
+ |
+def write_entry(entry, total_feature_set, feature_name_prefix, |
+ data_file, data_helper_file, data_exception_file): |
+ data_file.write('{\n') |
+ # ID |
+ entry_id = entry['id'] |
+ data_file.write('%d, // id\n' % entry_id) |
+ data_file.write('"%s",\n' % entry['description']); |
+ # Features |
+ if 'features' in entry: |
+ features = entry['features'] |
+ feature_set = get_feature_set(features, total_feature_set) |
+ data_file.write('arraysize(kFeatureListForEntry%d), // features size\n' % |
+ entry_id) |
+ data_file.write('kFeatureListForEntry%d, // features\n' % entry_id) |
+ write_features(entry_id, feature_set, feature_name_prefix, data_helper_file) |
+ else: |
+ data_file.write('0, // feature size\n') |
+ data_file.write('nullptr, // features\n') |
+ # Disabled extensions |
+ disabled_extensions = None |
+ if 'disabled_extensions' in entry: |
+ disabled_extensions = entry['disabled_extensions'] |
+ write_disabled_extension_list(entry_id, disabled_extensions, |
+ data_file, data_helper_file) |
+ # webkit_bugs are skipped because there is only one entry that has it. |
+ # cr_bugs |
+ cr_bugs = None |
+ if 'cr_bugs' in entry: |
+ cr_bugs = entry['cr_bugs'] |
+ write_number_list(entry_id, 'uint32_t', 'CrBugs', cr_bugs, False, -1, |
+ data_file, data_helper_file) |
+ # Conditions |
+ data_file.write('{\n') |
+ write_conditions(entry_id, False, -1, entry, data_file, data_helper_file, |
+ data_exception_file) |
+ data_file.write('},\n') |
+ # Exceptions |
+ if 'exceptions' in entry: |
+ exceptions = entry['exceptions'] |
+ exception_count = len(exceptions) |
+ exception_var = 'kExceptionsForEntry' + str(entry_id) |
+ data_exception_file.write('const GpuControlList::Conditions %s[%d] = {\n' % |
+ (exception_var, exception_count)) |
+ for index in range(exception_count): |
+ exception = exceptions[index] |
+ if 'device_id' in exception and 'vendor_id' not in exception: |
+ assert 'vendor_id' in entry |
+ exception['vendor_id'] = entry['vendor_id'] |
+ data_exception_file.write('{\n') |
+ write_conditions(entry_id, True, index, exception, |
+ data_exception_file, data_helper_file, None) |
+ data_exception_file.write('},\n') |
+ data_exception_file.write('};\n\n') |
+ data_file.write('arraysize(%s), // exceptions count\n' % exception_var) |
+ data_file.write('%s, // exceptions\n' % exception_var) |
+ else: |
+ data_file.write('0, // exceptions count\n') |
+ data_file.write('nullptr, // exceptions\n') |
+ # END |
+ data_file.write('},\n') |
+ |
+ |
+def format_files(generated_files): |
+ formatter = "clang-format" |
+ if platform.system() == "Windows": |
+ formatter += ".bat" |
+ for filename in generated_files: |
+ call([formatter, "-i", "-style=chromium", filename]) |
+ |
+ |
+def write_header_file_guard(file, filename, path, begin): |
+ token = (path.upper().replace('/', '_') + '_' + |
+ filename.upper().replace('.', '_') + '_') |
+ if begin: |
+ file.write('#ifndef %s\n#define %s\n\n' % (token, token)) |
+ else: |
+ file.write('\n#endif // %s\n' % token) |
+ |
+ |
+def process_json_file(json_filename, list_tag, |
+ feature_header_filename, total_features, feature_tag, |
+ output_header_filename, output_data_filename, |
+ output_helper_filename, output_exception_filename, path, |
+ export_tag): |
+ current_dir = os.getcwd() |
+ os.chdir('../../' + path) # assume python script is under gpu/config |
+ |
+ json_file = open(json_filename, 'rb') |
+ json_data = json.load(json_file) |
+ json_file.close() |
+ data_file = open(output_data_filename, 'wb') |
+ data_file.write(_LICENSE) |
+ data_file.write(_DO_NOT_EDIT_WARNING) |
+ data_file.write('#include "%s/%s"\n\n' % (path, output_header_filename)) |
+ data_file.write('#include "%s/%s"\n' % (path, output_helper_filename)) |
+ data_file.write('#include "%s/%s"\n\n' % (path, output_exception_filename)) |
+ data_helper_file = open(output_helper_filename, 'wb') |
+ data_helper_file.write(_LICENSE) |
+ data_helper_file.write(_DO_NOT_EDIT_WARNING) |
+ write_header_file_guard(data_helper_file, output_helper_filename, path, True) |
+ data_helper_file.write('#include "gpu/config/%s"\n\n' % |
+ feature_header_filename) |
+ data_helper_file.write('namespace gpu {\n') |
+ data_exception_file = open(output_exception_filename, 'wb') |
+ data_exception_file.write(_LICENSE) |
+ data_exception_file.write(_DO_NOT_EDIT_WARNING) |
+ write_header_file_guard(data_exception_file, output_exception_filename, path, |
+ True) |
+ data_exception_file.write('namespace gpu {\n') |
+ data_file.write('namespace gpu {\n\n') |
+ data_file.write('const char k%sVersion[] = "%s";\n\n' % |
+ (list_tag, json_data['version'])) |
+ entry_count = len(json_data['entries']) |
+ data_file.write('const size_t k%sEntryCount = %d;\n' % |
+ (list_tag, entry_count)) |
+ data_file.write('const GpuControlList::Entry k%sEntries[%d] = {\n' % |
+ (list_tag, entry_count)) |
+ ids = [] |
+ for index in range(entry_count): |
+ entry = json_data['entries'][index] |
+ entry_id = entry['id'] |
+ assert entry_id not in ids |
+ ids.append(entry_id) |
+ write_entry(entry, total_features, feature_tag, |
+ data_file, data_helper_file, data_exception_file) |
+ data_file.write('};\n') |
+ data_file.write('} // namespace gpu\n') |
+ data_file.close() |
+ data_helper_file.write('} // namespace gpu\n') |
+ write_header_file_guard(data_helper_file, output_helper_filename, path, False) |
+ data_helper_file.close() |
+ data_exception_file.write('} // namespace gpu\n') |
+ write_header_file_guard(data_exception_file, output_exception_filename, path, |
+ False) |
+ data_exception_file.close() |
+ data_header_file = open(output_header_filename, 'wb') |
+ data_header_file.write(_LICENSE) |
+ data_header_file.write(_DO_NOT_EDIT_WARNING) |
+ write_header_file_guard(data_header_file, output_header_filename, path, True) |
+ if export_tag == 'CONTENT_EXPORT ': |
+ data_header_file.write('#include "content/common/content_export.h"\n') |
+ data_header_file.write('#include "gpu/config/gpu_control_list.h"\n\n') |
+ data_header_file.write('\n') |
+ data_header_file.write('namespace gpu {\n') |
+ data_header_file.write('%sextern const char k%sVersion[];\n' % |
+ (export_tag, list_tag)) |
+ data_header_file.write('%sextern const size_t k%sEntryCount;\n' % |
+ (export_tag, list_tag)) |
+ data_header_file.write( |
+ '%sextern const GpuControlList::Entry k%sEntries[];\n' % |
+ (export_tag, list_tag)) |
+ data_header_file.write('} // namespace gpu\n') |
+ write_header_file_guard(data_header_file, output_header_filename, path, False) |
+ data_header_file.close() |
+ format_files([output_header_filename, output_data_filename, |
+ output_helper_filename, output_exception_filename]) |
+ |
+ os.chdir(current_dir) |
+ |
+ |
+def process_software_rendering_list(): |
+ total_features = load_software_rendering_list_features('gpu_feature_type.h') |
+ process_json_file('software_rendering_list.json', 'SoftwareRenderingList', |
+ 'gpu_feature_type.h', total_features, 'GPU_FEATURE_TYPE_', |
+ 'software_rendering_list_autogen.h', |
+ 'software_rendering_list_autogen.cc', |
+ 'software_rendering_list_arrays_and_structs_autogen.h', |
+ 'software_rendering_list_exceptions_autogen.h', |
+ 'gpu/config', 'GPU_EXPORT ') |
+ |
+ |
+def process_gpu_driver_bug_list(): |
+ total_features = load_gpu_driver_bug_workarounds( |
+ 'gpu_driver_bug_workaround_type.h') |
+ process_json_file('gpu_driver_bug_list.json', 'GpuDriverBugList', |
+ 'gpu_driver_bug_workaround_type.h', total_features, '', |
+ 'gpu_driver_bug_list_autogen.h', |
+ 'gpu_driver_bug_list_autogen.cc', |
+ 'gpu_driver_bug_list_arrays_and_structs_autogen.h', |
+ 'gpu_driver_bug_list_exceptions_autogen.h', |
+ 'gpu/config', 'GPU_EXPORT ') |
+ |
+ |
+def process_gpu_control_list_testing(): |
+ total_features = ['test_feature_0', 'test_feature_1', 'test_feature_2'] |
+ process_json_file('gpu_control_list_testing.json', 'GpuControlListTesting', |
+ 'gpu_control_list_testing_data.h', total_features, '', |
+ 'gpu_control_list_testing_autogen.h', |
+ 'gpu_control_list_testing_autogen.cc', |
+ 'gpu_control_list_testing_arrays_and_structs_autogen.h', |
+ 'gpu_control_list_testing_exceptions_autogen.h', |
+ 'gpu/config', '') |
+ |
+ |
+def process_gpu_data_manager_testing(): |
+ total_features = load_software_rendering_list_features('gpu_feature_type.h') |
+ process_json_file('gpu_data_manager_testing.json', 'GpuDataManagerTesting', |
+ 'gpu_feature_type.h', total_features, 'GPU_FEATURE_TYPE_', |
+ 'gpu_data_manager_testing_autogen.h', |
+ 'gpu_data_manager_testing_autogen.cc', |
+ 'gpu_data_manager_testing_arrays_and_structs_autogen.h', |
+ 'gpu_data_manager_testing_exceptions_autogen.h', |
+ 'content/browser/gpu', '') |
+ |
+ |
+def write_test_entry_enums(input_json_filename, output_entry_enums_filename, |
+ path, list_tag): |
+ current_dir = os.getcwd() |
+ os.chdir('../../' + path) # assume python script is under gou/config |
+ |
+ json_file = open(input_json_filename, 'rb') |
+ json_data = json.load(json_file) |
+ json_file.close() |
+ |
+ enum_file = open(output_entry_enums_filename, 'wb') |
+ enum_file.write(_LICENSE) |
+ enum_file.write(_DO_NOT_EDIT_WARNING) |
+ write_header_file_guard(enum_file, output_entry_enums_filename, path, True) |
+ enum_file.write('namespace gpu {\n') |
+ enum_file.write('enum %sEntryEnum {\n' % list_tag) |
+ entry_count = len(json_data['entries']) |
+ for index in range(entry_count): |
+ entry = json_data['entries'][index] |
+ entry_id = entry['id'] |
+ description = entry['description'] |
+ assert(index + 1 == int(entry_id)) |
+ description = 'k' + description |
+ description = description.replace('.', '_') |
+ enum_file.write(' %s = %d,\n' % (description, index)) |
+ enum_file.write('};\n') |
+ enum_file.write('} // namespace gpu\n') |
+ write_header_file_guard(enum_file, output_entry_enums_filename, path, False) |
+ enum_file.close() |
+ format_files([output_entry_enums_filename]) |
+ |
+ os.chdir(current_dir) |
+ |
+ |
+def main(): |
+ dir_path = os.path.dirname(os.path.realpath(__file__)) |
+ os.chdir(dir_path) |
+ process_software_rendering_list() |
+ process_gpu_driver_bug_list() |
+ process_gpu_control_list_testing() |
+ write_test_entry_enums('gpu_control_list_testing.json', |
+ 'gpu_control_list_testing_entry_enums_autogen.h', |
+ 'gpu/config', |
+ 'GpuControlListTesting') |
+ process_gpu_data_manager_testing() |
+ write_test_entry_enums('gpu_data_manager_testing.json', |
+ 'gpu_data_manager_testing_entry_enums_autogen.h', |
+ 'content/browser/gpu', |
+ 'GpuDataManagerTesting') |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |