#include "chrome/browser/chrome_gpu_util.h"
#include "base/command_line.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
#include "base/version.h"
#if defined(OS_WIN)
#include "base/win/windows_version.h"
#endif
#include "chrome/common/chrome_switches.h"
#include "chrome/common/chrome_version_info.h"
#include "content/public/browser/gpu_data_manager.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/content_switches.h"
using content::GpuDataManager;
namespace gpu_util {
bool ShouldRunStage3DFieldTrial() {
#if !defined(OS_WIN)
return false;
#else
if (base::win::GetVersion() >= base::win::VERSION_VISTA)
return false;
return true;
#endif
}
void InitializeStage3DFieldTrial() {
if (!ShouldRunStage3DFieldTrial()) {
base::FieldTrial* trial =
base::FieldTrialList::Find(content::kStage3DFieldTrialName);
if (trial)
trial->Disable();
return;
}
const base::FieldTrial::Probability kDivisor = 1000;
scoped_refptr<base::FieldTrial> trial(
base::FieldTrialList::FactoryGetFieldTrial(
content::kStage3DFieldTrialName, kDivisor,
content::kStage3DFieldTrialEnabledName, 2013, 3, 1, NULL));
trial->UseOneTimeRandomization();
int blacklisted_group = trial->AppendGroup(
content::kStage3DFieldTrialBlacklistedName, kDivisor);
bool enabled = (trial->group() != blacklisted_group);
UMA_HISTOGRAM_BOOLEAN("GPU.Stage3DFieldTrial", enabled);
}
void DisableCompositingFieldTrial() {
base::FieldTrial* trial =
base::FieldTrialList::Find(content::kGpuCompositingFieldTrialName);
if (trial)
trial->Disable();
}
bool ShouldRunCompositingFieldTrial() {
#if !(defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX))
return false;
#endif
#if defined(OS_WIN)
if (base::win::GetVersion() < base::win::VERSION_VISTA)
return false;
#endif
if (content::GpuDataManager::GetInstance()->ShouldUseSoftwareRendering())
return false;
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableForceCompositingMode))
return false;
return true;
}
void InitializeCompositingFieldTrial() {
if (!ShouldRunCompositingFieldTrial()) {
DisableCompositingFieldTrial();
return;
}
const base::FieldTrial::Probability kDivisor = 3;
scoped_refptr<base::FieldTrial> trial(
base::FieldTrialList::FactoryGetFieldTrial(
content::kGpuCompositingFieldTrialName, kDivisor,
"disable", 2012, 12, 31, NULL));
trial->UseOneTimeRandomization();
base::FieldTrial::Probability force_compositing_mode_probability = 0;
base::FieldTrial::Probability threaded_compositing_probability = 0;
chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
if (channel == chrome::VersionInfo::CHANNEL_STABLE ||
channel == chrome::VersionInfo::CHANNEL_BETA) {
#if defined(OS_WIN) || defined(OS_MACOSX)
force_compositing_mode_probability = 3;
#endif
} else if (channel == chrome::VersionInfo::CHANNEL_DEV ||
channel == chrome::VersionInfo::CHANNEL_CANARY) {
force_compositing_mode_probability = 1;
#if defined(OS_MACOSX) || defined(OS_LINUX)
threaded_compositing_probability = 0;
#else
if (!CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableThreadedCompositing))
threaded_compositing_probability = 1;
#endif
}
int force_compositing_group = trial->AppendGroup(
content::kGpuCompositingFieldTrialForceCompositingEnabledName,
force_compositing_mode_probability);
int thread_group = trial->AppendGroup(
content::kGpuCompositingFieldTrialThreadEnabledName,
threaded_compositing_probability);
bool force_compositing = (trial->group() == force_compositing_group);
bool thread = (trial->group() == thread_group);
UMA_HISTOGRAM_BOOLEAN("GPU.InForceCompositingModeFieldTrial",
force_compositing);
UMA_HISTOGRAM_BOOLEAN("GPU.InCompositorThreadFieldTrial", thread);
}
}