OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/gpu/gpu_blacklist.h" | 5 #include "content/browser/gpu/gpu_blacklist.h" |
6 | 6 |
7 #include "base/json/json_reader.h" | 7 #include "base/json/json_reader.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
10 #include "base/string_piece.h" | 10 #include "base/string_piece.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 if (pieces.size() != 3) | 27 if (pieces.size() != 3) |
28 return NULL; | 28 return NULL; |
29 std::string date_as_version_string = pieces[2]; | 29 std::string date_as_version_string = pieces[2]; |
30 for (size_t i = 0; i < 2; ++i) { | 30 for (size_t i = 0; i < 2; ++i) { |
31 date_as_version_string += "."; | 31 date_as_version_string += "."; |
32 date_as_version_string += pieces[i]; | 32 date_as_version_string += pieces[i]; |
33 } | 33 } |
34 return Version::GetVersionFromString(date_as_version_string); | 34 return Version::GetVersionFromString(date_as_version_string); |
35 } | 35 } |
36 | 36 |
37 Value* NewStatusValue(const char* name, const char* status) | |
38 { | |
39 DictionaryValue* value = new DictionaryValue(); | |
40 value->SetString("name", name); | |
41 value->SetString("status", status); | |
42 return value; | |
43 } | |
44 | |
45 } // namespace anonymous | 37 } // namespace anonymous |
46 | 38 |
47 GpuBlacklist::VersionInfo::VersionInfo(const std::string& version_op, | 39 GpuBlacklist::VersionInfo::VersionInfo(const std::string& version_op, |
48 const std::string& version_string, | 40 const std::string& version_string, |
49 const std::string& version_string2) { | 41 const std::string& version_string2) { |
50 op_ = StringToOp(version_op); | 42 op_ = StringToOp(version_op); |
51 if (op_ == kUnknown || op_ == kAny) | 43 if (op_ == kUnknown || op_ == kAny) |
52 return; | 44 return; |
53 version_.reset(Version::GetVersionFromString(version_string)); | 45 version_.reset(Version::GetVersionFromString(version_string)); |
54 if (version_.get() == NULL) { | 46 if (version_.get() == NULL) { |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 void GpuBlacklist::GetGpuFeatureFlagEntries( | 754 void GpuBlacklist::GetGpuFeatureFlagEntries( |
763 GpuFeatureFlags::GpuFeatureType feature, | 755 GpuFeatureFlags::GpuFeatureType feature, |
764 std::vector<uint32>& entry_ids) const { | 756 std::vector<uint32>& entry_ids) const { |
765 entry_ids.clear(); | 757 entry_ids.clear(); |
766 for (size_t i = 0; i < active_entries_.size(); ++i) { | 758 for (size_t i = 0; i < active_entries_.size(); ++i) { |
767 if ((feature & active_entries_[i]->GetGpuFeatureFlags().flags()) != 0) | 759 if ((feature & active_entries_[i]->GetGpuFeatureFlags().flags()) != 0) |
768 entry_ids.push_back(active_entries_[i]->id()); | 760 entry_ids.push_back(active_entries_[i]->id()); |
769 } | 761 } |
770 } | 762 } |
771 | 763 |
772 bool GpuBlacklist::IsFeatureBlacklisted( | 764 void GpuBlacklist::GetBlacklistReasons(ListValue* problem_list) const { |
773 GpuFeatureFlags::GpuFeatureType feature) const | 765 DCHECK(problem_list); |
774 { | |
775 for (size_t i = 0; i < active_entries_.size(); ++i) { | 766 for (size_t i = 0; i < active_entries_.size(); ++i) { |
776 if (active_entries_[i]->GetGpuFeatureFlags().flags() & feature) | 767 GpuBlacklistEntry* entry = active_entries_[i]; |
777 return true; | 768 DictionaryValue* problem = new DictionaryValue(); |
| 769 |
| 770 problem->SetString("description", entry->description()); |
| 771 |
| 772 ListValue* cr_bugs = new ListValue(); |
| 773 for (size_t j = 0; j < entry->cr_bugs().size(); ++j) |
| 774 cr_bugs->Append(Value::CreateIntegerValue(entry->cr_bugs()[j])); |
| 775 problem->Set("crBugs", cr_bugs); |
| 776 |
| 777 ListValue* webkit_bugs = new ListValue(); |
| 778 for (size_t j = 0; j < entry->webkit_bugs().size(); ++j) { |
| 779 webkit_bugs->Append(Value::CreateIntegerValue( |
| 780 entry->webkit_bugs()[j])); |
| 781 } |
| 782 problem->Set("webkitBugs", webkit_bugs); |
| 783 |
| 784 problem_list->Append(problem); |
778 } | 785 } |
779 return false; | |
780 } | |
781 | |
782 Value* GpuBlacklist::GetFeatureStatus(bool gpu_access_allowed, | |
783 bool disable_accelerated_compositing, | |
784 bool disable_accelerated_2D_canvas, | |
785 bool disable_experimental_webgl, | |
786 bool disable_multisampling) const { | |
787 DictionaryValue* status = new DictionaryValue(); | |
788 | |
789 // Build the feature_status field. | |
790 { | |
791 ListValue* feature_status_list = new ListValue(); | |
792 | |
793 // 2d_canvas. | |
794 if (!gpu_access_allowed) { | |
795 if (disable_accelerated_2D_canvas) | |
796 feature_status_list->Append(NewStatusValue("2d_canvas", | |
797 "software")); | |
798 else | |
799 feature_status_list->Append(NewStatusValue("2d_canvas", | |
800 "unavailable_software")); | |
801 } else if (!disable_accelerated_2D_canvas) { | |
802 if (IsFeatureBlacklisted( | |
803 GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas)) | |
804 feature_status_list->Append(NewStatusValue("2d_canvas", | |
805 "unavailable_software")); | |
806 else if (disable_accelerated_compositing) | |
807 feature_status_list->Append(NewStatusValue("2d_canvas", | |
808 "disabled_software")); | |
809 else | |
810 feature_status_list->Append(NewStatusValue("2d_canvas", | |
811 "enabled")); | |
812 } else { | |
813 feature_status_list->Append(NewStatusValue("2d_canvas", | |
814 "software")); | |
815 } | |
816 | |
817 // 3d css and compositing. | |
818 if (!gpu_access_allowed) { | |
819 feature_status_list->Append(NewStatusValue("3d_css", | |
820 "unavailable_off")); | |
821 feature_status_list->Append(NewStatusValue("compositing", | |
822 "unavailable_software")); | |
823 } else if (disable_accelerated_compositing) { | |
824 feature_status_list->Append(NewStatusValue("3d_css", | |
825 "unavailable_off")); | |
826 feature_status_list->Append(NewStatusValue("compositing", | |
827 "disabled_software")); | |
828 } else if (IsFeatureBlacklisted( | |
829 GpuFeatureFlags::kGpuFeatureAcceleratedCompositing)) { | |
830 feature_status_list->Append(NewStatusValue("3d_css", | |
831 "unavailable_off")); | |
832 feature_status_list->Append(NewStatusValue("compositing", | |
833 "disabled_software")); | |
834 } else { | |
835 feature_status_list->Append(NewStatusValue("3d_css", | |
836 "enabled")); | |
837 feature_status_list->Append(NewStatusValue("compositing", | |
838 "enabled")); | |
839 } | |
840 | |
841 // webgl | |
842 if (!gpu_access_allowed) | |
843 feature_status_list->Append(NewStatusValue("webgl", | |
844 "unavailable_off")); | |
845 else if (disable_experimental_webgl) | |
846 feature_status_list->Append(NewStatusValue("webgl", | |
847 "disabled_off")); | |
848 else if (IsFeatureBlacklisted( | |
849 GpuFeatureFlags::kGpuFeatureWebgl)) | |
850 feature_status_list->Append(NewStatusValue("webgl", | |
851 "unavailable_off")); | |
852 else if (disable_accelerated_compositing) | |
853 feature_status_list->Append(NewStatusValue("webgl", | |
854 "enabled_readback")); | |
855 else | |
856 feature_status_list->Append(NewStatusValue("webgl", | |
857 "enabled")); | |
858 | |
859 // multisampling | |
860 if (!gpu_access_allowed) | |
861 feature_status_list->Append(NewStatusValue("multisampling", | |
862 "unavailable_off")); | |
863 else if (disable_multisampling) | |
864 feature_status_list->Append(NewStatusValue("multisampling", | |
865 "disabled_off")); | |
866 else if (IsFeatureBlacklisted( | |
867 GpuFeatureFlags::kGpuFeatureMultisampling)) | |
868 feature_status_list->Append(NewStatusValue("multisampling", | |
869 "disabled_off")); | |
870 else | |
871 feature_status_list->Append(NewStatusValue("multisampling", | |
872 "enabled")); | |
873 | |
874 status->Set("featureStatus", feature_status_list); | |
875 } | |
876 | |
877 // Build the problems list. | |
878 { | |
879 ListValue* problem_list = new ListValue(); | |
880 if (!gpu_access_allowed) { | |
881 DictionaryValue* problem = new DictionaryValue(); | |
882 problem->SetString("description", | |
883 "GPU process was unable to boot. Access to GPU disallowed."); | |
884 problem->Set("crBugs", new ListValue()); | |
885 problem->Set("webkitBugs", new ListValue()); | |
886 problem_list->Append(problem); | |
887 } | |
888 if (disable_accelerated_2D_canvas) { | |
889 DictionaryValue* problem = new DictionaryValue(); | |
890 problem->SetString("description", | |
891 "Accelerated 2D canvas has been disabled at the command line"); | |
892 problem->Set("crBugs", new ListValue()); | |
893 problem->Set("webkitBugs", new ListValue()); | |
894 problem_list->Append(problem); | |
895 } | |
896 if (disable_accelerated_compositing) { | |
897 DictionaryValue* problem = new DictionaryValue(); | |
898 problem->SetString("description", | |
899 "Accelerated compositing has been disabled, either via about:flags " | |
900 "or command line. This adversely affects performance of all hardware " | |
901 " accelerated features."); | |
902 problem->Set("crBugs", new ListValue()); | |
903 problem->Set("webkitBugs", new ListValue()); | |
904 problem_list->Append(problem); | |
905 } | |
906 if (disable_experimental_webgl) { | |
907 DictionaryValue* problem = new DictionaryValue(); | |
908 problem->SetString("description", | |
909 "WebGL has been disabled, either via about:flags " | |
910 "or command line"); | |
911 problem->Set("crBugs", new ListValue()); | |
912 problem->Set("webkitBugs", new ListValue()); | |
913 problem_list->Append(problem); | |
914 } | |
915 if (disable_multisampling) { | |
916 DictionaryValue* problem = new DictionaryValue(); | |
917 problem->SetString("description", | |
918 "Multisampling has been disabled, either via about:flags " | |
919 "or command line"); | |
920 problem->Set("crBugs", new ListValue()); | |
921 problem->Set("webkitBugs", new ListValue()); | |
922 problem_list->Append(problem); | |
923 } | |
924 for (size_t i = 0; i < active_entries_.size(); ++i) { | |
925 ScopedGpuBlacklistEntry entry = active_entries_[i]; | |
926 DictionaryValue* problem = new DictionaryValue(); | |
927 | |
928 problem->SetString("description", entry->description()); | |
929 | |
930 ListValue* cr_bugs = new ListValue(); | |
931 for (size_t j = 0; j < entry->cr_bugs().size(); ++j) | |
932 cr_bugs->Append(Value::CreateIntegerValue( | |
933 entry->cr_bugs()[j])); | |
934 problem->Set("crBugs", cr_bugs); | |
935 | |
936 ListValue* webkit_bugs = new ListValue(); | |
937 for (size_t j = 0; j < entry->webkit_bugs().size(); ++j) | |
938 webkit_bugs->Append(Value::CreateIntegerValue( | |
939 entry->webkit_bugs()[j])); | |
940 problem->Set("webkitBugs", webkit_bugs); | |
941 | |
942 problem_list->Append(problem); | |
943 } | |
944 status->Set("problems", problem_list); | |
945 } | |
946 return status; | |
947 } | 786 } |
948 | 787 |
949 size_t GpuBlacklist::num_entries() const { | 788 size_t GpuBlacklist::num_entries() const { |
950 return blacklist_.size(); | 789 return blacklist_.size(); |
951 } | 790 } |
952 | 791 |
953 uint32 GpuBlacklist::max_entry_id() const { | 792 uint32 GpuBlacklist::max_entry_id() const { |
954 return max_entry_id_; | 793 return max_entry_id_; |
955 } | 794 } |
956 | 795 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1054 return kStable; | 893 return kStable; |
1055 if (value == "beta") | 894 if (value == "beta") |
1056 return kBeta; | 895 return kBeta; |
1057 if (value == "dev") | 896 if (value == "dev") |
1058 return kDev; | 897 return kDev; |
1059 if (value == "canary") | 898 if (value == "canary") |
1060 return kCanary; | 899 return kCanary; |
1061 return kUnknown; | 900 return kUnknown; |
1062 } | 901 } |
1063 | 902 |
OLD | NEW |