Commit 312c692a authored by Mohsen Izadi's avatar Mohsen Izadi Committed by Commit Bot

Add gpu::DomainGuilt to //gpu/config/

It replaces content::GpuDataManagerImpl::DomainGuilt and
viz::GpuHostImpl::Delegate::DomainGuilt.

BUG=709332

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel
Change-Id: I5a802e53ec770835954b77ba62e9fe9920377381
Reviewed-on: https://chromium-review.googlesource.com/1201704Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Commit-Queue: Mohsen Izadi <mohsen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589513}
parent 8355de45
...@@ -187,7 +187,7 @@ void GpuHostImpl::BlockLiveOffscreenContexts() { ...@@ -187,7 +187,7 @@ void GpuHostImpl::BlockLiveOffscreenContexts() {
for (auto iter = urls_with_live_offscreen_contexts_.begin(); for (auto iter = urls_with_live_offscreen_contexts_.begin();
iter != urls_with_live_offscreen_contexts_.end(); ++iter) { iter != urls_with_live_offscreen_contexts_.end(); ++iter) {
delegate_->BlockDomainFrom3DAPIs(*iter, Delegate::DomainGuilt::kUnknown); delegate_->BlockDomainFrom3DAPIs(*iter, gpu::DomainGuilt::kUnknown);
} }
} }
...@@ -499,10 +499,10 @@ void GpuHostImpl::DidLoseContext(bool offscreen, ...@@ -499,10 +499,10 @@ void GpuHostImpl::DidLoseContext(bool offscreen,
return; return;
} }
Delegate::DomainGuilt guilt = Delegate::DomainGuilt::kUnknown; gpu::DomainGuilt guilt = gpu::DomainGuilt::kUnknown;
switch (reason) { switch (reason) {
case gpu::error::kGuilty: case gpu::error::kGuilty:
guilt = Delegate::DomainGuilt::kKnown; guilt = gpu::DomainGuilt::kKnown;
break; break;
// Treat most other error codes as though they had unknown provenance. // Treat most other error codes as though they had unknown provenance.
// In practice this doesn't affect the user experience. A lost context // In practice this doesn't affect the user experience. A lost context
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h" #include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
#include "components/viz/host/viz_host_export.h" #include "components/viz/host/viz_host_export.h"
#include "gpu/command_buffer/common/activity_flags.h" #include "gpu/command_buffer/common/activity_flags.h"
#include "gpu/config/gpu_domain_guilt.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/message_pipe.h"
#include "services/viz/privileged/interfaces/compositing/frame_sink_manager.mojom.h" #include "services/viz/privileged/interfaces/compositing/frame_sink_manager.mojom.h"
...@@ -49,15 +50,6 @@ class VIZ_HOST_EXPORT GpuHostImpl : public mojom::GpuHost { ...@@ -49,15 +50,6 @@ class VIZ_HOST_EXPORT GpuHostImpl : public mojom::GpuHost {
public: public:
class VIZ_HOST_EXPORT Delegate { class VIZ_HOST_EXPORT Delegate {
public: public:
// Indicates the guilt level of a domain which caused a GPU reset.
// If a domain is 100% known to be guilty of resetting the GPU, then
// it will generally not cause other domains' use of 3D APIs to be
// blocked, unless system stability would be compromised.
enum class DomainGuilt {
kKnown,
kUnknown,
};
virtual gpu::GPUInfo GetGPUInfo() const = 0; virtual gpu::GPUInfo GetGPUInfo() const = 0;
virtual gpu::GpuFeatureInfo GetGpuFeatureInfo() const = 0; virtual gpu::GpuFeatureInfo GetGpuFeatureInfo() const = 0;
virtual void UpdateGpuInfo( virtual void UpdateGpuInfo(
...@@ -68,7 +60,8 @@ class VIZ_HOST_EXPORT GpuHostImpl : public mojom::GpuHost { ...@@ -68,7 +60,8 @@ class VIZ_HOST_EXPORT GpuHostImpl : public mojom::GpuHost {
gpu_feature_info_for_hardware_gpu) = 0; gpu_feature_info_for_hardware_gpu) = 0;
virtual void DidFailInitialize() = 0; virtual void DidFailInitialize() = 0;
virtual void DidCreateContextSuccessfully() = 0; virtual void DidCreateContextSuccessfully() = 0;
virtual void BlockDomainFrom3DAPIs(const GURL& url, DomainGuilt guilt) = 0; virtual void BlockDomainFrom3DAPIs(const GURL& url,
gpu::DomainGuilt guilt) = 0;
virtual void DisableGpuCompositing() = 0; virtual void DisableGpuCompositing() = 0;
virtual bool GpuAccessAllowed() const = 0; virtual bool GpuAccessAllowed() const = 0;
virtual gpu::ShaderCacheFactory* GetShaderCacheFactory() = 0; virtual gpu::ShaderCacheFactory* GetShaderCacheFactory() = 0;
......
...@@ -162,8 +162,8 @@ void GpuDataManagerImpl::HandleGpuSwitch() { ...@@ -162,8 +162,8 @@ void GpuDataManagerImpl::HandleGpuSwitch() {
private_->HandleGpuSwitch(); private_->HandleGpuSwitch();
} }
void GpuDataManagerImpl::BlockDomainFrom3DAPIs( void GpuDataManagerImpl::BlockDomainFrom3DAPIs(const GURL& url,
const GURL& url, DomainGuilt guilt) { gpu::DomainGuilt guilt) {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
private_->BlockDomainFrom3DAPIs(url, guilt); private_->BlockDomainFrom3DAPIs(url, guilt);
} }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "content/public/browser/gpu_data_manager.h" #include "content/public/browser/gpu_data_manager.h"
#include "content/public/common/three_d_api_types.h" #include "content/public/common/three_d_api_types.h"
#include "gpu/config/gpu_control_list.h" #include "gpu/config/gpu_control_list.h"
#include "gpu/config/gpu_domain_guilt.h"
#include "gpu/config/gpu_feature_info.h" #include "gpu/config/gpu_feature_info.h"
#include "gpu/config/gpu_info.h" #include "gpu/config/gpu_info.h"
#include "gpu/config/gpu_mode.h" #include "gpu/config/gpu_mode.h"
...@@ -43,24 +44,6 @@ class GpuDataManagerImplPrivate; ...@@ -43,24 +44,6 @@ class GpuDataManagerImplPrivate;
class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager { class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager {
public: public:
// Indicates the guilt level of a domain which caused a GPU reset.
// If a domain is 100% known to be guilty of resetting the GPU, then
// it will generally not cause other domains' use of 3D APIs to be
// blocked, unless system stability would be compromised.
enum DomainGuilt {
DOMAIN_GUILT_KNOWN,
DOMAIN_GUILT_UNKNOWN
};
// Indicates the reason that access to a given client API (like
// WebGL or Pepper 3D) was blocked or not. This state is distinct
// from blacklisting of an entire feature.
enum DomainBlockStatus {
DOMAIN_BLOCK_STATUS_BLOCKED,
DOMAIN_BLOCK_STATUS_ALL_DOMAINS_BLOCKED,
DOMAIN_BLOCK_STATUS_NOT_BLOCKED
};
// Getter for the singleton. This will return NULL on failure. // Getter for the singleton. This will return NULL on failure.
static GpuDataManagerImpl* GetInstance(); static GpuDataManagerImpl* GetInstance();
...@@ -132,7 +115,7 @@ class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager { ...@@ -132,7 +115,7 @@ class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager {
// //
// The given URL may be a partial URL (including at least the host) // The given URL may be a partial URL (including at least the host)
// or a full URL to a page. // or a full URL to a page.
void BlockDomainFrom3DAPIs(const GURL& url, DomainGuilt guilt); void BlockDomainFrom3DAPIs(const GURL& url, gpu::DomainGuilt guilt);
bool Are3DAPIsBlocked(const GURL& top_origin_url, bool Are3DAPIsBlocked(const GURL& top_origin_url,
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
......
...@@ -705,8 +705,8 @@ bool GpuDataManagerImplPrivate::UpdateActiveGpu(uint32_t vendor_id, ...@@ -705,8 +705,8 @@ bool GpuDataManagerImplPrivate::UpdateActiveGpu(uint32_t vendor_id,
return true; return true;
} }
void GpuDataManagerImplPrivate::BlockDomainFrom3DAPIs( void GpuDataManagerImplPrivate::BlockDomainFrom3DAPIs(const GURL& url,
const GURL& url, GpuDataManagerImpl::DomainGuilt guilt) { gpu::DomainGuilt guilt) {
BlockDomainFrom3DAPIsAtTime(url, guilt, base::Time::Now()); BlockDomainFrom3DAPIsAtTime(url, guilt, base::Time::Now());
} }
...@@ -715,7 +715,7 @@ bool GpuDataManagerImplPrivate::Are3DAPIsBlocked(const GURL& top_origin_url, ...@@ -715,7 +715,7 @@ bool GpuDataManagerImplPrivate::Are3DAPIsBlocked(const GURL& top_origin_url,
int render_frame_id, int render_frame_id,
ThreeDAPIType requester) { ThreeDAPIType requester) {
return Are3DAPIsBlockedAtTime(top_origin_url, base::Time::Now()) != return Are3DAPIsBlockedAtTime(top_origin_url, base::Time::Now()) !=
GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED; DomainBlockStatus::kNotBlocked;
} }
void GpuDataManagerImplPrivate::DisableDomainBlockingFor3DAPIsForTesting() { void GpuDataManagerImplPrivate::DisableDomainBlockingFor3DAPIsForTesting() {
...@@ -755,35 +755,33 @@ std::string GpuDataManagerImplPrivate::GetDomainFromURL(const GURL& url) const { ...@@ -755,35 +755,33 @@ std::string GpuDataManagerImplPrivate::GetDomainFromURL(const GURL& url) const {
void GpuDataManagerImplPrivate::BlockDomainFrom3DAPIsAtTime( void GpuDataManagerImplPrivate::BlockDomainFrom3DAPIsAtTime(
const GURL& url, const GURL& url,
GpuDataManagerImpl::DomainGuilt guilt, gpu::DomainGuilt guilt,
base::Time at_time) { base::Time at_time) {
if (!domain_blocking_enabled_) if (!domain_blocking_enabled_)
return; return;
std::string domain = GetDomainFromURL(url); std::string domain = GetDomainFromURL(url);
DomainBlockEntry& entry = blocked_domains_[domain]; blocked_domains_[domain] = guilt;
entry.last_guilt = guilt;
timestamps_of_gpu_resets_.push_back(at_time); timestamps_of_gpu_resets_.push_back(at_time);
} }
GpuDataManagerImpl::DomainBlockStatus GpuDataManagerImplPrivate::DomainBlockStatus
GpuDataManagerImplPrivate::Are3DAPIsBlockedAtTime( GpuDataManagerImplPrivate::Are3DAPIsBlockedAtTime(const GURL& url,
const GURL& url, base::Time at_time) const { base::Time at_time) const {
if (!domain_blocking_enabled_) if (!domain_blocking_enabled_)
return GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED; return DomainBlockStatus::kNotBlocked;
// Note: adjusting the policies in this code will almost certainly // Note: adjusting the policies in this code will almost certainly
// require adjusting the associated unit tests. // require adjusting the associated unit tests.
std::string domain = GetDomainFromURL(url); std::string domain = GetDomainFromURL(url);
{ {
DomainBlockMap::const_iterator iter = blocked_domains_.find(domain); if (blocked_domains_.find(domain) != blocked_domains_.end()) {
if (iter != blocked_domains_.end()) {
// Err on the side of caution, and assume that if a particular // Err on the side of caution, and assume that if a particular
// domain shows up in the block map, it's there for a good // domain shows up in the block map, it's there for a good
// reason and don't let its presence there automatically expire. // reason and don't let its presence there automatically expire.
return GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED; return DomainBlockStatus::kBlocked;
} }
} }
...@@ -816,7 +814,7 @@ GpuDataManagerImplPrivate::Are3DAPIsBlockedAtTime( ...@@ -816,7 +814,7 @@ GpuDataManagerImplPrivate::Are3DAPIsBlockedAtTime(
BLOCK_STATUS_ALL_DOMAINS_BLOCKED, BLOCK_STATUS_ALL_DOMAINS_BLOCKED,
BLOCK_STATUS_MAX); BLOCK_STATUS_MAX);
return GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_ALL_DOMAINS_BLOCKED; return DomainBlockStatus::kAllDomainsBlocked;
} }
} }
...@@ -824,7 +822,7 @@ GpuDataManagerImplPrivate::Are3DAPIsBlockedAtTime( ...@@ -824,7 +822,7 @@ GpuDataManagerImplPrivate::Are3DAPIsBlockedAtTime(
BLOCK_STATUS_NOT_BLOCKED, BLOCK_STATUS_NOT_BLOCKED,
BLOCK_STATUS_MAX); BLOCK_STATUS_MAX);
return GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED; return DomainBlockStatus::kNotBlocked;
} }
int64_t GpuDataManagerImplPrivate::GetBlockAllDomainsDurationInMs() const { int64_t GpuDataManagerImplPrivate::GetBlockAllDomainsDurationInMs() const {
......
...@@ -83,8 +83,7 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate { ...@@ -83,8 +83,7 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
void HandleGpuSwitch(); void HandleGpuSwitch();
void BlockDomainFrom3DAPIs( void BlockDomainFrom3DAPIs(const GURL& url, gpu::DomainGuilt guilt);
const GURL& url, GpuDataManagerImpl::DomainGuilt guilt);
bool Are3DAPIsBlocked(const GURL& top_origin_url, bool Are3DAPIsBlocked(const GURL& top_origin_url,
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
...@@ -125,11 +124,16 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate { ...@@ -125,11 +124,16 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplPrivateTest, FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplPrivateTest,
UnblockThisDomainFrom3DAPIs); UnblockThisDomainFrom3DAPIs);
struct DomainBlockEntry { // Indicates the reason that access to a given client API (like
GpuDataManagerImpl::DomainGuilt last_guilt; // WebGL or Pepper 3D) was blocked or not. This state is distinct
// from blacklisting of an entire feature.
enum class DomainBlockStatus {
kBlocked,
kAllDomainsBlocked,
kNotBlocked,
}; };
using DomainBlockMap = std::map<std::string, DomainBlockEntry>; using DomainGuiltMap = std::map<std::string, gpu::DomainGuilt>;
using GpuDataManagerObserverList = using GpuDataManagerObserverList =
base::ObserverListThreadSafe<GpuDataManagerObserver>; base::ObserverListThreadSafe<GpuDataManagerObserver>;
...@@ -157,10 +161,10 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate { ...@@ -157,10 +161,10 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
// Implementation functions for blocking of 3D graphics APIs, used // Implementation functions for blocking of 3D graphics APIs, used
// for unit testing. // for unit testing.
void BlockDomainFrom3DAPIsAtTime(const GURL& url, void BlockDomainFrom3DAPIsAtTime(const GURL& url,
GpuDataManagerImpl::DomainGuilt guilt, gpu::DomainGuilt guilt,
base::Time at_time); base::Time at_time);
GpuDataManagerImpl::DomainBlockStatus Are3DAPIsBlockedAtTime( DomainBlockStatus Are3DAPIsBlockedAtTime(const GURL& url,
const GURL& url, base::Time at_time) const; base::Time at_time) const;
int64_t GetBlockAllDomainsDurationInMs() const; int64_t GetBlockAllDomainsDurationInMs() const;
// This is platform specific. At the moment: // This is platform specific. At the moment:
...@@ -197,7 +201,7 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate { ...@@ -197,7 +201,7 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
// they cause random failures. // they cause random failures.
bool update_histograms_ = true; bool update_histograms_ = true;
DomainBlockMap blocked_domains_; DomainGuiltMap blocked_domains_;
mutable std::list<base::Time> timestamps_of_gpu_resets_; mutable std::list<base::Time> timestamps_of_gpu_resets_;
bool domain_blocking_enabled_ = true; bool domain_blocking_enabled_ = true;
......
...@@ -94,10 +94,8 @@ class GpuDataManagerImplPrivateTest : public testing::Test { ...@@ -94,10 +94,8 @@ class GpuDataManagerImplPrivateTest : public testing::Test {
base::Time JustBeforeExpiration(const GpuDataManagerImplPrivate* manager); base::Time JustBeforeExpiration(const GpuDataManagerImplPrivate* manager);
base::Time JustAfterExpiration(const GpuDataManagerImplPrivate* manager); base::Time JustAfterExpiration(const GpuDataManagerImplPrivate* manager);
void TestBlockingDomainFrom3DAPIs( void TestBlockingDomainFrom3DAPIs(gpu::DomainGuilt guilt_level);
GpuDataManagerImpl::DomainGuilt guilt_level); void TestUnblockingDomainFrom3DAPIs(gpu::DomainGuilt guilt_level);
void TestUnblockingDomainFrom3DAPIs(
GpuDataManagerImpl::DomainGuilt guilt_level);
base::MessageLoop message_loop_; base::MessageLoop message_loop_;
}; };
...@@ -141,7 +139,7 @@ base::Time GpuDataManagerImplPrivateTest::JustAfterExpiration( ...@@ -141,7 +139,7 @@ base::Time GpuDataManagerImplPrivateTest::JustAfterExpiration(
} }
void GpuDataManagerImplPrivateTest::TestBlockingDomainFrom3DAPIs( void GpuDataManagerImplPrivateTest::TestBlockingDomainFrom3DAPIs(
GpuDataManagerImpl::DomainGuilt guilt_level) { gpu::DomainGuilt guilt_level) {
ScopedGpuDataManagerImplPrivate manager; ScopedGpuDataManagerImplPrivate manager;
manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(), manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
...@@ -149,19 +147,19 @@ void GpuDataManagerImplPrivateTest::TestBlockingDomainFrom3DAPIs( ...@@ -149,19 +147,19 @@ void GpuDataManagerImplPrivateTest::TestBlockingDomainFrom3DAPIs(
GetTimeForTesting()); GetTimeForTesting());
// This domain should be blocked no matter what. // This domain should be blocked no matter what.
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kBlocked,
manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(), manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
GetTimeForTesting())); GetTimeForTesting()));
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain1ForTesting(), JustBeforeExpiration(manager.get()))); GetDomain1ForTesting(), JustBeforeExpiration(manager.get())));
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain1ForTesting(), JustAfterExpiration(manager.get()))); GetDomain1ForTesting(), JustAfterExpiration(manager.get())));
} }
void GpuDataManagerImplPrivateTest::TestUnblockingDomainFrom3DAPIs( void GpuDataManagerImplPrivateTest::TestUnblockingDomainFrom3DAPIs(
GpuDataManagerImpl::DomainGuilt guilt_level) { gpu::DomainGuilt guilt_level) {
ScopedGpuDataManagerImplPrivate manager; ScopedGpuDataManagerImplPrivate manager;
manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(), manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
...@@ -170,64 +168,62 @@ void GpuDataManagerImplPrivateTest::TestUnblockingDomainFrom3DAPIs( ...@@ -170,64 +168,62 @@ void GpuDataManagerImplPrivateTest::TestUnblockingDomainFrom3DAPIs(
// Unblocking the domain should work. // Unblocking the domain should work.
manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting()); manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting());
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kNotBlocked,
manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(), manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
GetTimeForTesting())); GetTimeForTesting()));
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kNotBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain1ForTesting(), JustBeforeExpiration(manager.get()))); GetDomain1ForTesting(), JustBeforeExpiration(manager.get())));
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kNotBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain1ForTesting(), JustAfterExpiration(manager.get()))); GetDomain1ForTesting(), JustAfterExpiration(manager.get())));
} }
TEST_F(GpuDataManagerImplPrivateTest, BlockGuiltyDomainFrom3DAPIs) { TEST_F(GpuDataManagerImplPrivateTest, BlockGuiltyDomainFrom3DAPIs) {
TestBlockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_KNOWN); TestBlockingDomainFrom3DAPIs(gpu::DomainGuilt::kKnown);
} }
TEST_F(GpuDataManagerImplPrivateTest, BlockDomainOfUnknownGuiltFrom3DAPIs) { TEST_F(GpuDataManagerImplPrivateTest, BlockDomainOfUnknownGuiltFrom3DAPIs) {
TestBlockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN); TestBlockingDomainFrom3DAPIs(gpu::DomainGuilt::kUnknown);
} }
TEST_F(GpuDataManagerImplPrivateTest, BlockAllDomainsFrom3DAPIs) { TEST_F(GpuDataManagerImplPrivateTest, BlockAllDomainsFrom3DAPIs) {
ScopedGpuDataManagerImplPrivate manager; ScopedGpuDataManagerImplPrivate manager;
manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(), manager->BlockDomainFrom3DAPIsAtTime(
GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN, GetDomain1ForTesting(), gpu::DomainGuilt::kUnknown, GetTimeForTesting());
GetTimeForTesting());
// Blocking of other domains should expire. // Blocking of other domains should expire.
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_ALL_DOMAINS_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kAllDomainsBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain2ForTesting(), JustBeforeExpiration(manager.get()))); GetDomain2ForTesting(), JustBeforeExpiration(manager.get())));
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kNotBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain2ForTesting(), JustAfterExpiration(manager.get()))); GetDomain2ForTesting(), JustAfterExpiration(manager.get())));
} }
TEST_F(GpuDataManagerImplPrivateTest, UnblockGuiltyDomainFrom3DAPIs) { TEST_F(GpuDataManagerImplPrivateTest, UnblockGuiltyDomainFrom3DAPIs) {
TestUnblockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_KNOWN); TestUnblockingDomainFrom3DAPIs(gpu::DomainGuilt::kKnown);
} }
TEST_F(GpuDataManagerImplPrivateTest, UnblockDomainOfUnknownGuiltFrom3DAPIs) { TEST_F(GpuDataManagerImplPrivateTest, UnblockDomainOfUnknownGuiltFrom3DAPIs) {
TestUnblockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN); TestUnblockingDomainFrom3DAPIs(gpu::DomainGuilt::kUnknown);
} }
TEST_F(GpuDataManagerImplPrivateTest, UnblockOtherDomainFrom3DAPIs) { TEST_F(GpuDataManagerImplPrivateTest, UnblockOtherDomainFrom3DAPIs) {
ScopedGpuDataManagerImplPrivate manager; ScopedGpuDataManagerImplPrivate manager;
manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(), manager->BlockDomainFrom3DAPIsAtTime(
GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN, GetDomain1ForTesting(), gpu::DomainGuilt::kUnknown, GetTimeForTesting());
GetTimeForTesting());
manager->UnblockDomainFrom3DAPIs(GetDomain2ForTesting()); manager->UnblockDomainFrom3DAPIs(GetDomain2ForTesting());
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kNotBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain2ForTesting(), JustBeforeExpiration(manager.get()))); GetDomain2ForTesting(), JustBeforeExpiration(manager.get())));
// The original domain should still be blocked. // The original domain should still be blocked.
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain1ForTesting(), JustBeforeExpiration(manager.get()))); GetDomain1ForTesting(), JustBeforeExpiration(manager.get())));
} }
...@@ -235,15 +231,14 @@ TEST_F(GpuDataManagerImplPrivateTest, UnblockOtherDomainFrom3DAPIs) { ...@@ -235,15 +231,14 @@ TEST_F(GpuDataManagerImplPrivateTest, UnblockOtherDomainFrom3DAPIs) {
TEST_F(GpuDataManagerImplPrivateTest, UnblockThisDomainFrom3DAPIs) { TEST_F(GpuDataManagerImplPrivateTest, UnblockThisDomainFrom3DAPIs) {
ScopedGpuDataManagerImplPrivate manager; ScopedGpuDataManagerImplPrivate manager;
manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(), manager->BlockDomainFrom3DAPIsAtTime(
GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN, GetDomain1ForTesting(), gpu::DomainGuilt::kUnknown, GetTimeForTesting());
GetTimeForTesting());
manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting()); manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting());
// This behavior is debatable. Perhaps the GPU reset caused by // This behavior is debatable. Perhaps the GPU reset caused by
// domain 1 should still cause other domains to be blocked. // domain 1 should still cause other domains to be blocked.
EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED, EXPECT_EQ(GpuDataManagerImplPrivate::DomainBlockStatus::kNotBlocked,
manager->Are3DAPIsBlockedAtTime( manager->Are3DAPIsBlockedAtTime(
GetDomain2ForTesting(), JustBeforeExpiration(manager.get()))); GetDomain2ForTesting(), JustBeforeExpiration(manager.get())));
} }
......
...@@ -945,17 +945,9 @@ void GpuProcessHost::DidCreateContextSuccessfully() { ...@@ -945,17 +945,9 @@ void GpuProcessHost::DidCreateContextSuccessfully() {
#endif #endif
} }
void GpuProcessHost::BlockDomainFrom3DAPIs(const GURL& url, DomainGuilt guilt) { void GpuProcessHost::BlockDomainFrom3DAPIs(const GURL& url,
GpuDataManagerImpl::DomainGuilt gpu_data_manager_guilt; gpu::DomainGuilt guilt) {
switch (guilt) { GpuDataManagerImpl::GetInstance()->BlockDomainFrom3DAPIs(url, guilt);
case DomainGuilt::kKnown:
gpu_data_manager_guilt = GpuDataManagerImpl::DOMAIN_GUILT_KNOWN;
break;
case DomainGuilt::kUnknown:
gpu_data_manager_guilt = GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN;
}
GpuDataManagerImpl::GetInstance()->BlockDomainFrom3DAPIs(
url, gpu_data_manager_guilt);
} }
bool GpuProcessHost::GpuAccessAllowed() const { bool GpuProcessHost::GpuAccessAllowed() const {
......
...@@ -144,7 +144,7 @@ class GpuProcessHost : public BrowserChildProcessHostDelegate, ...@@ -144,7 +144,7 @@ class GpuProcessHost : public BrowserChildProcessHostDelegate,
gpu_feature_info_for_hardware_gpu) override; gpu_feature_info_for_hardware_gpu) override;
void DidFailInitialize() override; void DidFailInitialize() override;
void DidCreateContextSuccessfully() override; void DidCreateContextSuccessfully() override;
void BlockDomainFrom3DAPIs(const GURL& url, DomainGuilt guilt) override; void BlockDomainFrom3DAPIs(const GURL& url, gpu::DomainGuilt guilt) override;
void DisableGpuCompositing() override; void DisableGpuCompositing() override;
bool GpuAccessAllowed() const override; bool GpuAccessAllowed() const override;
gpu::ShaderCacheFactory* GetShaderCacheFactory() override; gpu::ShaderCacheFactory* GetShaderCacheFactory() override;
......
...@@ -102,6 +102,7 @@ source_set("config_sources") { ...@@ -102,6 +102,7 @@ source_set("config_sources") {
"gpu_control_list.h", "gpu_control_list.h",
"gpu_crash_keys.cc", "gpu_crash_keys.cc",
"gpu_crash_keys.h", "gpu_crash_keys.h",
"gpu_domain_guilt.h",
"gpu_driver_bug_list.cc", "gpu_driver_bug_list.cc",
"gpu_driver_bug_list.h", "gpu_driver_bug_list.h",
"gpu_driver_bug_workaround_type.h", "gpu_driver_bug_workaround_type.h",
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_CONFIG_GPU_DOMAIN_GUILT_H_
#define GPU_CONFIG_GPU_DOMAIN_GUILT_H_
namespace gpu {
// Indicates the guilt level of a domain which caused a GPU reset. If a domain
// is 100% known to be guilty of resetting the GPU, then it will generally not
// cause other domains' use of 3D APIs to be blocked, unless system stability
// would be compromised.
enum class DomainGuilt {
kKnown,
kUnknown,
};
} // namespace gpu
#endif // GPU_CONFIG_GPU_DOMAIN_GUILT_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment