| 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 |