| OLD | NEW | 
|    1 #!/usr/bin/env python |    1 #!/usr/bin/env python | 
|    2 # Copyright 2017 The Chromium Authors. All rights reserved. |    2 # Copyright 2017 The Chromium Authors. All rights reserved. | 
|    3 # Use of this source code is governed by a BSD-style license that can be |    3 # Use of this source code is governed by a BSD-style license that can be | 
|    4 # found in the LICENSE file. |    4 # found in the LICENSE file. | 
|    5  |    5  | 
|    6 import json |    6 import json | 
|    7 import os |    7 import os | 
|    8 import platform |    8 import platform | 
|    9 import sys |    9 import sys | 
 |   10 from optparse import OptionParser | 
|   10 from subprocess import call |   11 from subprocess import call | 
|   11  |   12  | 
|   12 """Generate data struct from GPU blacklist and driver bug workarounds json.""" |   13 """Generate data struct from GPU blacklist and driver bug workarounds json.""" | 
|   13  |   14  | 
|   14 _LICENSE = """// Copyright 2017 The Chromium Authors. All rights reserved. |   15 _LICENSE = """// Copyright 2017 The Chromium Authors. All rights reserved. | 
|   15 // Use of this source code is governed by a BSD-style license that can be |   16 // Use of this source code is governed by a BSD-style license that can be | 
|   16 // found in the LICENSE file. |   17 // found in the LICENSE file. | 
|   17  |   18  | 
|   18 """ |   19 """ | 
|   19  |   20  | 
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  570  |  571  | 
|  571 def write_header_file_guard(file, filename, path, begin): |  572 def write_header_file_guard(file, filename, path, begin): | 
|  572   token = (path.upper().replace('/', '_') + '_' + |  573   token = (path.upper().replace('/', '_') + '_' + | 
|  573            filename.upper().replace('.', '_') + '_') |  574            filename.upper().replace('.', '_') + '_') | 
|  574   if begin: |  575   if begin: | 
|  575     file.write('#ifndef %s\n#define %s\n\n' % (token, token)) |  576     file.write('#ifndef %s\n#define %s\n\n' % (token, token)) | 
|  576   else: |  577   else: | 
|  577     file.write('\n#endif  // %s\n' % token) |  578     file.write('\n#endif  // %s\n' % token) | 
|  578  |  579  | 
|  579  |  580  | 
|  580 def process_json_file(json_filename, list_tag, |  581 def process_json_file(json_filepath, list_tag, | 
|  581                       feature_header_filename, total_features, feature_tag, |  582                       feature_header_filename, total_features, feature_tag, | 
|  582                       output_header_filename, output_data_filename, |  583                       output_header_filepath, output_data_filepath, | 
|  583                       output_helper_filename, output_exception_filename, path, |  584                       output_helper_filepath, output_exception_filepath, path, | 
|  584                       export_tag): |  585                       export_tag, git_format): | 
|  585   current_dir = os.getcwd() |  586   output_header_filename = os.path.basename(output_header_filepath) | 
|  586   os.chdir('../../' + path) # assume python script is under gpu/config |  587   output_helper_filename = os.path.basename(output_helper_filepath) | 
|  587  |  588   output_exception_filename = os.path.basename(output_exception_filepath) | 
|  588   json_file = open(json_filename, 'rb') |  589   json_file = open(json_filepath, 'rb') | 
|  589   json_data = json.load(json_file) |  590   json_data = json.load(json_file) | 
|  590   json_file.close() |  591   json_file.close() | 
|  591   data_file = open(output_data_filename, 'wb') |  592   data_file = open(output_data_filepath, 'wb') | 
|  592   data_file.write(_LICENSE) |  593   data_file.write(_LICENSE) | 
|  593   data_file.write(_DO_NOT_EDIT_WARNING) |  594   data_file.write(_DO_NOT_EDIT_WARNING) | 
|  594   data_file.write('#include "%s/%s"\n\n' % (path, output_header_filename)) |  595   data_file.write('#include "%s/%s"\n\n' % (path, output_header_filename)) | 
|  595   data_file.write('#include "%s/%s"\n' % (path, output_helper_filename)) |  596   data_file.write('#include "%s/%s"\n' % (path, output_helper_filename)) | 
|  596   data_file.write('#include "%s/%s"\n\n' % (path, output_exception_filename)) |  597   data_file.write('#include "%s/%s"\n\n' % (path, output_exception_filename)) | 
|  597   data_helper_file = open(output_helper_filename, 'wb') |  598   data_helper_file = open(output_helper_filepath, 'wb') | 
|  598   data_helper_file.write(_LICENSE) |  599   data_helper_file.write(_LICENSE) | 
|  599   data_helper_file.write(_DO_NOT_EDIT_WARNING) |  600   data_helper_file.write(_DO_NOT_EDIT_WARNING) | 
|  600   write_header_file_guard(data_helper_file, output_helper_filename, path, True) |  601   write_header_file_guard(data_helper_file, output_helper_filename, path, True) | 
|  601   data_helper_file.write('#include "gpu/config/%s"\n\n' % |  602   data_helper_file.write('#include "gpu/config/%s"\n\n' % | 
|  602                          feature_header_filename) |  603                          feature_header_filename) | 
|  603   data_helper_file.write('namespace gpu {\n') |  604   data_helper_file.write('namespace gpu {\n') | 
|  604   data_exception_file = open(output_exception_filename, 'wb') |  605   data_exception_file = open(output_exception_filepath, 'wb') | 
|  605   data_exception_file.write(_LICENSE) |  606   data_exception_file.write(_LICENSE) | 
|  606   data_exception_file.write(_DO_NOT_EDIT_WARNING) |  607   data_exception_file.write(_DO_NOT_EDIT_WARNING) | 
|  607   write_header_file_guard(data_exception_file, output_exception_filename, path, |  608   write_header_file_guard(data_exception_file, output_exception_filename, path, | 
|  608                           True) |  609                           True) | 
|  609   data_exception_file.write('namespace gpu {\n') |  610   data_exception_file.write('namespace gpu {\n') | 
|  610   data_file.write('namespace gpu {\n\n') |  611   data_file.write('namespace gpu {\n\n') | 
|  611   data_file.write('const char k%sVersion[] = "%s";\n\n' % |  612   data_file.write('const char k%sVersion[] = "%s";\n\n' % | 
|  612                   (list_tag, json_data['version'])) |  613                   (list_tag, json_data['version'])) | 
|  613   entry_count = len(json_data['entries']) |  614   entry_count = len(json_data['entries']) | 
|  614   data_file.write('const size_t k%sEntryCount = %d;\n' % |  615   data_file.write('const size_t k%sEntryCount = %d;\n' % | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  626   data_file.write('};\n') |  627   data_file.write('};\n') | 
|  627   data_file.write('}  // namespace gpu\n') |  628   data_file.write('}  // namespace gpu\n') | 
|  628   data_file.close() |  629   data_file.close() | 
|  629   data_helper_file.write('}  // namespace gpu\n') |  630   data_helper_file.write('}  // namespace gpu\n') | 
|  630   write_header_file_guard(data_helper_file, output_helper_filename, path, False) |  631   write_header_file_guard(data_helper_file, output_helper_filename, path, False) | 
|  631   data_helper_file.close() |  632   data_helper_file.close() | 
|  632   data_exception_file.write('}  // namespace gpu\n') |  633   data_exception_file.write('}  // namespace gpu\n') | 
|  633   write_header_file_guard(data_exception_file, output_exception_filename, path, |  634   write_header_file_guard(data_exception_file, output_exception_filename, path, | 
|  634                           False) |  635                           False) | 
|  635   data_exception_file.close() |  636   data_exception_file.close() | 
|  636   data_header_file = open(output_header_filename, 'wb') |  637   data_header_file = open(output_header_filepath, 'wb') | 
|  637   data_header_file.write(_LICENSE) |  638   data_header_file.write(_LICENSE) | 
|  638   data_header_file.write(_DO_NOT_EDIT_WARNING) |  639   data_header_file.write(_DO_NOT_EDIT_WARNING) | 
|  639   write_header_file_guard(data_header_file, output_header_filename, path, True) |  640   write_header_file_guard(data_header_file, output_header_filename, path, True) | 
|  640   if export_tag == 'CONTENT_EXPORT ': |  641   if export_tag == 'CONTENT_EXPORT ': | 
|  641     data_header_file.write('#include "content/common/content_export.h"\n') |  642     data_header_file.write('#include "content/common/content_export.h"\n') | 
|  642   data_header_file.write('#include "gpu/config/gpu_control_list.h"\n\n') |  643   data_header_file.write('#include "gpu/config/gpu_control_list.h"\n\n') | 
|  643   data_header_file.write('\n') |  644   data_header_file.write('\n') | 
|  644   data_header_file.write('namespace gpu {\n') |  645   data_header_file.write('namespace gpu {\n') | 
|  645   data_header_file.write('%sextern const char k%sVersion[];\n' % |  646   data_header_file.write('%sextern const char k%sVersion[];\n' % | 
|  646                          (export_tag, list_tag)) |  647                          (export_tag, list_tag)) | 
|  647   data_header_file.write('%sextern const size_t k%sEntryCount;\n' % |  648   data_header_file.write('%sextern const size_t k%sEntryCount;\n' % | 
|  648                          (export_tag, list_tag)) |  649                          (export_tag, list_tag)) | 
|  649   data_header_file.write( |  650   data_header_file.write( | 
|  650       '%sextern const GpuControlList::Entry k%sEntries[];\n' % |  651       '%sextern const GpuControlList::Entry k%sEntries[];\n' % | 
|  651       (export_tag, list_tag)) |  652       (export_tag, list_tag)) | 
|  652   data_header_file.write('}  // namespace gpu\n') |  653   data_header_file.write('}  // namespace gpu\n') | 
|  653   write_header_file_guard(data_header_file, output_header_filename, path, False) |  654   write_header_file_guard(data_header_file, output_header_filename, path, False) | 
|  654   data_header_file.close() |  655   data_header_file.close() | 
|  655   format_files([output_header_filename, output_data_filename, |  656   if git_format: | 
|  656                 output_helper_filename, output_exception_filename]) |  657     format_files([output_header_filepath, output_data_filepath, | 
|  657  |  658                   output_helper_filepath, output_exception_filepath]) | 
|  658   os.chdir(current_dir) |  | 
|  659  |  659  | 
|  660  |  660  | 
|  661 def process_software_rendering_list(): |  661 def process_software_rendering_list(script_dir, output_dir): | 
|  662   total_features = load_software_rendering_list_features('gpu_feature_type.h') |  662   total_features = load_software_rendering_list_features( | 
|  663   process_json_file('software_rendering_list.json', 'SoftwareRenderingList', |  663       os.path.join(script_dir, 'gpu_feature_type.h')) | 
|  664                     'gpu_feature_type.h', total_features, 'GPU_FEATURE_TYPE_', |  664   process_json_file( | 
|  665                     'software_rendering_list_autogen.h', |  665       os.path.join(script_dir, 'software_rendering_list.json'), | 
|  666                     'software_rendering_list_autogen.cc', |  666       'SoftwareRenderingList', | 
|  667                     'software_rendering_list_arrays_and_structs_autogen.h', |  667       'gpu_feature_type.h', | 
|  668                     'software_rendering_list_exceptions_autogen.h', |  668       total_features, | 
|  669                     'gpu/config', 'GPU_EXPORT ') |  669       'GPU_FEATURE_TYPE_', | 
 |  670       os.path.join(output_dir, 'software_rendering_list_autogen.h'), | 
 |  671       os.path.join(output_dir, 'software_rendering_list_autogen.cc'), | 
 |  672       os.path.join(output_dir, | 
 |  673                    'software_rendering_list_arrays_and_structs_autogen.h'), | 
 |  674       os.path.join(output_dir, 'software_rendering_list_exceptions_autogen.h'), | 
 |  675       'gpu/config', | 
 |  676       'GPU_EXPORT ', | 
 |  677       False) | 
|  670  |  678  | 
|  671  |  679  | 
|  672 def process_gpu_driver_bug_list(): |  680 def process_gpu_driver_bug_list(script_dir, output_dir): | 
|  673   total_features = load_gpu_driver_bug_workarounds( |  681   total_features = load_gpu_driver_bug_workarounds( | 
|  674     'gpu_driver_bug_workaround_type.h') |  682       os.path.join(script_dir, 'gpu_driver_bug_workaround_type.h')) | 
|  675   process_json_file('gpu_driver_bug_list.json', 'GpuDriverBugList', |  683   process_json_file( | 
|  676                     'gpu_driver_bug_workaround_type.h', total_features, '', |  684       os.path.join(script_dir, 'gpu_driver_bug_list.json'), | 
|  677                     'gpu_driver_bug_list_autogen.h', |  685       'GpuDriverBugList', | 
|  678                     'gpu_driver_bug_list_autogen.cc', |  686       'gpu_driver_bug_workaround_type.h', | 
|  679                     'gpu_driver_bug_list_arrays_and_structs_autogen.h', |  687       total_features, | 
|  680                     'gpu_driver_bug_list_exceptions_autogen.h', |  688       '', | 
|  681                     'gpu/config', 'GPU_EXPORT ') |  689       os.path.join(output_dir, 'gpu_driver_bug_list_autogen.h'), | 
 |  690       os.path.join(output_dir, 'gpu_driver_bug_list_autogen.cc'), | 
 |  691       os.path.join(output_dir, | 
 |  692                    'gpu_driver_bug_list_arrays_and_structs_autogen.h'), | 
 |  693       os.path.join(output_dir, 'gpu_driver_bug_list_exceptions_autogen.h'), | 
 |  694       'gpu/config', | 
 |  695       'GPU_EXPORT ', | 
 |  696       False) | 
|  682  |  697  | 
|  683  |  698  | 
|  684 def process_gpu_control_list_testing(): |  699 def process_gpu_control_list_testing(script_dir, output_dir): | 
|  685   total_features = ['test_feature_0', 'test_feature_1', 'test_feature_2'] |  700   total_features = ['test_feature_0', 'test_feature_1', 'test_feature_2'] | 
|  686   process_json_file('gpu_control_list_testing.json', 'GpuControlListTesting', |  701   process_json_file( | 
|  687                     'gpu_control_list_testing_data.h', total_features, '', |  702       os.path.join(script_dir, 'gpu_control_list_testing.json'), | 
|  688                     'gpu_control_list_testing_autogen.h', |  703       'GpuControlListTesting', | 
|  689                     'gpu_control_list_testing_autogen.cc', |  704       'gpu_control_list_testing_data.h', | 
|  690                     'gpu_control_list_testing_arrays_and_structs_autogen.h', |  705       total_features, | 
|  691                     'gpu_control_list_testing_exceptions_autogen.h', |  706       '', | 
|  692                     'gpu/config', '') |  707       os.path.join(output_dir, 'gpu_control_list_testing_autogen.h'), | 
 |  708       os.path.join(output_dir, 'gpu_control_list_testing_autogen.cc'), | 
 |  709       os.path.join(output_dir, | 
 |  710                    'gpu_control_list_testing_arrays_and_structs_autogen.h'), | 
 |  711       os.path.join(output_dir, 'gpu_control_list_testing_exceptions_autogen.h'), | 
 |  712       'gpu/config', | 
 |  713       '', | 
 |  714       True) | 
|  693  |  715  | 
|  694  |  716  | 
|  695 def process_gpu_data_manager_testing(): |  717 def process_gpu_data_manager_testing(script_dir, output_dir): | 
|  696   total_features = load_software_rendering_list_features('gpu_feature_type.h') |  718   total_features = load_software_rendering_list_features( | 
|  697   process_json_file('gpu_data_manager_testing.json', 'GpuDataManagerTesting', |  719       os.path.join(script_dir, 'gpu_feature_type.h')) | 
|  698                     'gpu_feature_type.h', total_features, 'GPU_FEATURE_TYPE_', |  720   process_json_file( | 
|  699                     'gpu_data_manager_testing_autogen.h', |  721       os.path.join(output_dir, 'gpu_data_manager_testing.json'), | 
|  700                     'gpu_data_manager_testing_autogen.cc', |  722       'GpuDataManagerTesting', | 
|  701                     'gpu_data_manager_testing_arrays_and_structs_autogen.h', |  723       'gpu_feature_type.h', | 
|  702                     'gpu_data_manager_testing_exceptions_autogen.h', |  724       total_features, | 
|  703                     'content/browser/gpu', '') |  725       'GPU_FEATURE_TYPE_', | 
 |  726       os.path.join(output_dir, 'gpu_data_manager_testing_autogen.h'), | 
 |  727       os.path.join(output_dir, 'gpu_data_manager_testing_autogen.cc'), | 
 |  728       os.path.join(output_dir, | 
 |  729                    'gpu_data_manager_testing_arrays_and_structs_autogen.h'), | 
 |  730       os.path.join(output_dir, 'gpu_data_manager_testing_exceptions_autogen.h'), | 
 |  731       'content/browser/gpu', | 
 |  732       '', | 
 |  733       True) | 
|  704  |  734  | 
|  705  |  735  | 
|  706 def write_test_entry_enums(input_json_filename, output_entry_enums_filename, |  736 def write_test_entry_enums(input_json_filepath, output_entry_enums_filepath, | 
|  707                            path, list_tag): |  737                            path, list_tag): | 
|  708   current_dir = os.getcwd() |  738   json_file = open(input_json_filepath, 'rb') | 
|  709   os.chdir('../../' + path) # assume python script is under gou/config |  | 
|  710  |  | 
|  711   json_file = open(input_json_filename, 'rb') |  | 
|  712   json_data = json.load(json_file) |  739   json_data = json.load(json_file) | 
|  713   json_file.close() |  740   json_file.close() | 
|  714  |  741  | 
|  715   enum_file = open(output_entry_enums_filename, 'wb') |  742   output_entry_enums_filename = os.path.basename(output_entry_enums_filepath) | 
 |  743   enum_file = open(output_entry_enums_filepath, 'wb') | 
|  716   enum_file.write(_LICENSE) |  744   enum_file.write(_LICENSE) | 
|  717   enum_file.write(_DO_NOT_EDIT_WARNING) |  745   enum_file.write(_DO_NOT_EDIT_WARNING) | 
|  718   write_header_file_guard(enum_file, output_entry_enums_filename, path, True) |  746   write_header_file_guard(enum_file, output_entry_enums_filename, path, True) | 
|  719   enum_file.write('namespace gpu {\n') |  747   enum_file.write('namespace gpu {\n') | 
|  720   enum_file.write('enum %sEntryEnum {\n' % list_tag) |  748   enum_file.write('enum %sEntryEnum {\n' % list_tag) | 
|  721   entry_count = len(json_data['entries']) |  749   entry_count = len(json_data['entries']) | 
|  722   for index in range(entry_count): |  750   for index in range(entry_count): | 
|  723     entry = json_data['entries'][index] |  751     entry = json_data['entries'][index] | 
|  724     entry_id = entry['id'] |  752     entry_id = entry['id'] | 
|  725     description = entry['description'] |  753     description = entry['description'] | 
|  726     assert(index + 1 == int(entry_id)) |  754     assert(index + 1 == int(entry_id)) | 
|  727     description = 'k' + description |  755     description = 'k' + description | 
|  728     description = description.replace('.', '_') |  756     description = description.replace('.', '_') | 
|  729     enum_file.write('  %s = %d,\n' % (description, index)) |  757     enum_file.write('  %s = %d,\n' % (description, index)) | 
|  730   enum_file.write('};\n') |  758   enum_file.write('};\n') | 
|  731   enum_file.write('}  // namespace gpu\n') |  759   enum_file.write('}  // namespace gpu\n') | 
|  732   write_header_file_guard(enum_file, output_entry_enums_filename, path, False) |  760   write_header_file_guard(enum_file, output_entry_enums_filename, path, False) | 
|  733   enum_file.close() |  761   enum_file.close() | 
|  734   format_files([output_entry_enums_filename]) |  762   format_files([output_entry_enums_filepath]) | 
|  735  |  | 
|  736   os.chdir(current_dir) |  | 
|  737  |  763  | 
|  738  |  764  | 
|  739 def main(): |  765 def main(argv): | 
|  740   dir_path = os.path.dirname(os.path.realpath(__file__)) |  766   parser = OptionParser() | 
|  741   os.chdir(dir_path) |  767   parser.add_option("--output-dir", | 
|  742   process_software_rendering_list() |  768                     help="output directory for SoftwareRenderingList and " | 
|  743   process_gpu_driver_bug_list() |  769                     "GpuDriverBugList data files. " | 
|  744   process_gpu_control_list_testing() |  770                     "If unspecified, these files are not generated.") | 
|  745   write_test_entry_enums('gpu_control_list_testing.json', |  771   parser.add_option("--skip-testing-data", action="store_false", | 
|  746                          'gpu_control_list_testing_entry_enums_autogen.h', |  772                     dest="generate_testing_data", default=True, | 
|  747                          'gpu/config', |  773                     help="skip testing data generation.") | 
|  748                          'GpuControlListTesting') |  774   (options, args) = parser.parse_args(args=argv) | 
|  749   process_gpu_data_manager_testing() |  775  | 
|  750   write_test_entry_enums('gpu_data_manager_testing.json', |  776   script_dir = os.path.dirname(os.path.realpath(__file__)) | 
|  751                          'gpu_data_manager_testing_entry_enums_autogen.h', |  777  | 
|  752                          'content/browser/gpu', |  778   if options.output_dir != None: | 
|  753                          'GpuDataManagerTesting') |  779     process_software_rendering_list(script_dir, options.output_dir) | 
 |  780     process_gpu_driver_bug_list(script_dir, options.output_dir) | 
 |  781  | 
 |  782   if options.generate_testing_data: | 
 |  783     # Testing data files are generated by calling the script manually. | 
 |  784     process_gpu_control_list_testing(script_dir, script_dir) | 
 |  785     write_test_entry_enums( | 
 |  786         os.path.join(script_dir, 'gpu_control_list_testing.json'), | 
 |  787         os.path.join(script_dir, | 
 |  788                      'gpu_control_list_testing_entry_enums_autogen.h'), | 
 |  789         'gpu/config', | 
 |  790         'GpuControlListTesting') | 
 |  791     chrome_root_dir = os.path.abspath(os.path.join(script_dir, '../../')) | 
 |  792     gpu_data_manager_dir = os.path.join(chrome_root_dir, 'content/browser/gpu') | 
 |  793     process_gpu_data_manager_testing(script_dir, gpu_data_manager_dir) | 
 |  794     write_test_entry_enums( | 
 |  795         os.path.join(gpu_data_manager_dir, 'gpu_data_manager_testing.json'), | 
 |  796         os.path.join(gpu_data_manager_dir, | 
 |  797                      'gpu_data_manager_testing_entry_enums_autogen.h'), | 
 |  798         'content/browser/gpu', | 
 |  799         'GpuDataManagerTesting') | 
|  754  |  800  | 
|  755  |  801  | 
|  756 if __name__ == '__main__': |  802 if __name__ == '__main__': | 
|  757   sys.exit(main()) |  803   sys.exit(main(sys.argv[1:])) | 
| OLD | NEW |