Home | History | Annotate | Download | only in config
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "gpu/config/gpu_test_config.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/sys_info.h"
      9 #include "gpu/config/gpu_info.h"
     10 #include "gpu/config/gpu_info_collector.h"
     11 #include "gpu/config/gpu_test_expectations_parser.h"
     12 
     13 #if defined(OS_MACOSX)
     14 #include "base/mac/mac_util.h"
     15 #elif defined(OS_WIN)
     16 #include "base/win/windows_version.h"
     17 #endif
     18 
     19 namespace gpu {
     20 
     21 namespace {
     22 
     23 GPUTestConfig::OS GetCurrentOS() {
     24 #if defined(OS_CHROMEOS)
     25   return GPUTestConfig::kOsChromeOS;
     26 #elif defined(OS_LINUX) || defined(OS_OPENBSD)
     27   return GPUTestConfig::kOsLinux;
     28 #elif defined(OS_WIN)
     29   int32 major_version = 0;
     30   int32 minor_version = 0;
     31   int32 bugfix_version = 0;
     32   base::SysInfo::OperatingSystemVersionNumbers(
     33       &major_version, &minor_version, &bugfix_version);
     34   if (major_version == 5)
     35     return GPUTestConfig::kOsWinXP;
     36   if (major_version == 6 && minor_version == 0)
     37     return GPUTestConfig::kOsWinVista;
     38   if (major_version == 6 && minor_version == 1)
     39     return GPUTestConfig::kOsWin7;
     40   if (major_version == 6 && (minor_version == 2 || minor_version == 3))
     41     return GPUTestConfig::kOsWin8;
     42 #elif defined(OS_MACOSX)
     43   int32 major_version = 0;
     44   int32 minor_version = 0;
     45   int32 bugfix_version = 0;
     46   base::SysInfo::OperatingSystemVersionNumbers(
     47       &major_version, &minor_version, &bugfix_version);
     48   if (major_version == 10) {
     49     switch (minor_version) {
     50       case 5:
     51         return GPUTestConfig::kOsMacLeopard;
     52       case 6:
     53         return GPUTestConfig::kOsMacSnowLeopard;
     54       case 7:
     55         return GPUTestConfig::kOsMacLion;
     56       case 8:
     57         return GPUTestConfig::kOsMacMountainLion;
     58       case 9:
     59         return GPUTestConfig::kOsMacMavericks;
     60     }
     61   }
     62 #elif defined(OS_ANDROID)
     63   return GPUTestConfig::kOsAndroid;
     64 #endif
     65   return GPUTestConfig::kOsUnknown;
     66 }
     67 
     68 }  // namespace anonymous
     69 
     70 GPUTestConfig::GPUTestConfig()
     71     : validate_gpu_info_(true),
     72       os_(kOsUnknown),
     73       gpu_device_id_(0),
     74       build_type_(kBuildTypeUnknown) {
     75 }
     76 
     77 GPUTestConfig::~GPUTestConfig() {
     78 }
     79 
     80 void GPUTestConfig::set_os(int32 os) {
     81   DCHECK_EQ(0, os & ~(kOsAndroid | kOsWin | kOsMac | kOsLinux | kOsChromeOS));
     82   os_ = os;
     83 }
     84 
     85 void GPUTestConfig::AddGPUVendor(uint32 gpu_vendor) {
     86   DCHECK_NE(0u, gpu_vendor);
     87   for (size_t i = 0; i < gpu_vendor_.size(); ++i)
     88     DCHECK_NE(gpu_vendor_[i], gpu_vendor);
     89   gpu_vendor_.push_back(gpu_vendor);
     90 }
     91 
     92 void GPUTestConfig::set_gpu_device_id(uint32 id) {
     93   gpu_device_id_ = id;
     94 }
     95 
     96 void GPUTestConfig::set_build_type(int32 build_type) {
     97   DCHECK_EQ(0, build_type & ~(kBuildTypeRelease | kBuildTypeDebug));
     98   build_type_ = build_type;
     99 }
    100 
    101 bool GPUTestConfig::IsValid() const {
    102   if (!validate_gpu_info_)
    103     return true;
    104   if (gpu_device_id_ != 0 && (gpu_vendor_.size() != 1 || gpu_vendor_[0] == 0))
    105     return false;
    106   return true;
    107 }
    108 
    109 bool GPUTestConfig::OverlapsWith(const GPUTestConfig& config) const {
    110   DCHECK(IsValid());
    111   DCHECK(config.IsValid());
    112   if (config.os_ != kOsUnknown && os_ != kOsUnknown &&
    113       (os_ & config.os_) == 0)
    114     return false;
    115   if (config.gpu_vendor_.size() > 0 && gpu_vendor_.size() > 0) {
    116     bool shared = false;
    117     for (size_t i = 0; i < config.gpu_vendor_.size() && !shared; ++i) {
    118       for (size_t j = 0; j < gpu_vendor_.size(); ++j) {
    119         if (config.gpu_vendor_[i] == gpu_vendor_[j]) {
    120           shared = true;
    121           break;
    122         }
    123       }
    124     }
    125     if (!shared)
    126       return false;
    127   }
    128   if (config.gpu_device_id_ != 0 && gpu_device_id_ != 0 &&
    129       gpu_device_id_ != config.gpu_device_id_)
    130     return false;
    131   if (config.build_type_ != kBuildTypeUnknown &&
    132       build_type_ != kBuildTypeUnknown &&
    133       (build_type_ & config.build_type_) == 0)
    134     return false;
    135   return true;
    136 }
    137 
    138 void GPUTestConfig::DisableGPUInfoValidation() {
    139   validate_gpu_info_ = false;
    140 }
    141 
    142 void GPUTestConfig::ClearGPUVendor() {
    143   gpu_vendor_.clear();
    144 }
    145 
    146 GPUTestBotConfig::~GPUTestBotConfig() {
    147 }
    148 
    149 void GPUTestBotConfig::AddGPUVendor(uint32 gpu_vendor) {
    150   DCHECK_EQ(0u, GPUTestConfig::gpu_vendor().size());
    151   GPUTestConfig::AddGPUVendor(gpu_vendor);
    152 }
    153 
    154 bool GPUTestBotConfig::SetGPUInfo(const GPUInfo& gpu_info) {
    155   DCHECK(validate_gpu_info_);
    156   if (gpu_info.gpu.device_id == 0 || gpu_info.gpu.vendor_id == 0)
    157     return false;
    158   ClearGPUVendor();
    159   AddGPUVendor(gpu_info.gpu.vendor_id);
    160   set_gpu_device_id(gpu_info.gpu.device_id);
    161   return true;
    162 }
    163 
    164 bool GPUTestBotConfig::IsValid() const {
    165   switch (os()) {
    166     case kOsWinXP:
    167     case kOsWinVista:
    168     case kOsWin7:
    169     case kOsWin8:
    170     case kOsMacLeopard:
    171     case kOsMacSnowLeopard:
    172     case kOsMacLion:
    173     case kOsMacMountainLion:
    174     case kOsMacMavericks:
    175     case kOsLinux:
    176     case kOsChromeOS:
    177     case kOsAndroid:
    178       break;
    179     default:
    180       return false;
    181   }
    182   if (validate_gpu_info_) {
    183     if (gpu_vendor().size() != 1 || gpu_vendor()[0] == 0)
    184       return false;
    185     if (gpu_device_id() == 0)
    186       return false;
    187   }
    188   switch (build_type()) {
    189     case kBuildTypeRelease:
    190     case kBuildTypeDebug:
    191       break;
    192     default:
    193       return false;
    194   }
    195   return true;
    196 }
    197 
    198 bool GPUTestBotConfig::Matches(const GPUTestConfig& config) const {
    199   DCHECK(IsValid());
    200   DCHECK(config.IsValid());
    201   if (config.os() != kOsUnknown && (os() & config.os()) == 0)
    202     return false;
    203   if (config.gpu_vendor().size() > 0) {
    204     bool contained = false;
    205     for (size_t i = 0; i < config.gpu_vendor().size(); ++i) {
    206       if (config.gpu_vendor()[i] == gpu_vendor()[0]) {
    207         contained = true;
    208         break;
    209       }
    210     }
    211     if (!contained)
    212       return false;
    213   }
    214   if (config.gpu_device_id() != 0 &&
    215       gpu_device_id() != config.gpu_device_id())
    216     return false;
    217   if (config.build_type() != kBuildTypeUnknown &&
    218       (build_type() & config.build_type()) == 0)
    219     return false;
    220   return true;
    221 }
    222 
    223 bool GPUTestBotConfig::Matches(const std::string& config_data) const {
    224   GPUTestExpectationsParser parser;
    225   GPUTestConfig config;
    226 
    227   if (!parser.ParseConfig(config_data, &config))
    228     return false;
    229   return Matches(config);
    230 }
    231 
    232 bool GPUTestBotConfig::LoadCurrentConfig(const GPUInfo* gpu_info) {
    233   bool rt;
    234   if (gpu_info == NULL) {
    235     GPUInfo my_gpu_info;
    236     CollectInfoResult result = CollectGpuID(
    237         &my_gpu_info.gpu.vendor_id, &my_gpu_info.gpu.device_id);
    238     if (result != kCollectInfoSuccess) {
    239       LOG(ERROR) << "Fail to identify GPU";
    240       DisableGPUInfoValidation();
    241       rt = true;
    242     } else {
    243       rt = SetGPUInfo(my_gpu_info);
    244     }
    245   } else {
    246     rt = SetGPUInfo(*gpu_info);
    247   }
    248   set_os(GetCurrentOS());
    249   if (os() == kOsUnknown) {
    250     LOG(ERROR) << "Unknown OS";
    251     rt = false;
    252   }
    253 #if defined(NDEBUG)
    254   set_build_type(kBuildTypeRelease);
    255 #else
    256   set_build_type(kBuildTypeDebug);
    257 #endif
    258   return rt;
    259 }
    260 
    261 // static
    262 bool GPUTestBotConfig::CurrentConfigMatches(const std::string& config_data) {
    263   GPUTestBotConfig my_config;
    264   if (!my_config.LoadCurrentConfig(NULL))
    265     return false;
    266   return my_config.Matches(config_data);
    267 }
    268 
    269 // static
    270 bool GPUTestBotConfig::CurrentConfigMatches(
    271     const std::vector<std::string>& configs) {
    272   GPUTestBotConfig my_config;
    273   if (!my_config.LoadCurrentConfig(NULL))
    274     return false;
    275   for (size_t i = 0 ; i < configs.size(); ++i) {
    276     if (my_config.Matches(configs[i]))
    277       return true;
    278   }
    279   return false;
    280 }
    281 
    282 // static
    283 bool GPUTestBotConfig::GpuBlacklistedOnBot() {
    284 #if defined(OS_MACOSX)
    285   // Blacklist rule #81 disables all Gpu acceleration on Mac < 10.8 bots.
    286   if (CurrentConfigMatches("MAC VMWARE") && base::mac::IsOSLionOrEarlier()) {
    287     return true;
    288   }
    289 #elif defined(OS_WIN)
    290   // Blacklist rule #79 disables all Gpu acceleration before Windows 7.
    291   if (base::win::GetVersion() <= base::win::VERSION_VISTA) {
    292     return true;
    293   }
    294 #endif
    295   return false;
    296 }
    297 
    298 }  // namespace gpu
    299 
    300