| Index: content/browser/gpu/gpu_data_manager_impl.h
|
| ===================================================================
|
| --- content/browser/gpu/gpu_data_manager_impl.h (revision 207877)
|
| +++ content/browser/gpu/gpu_data_manager_impl.h (working copy)
|
| @@ -1,30 +1,22 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2013 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 CONTENT_BROWSER_GPU_GPU_DATA_MANAGER_IMPL_H_
|
| #define CONTENT_BROWSER_GPU_GPU_DATA_MANAGER_IMPL_H_
|
|
|
| -#include <list>
|
| -#include <map>
|
| -#include <set>
|
| #include <string>
|
| -#include <vector>
|
|
|
| -#include "base/callback.h"
|
| #include "base/compiler_specific.h"
|
| #include "base/files/file_path.h"
|
| #include "base/gtest_prod_util.h"
|
| -#include "base/memory/ref_counted.h"
|
| +#include "base/logging.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| #include "base/memory/singleton.h"
|
| -#include "base/observer_list_threadsafe.h"
|
| #include "base/process_util.h"
|
| #include "base/synchronization/lock.h"
|
| #include "base/time.h"
|
| #include "base/values.h"
|
| -#include "content/browser/gpu/gpu_blacklist.h"
|
| -#include "content/browser/gpu/gpu_driver_bug_list.h"
|
| -#include "content/browser/gpu/gpu_switching_list.h"
|
| #include "content/public/browser/gpu_data_manager.h"
|
| #include "content/public/common/gpu_info.h"
|
| #include "content/public/common/gpu_memory_stats.h"
|
| @@ -37,6 +29,8 @@
|
|
|
| namespace content {
|
|
|
| +class GpuDataManagerImplPrivate;
|
| +
|
| class CONTENT_EXPORT GpuDataManagerImpl
|
| : public NON_EXPORTED_BASE(GpuDataManager) {
|
| public:
|
| @@ -163,134 +157,49 @@
|
| // Disables domain blocking for 3D APIs. For use only in tests.
|
| void DisableDomainBlockingFor3DAPIsForTesting();
|
|
|
| + void Notify3DAPIBlocked(const GURL& url,
|
| + int render_process_id,
|
| + int render_view_id,
|
| + ThreeDAPIType requester);
|
| +
|
| // Get number of features being blacklisted.
|
| size_t GetBlacklistedFeatureCount() const;
|
|
|
| - typedef base::Callback<void()> GpuSwitchCallback;
|
| -
|
| - // Add and remove gpu switch callback.
|
| - void AddGpuSwitchCallback(const GpuSwitchCallback& callback);
|
| - void RemoveGpuSwitchCallback(const GpuSwitchCallback& callback);
|
| -
|
| private:
|
| - struct DomainBlockEntry {
|
| - DomainGuilt last_guilt;
|
| - };
|
| + friend class GpuDataManagerImplPrivate;
|
| + friend class GpuDataManagerImplPrivateTest;
|
| + friend struct DefaultSingletonTraits<GpuDataManagerImpl>;
|
|
|
| - typedef std::map<std::string, DomainBlockEntry> DomainBlockMap;
|
| + // It's similar to AutoUnlock, but we want to make it a no-op
|
| + // if the owner GpuDataManagerImpl is null.
|
| + // This should only be used by GpuDataManagerImplPrivate where
|
| + // callbacks are called, during which re-entering
|
| + // GpuDataManagerImpl is possible.
|
| + class UnlockedSession {
|
| + public:
|
| + explicit UnlockedSession(GpuDataManagerImpl* owner)
|
| + : owner_(owner) {
|
| + DCHECK(owner_);
|
| + owner_->lock_.AssertAcquired();
|
| + owner_->lock_.Release();
|
| + }
|
|
|
| - typedef ObserverListThreadSafe<GpuDataManagerObserver>
|
| - GpuDataManagerObserverList;
|
| + ~UnlockedSession() {
|
| + DCHECK(owner_);
|
| + owner_->lock_.Acquire();
|
| + }
|
|
|
| - friend class GpuDataManagerImplTest;
|
| - friend struct DefaultSingletonTraits<GpuDataManagerImpl>;
|
| + private:
|
| + GpuDataManagerImpl* owner_;
|
| + DISALLOW_COPY_AND_ASSIGN(UnlockedSession);
|
| + };
|
|
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, GpuSideBlacklisting);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, GpuSideExceptions);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - DisableHardwareAcceleration);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, SwiftShaderRendering);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, SwiftShaderRendering2);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, GpuInfoUpdate);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - NoGpuInfoUpdateWithSwiftShader);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - GPUVideoMemoryUsageStatsUpdate);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - BlockAllDomainsFrom3DAPIs);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - UnblockGuiltyDomainFrom3DAPIs);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - UnblockDomainOfUnknownGuiltFrom3DAPIs);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - UnblockOtherDomainFrom3DAPIs);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest,
|
| - UnblockThisDomainFrom3DAPIs);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, GpuDriverBugListSingle);
|
| - FRIEND_TEST_ALL_PREFIXES(GpuDataManagerImplTest, GpuDriverBugListMultiple);
|
| -
|
| GpuDataManagerImpl();
|
| virtual ~GpuDataManagerImpl();
|
|
|
| - void InitializeImpl(const std::string& gpu_blacklist_json,
|
| - const std::string& gpu_switching_list_json,
|
| - const std::string& gpu_driver_bug_list_json,
|
| - const GPUInfo& gpu_info);
|
| + mutable base::Lock lock_;
|
| + scoped_ptr<GpuDataManagerImplPrivate> private_;
|
|
|
| - void UpdateBlacklistedFeatures(const std::set<int>& features);
|
| -
|
| - // This should only be called once at initialization time, when preliminary
|
| - // gpu info is collected.
|
| - void UpdatePreliminaryBlacklistedFeatures();
|
| -
|
| - // Update the GPU switching status.
|
| - // This should only be called once at initialization time.
|
| - void UpdateGpuSwitchingManager(const GPUInfo& gpu_info);
|
| -
|
| - // Notify all observers whenever there is a GPU info update.
|
| - void NotifyGpuInfoUpdate();
|
| -
|
| - // Try to switch to SwiftShader rendering, if possible and necessary.
|
| - void EnableSwiftShaderIfNecessary();
|
| -
|
| - // Helper to extract the domain from a given URL.
|
| - std::string GetDomainFromURL(const GURL& url) const;
|
| -
|
| - // Implementation functions for blocking of 3D graphics APIs, used
|
| - // for unit testing.
|
| - void BlockDomainFrom3DAPIsAtTime(
|
| - const GURL& url, DomainGuilt guilt, base::Time at_time);
|
| - DomainBlockStatus Are3DAPIsBlockedAtTime(
|
| - const GURL& url, base::Time at_time) const;
|
| - int64 GetBlockAllDomainsDurationInMs() const;
|
| -
|
| - void Notify3DAPIBlocked(const GURL& url,
|
| - int render_process_id,
|
| - int render_view_id,
|
| - ThreeDAPIType requester);
|
| -
|
| - bool complete_gpu_info_already_requested_;
|
| -
|
| - std::set<int> blacklisted_features_;
|
| - std::set<int> preliminary_blacklisted_features_;
|
| -
|
| - GpuSwitchingOption gpu_switching_;
|
| -
|
| - std::set<int> gpu_driver_bugs_;
|
| -
|
| - GPUInfo gpu_info_;
|
| - mutable base::Lock gpu_info_lock_;
|
| -
|
| - scoped_ptr<GpuBlacklist> gpu_blacklist_;
|
| - scoped_ptr<GpuSwitchingList> gpu_switching_list_;
|
| - scoped_ptr<GpuDriverBugList> gpu_driver_bug_list_;
|
| -
|
| - const scoped_refptr<GpuDataManagerObserverList> observer_list_;
|
| -
|
| - ListValue log_messages_;
|
| - mutable base::Lock log_messages_lock_;
|
| -
|
| - bool use_swiftshader_;
|
| -
|
| - base::FilePath swiftshader_path_;
|
| -
|
| - // Current card force-blacklisted due to GPU crashes, or disabled through
|
| - // the --disable-gpu commandline switch.
|
| - bool card_blacklisted_;
|
| -
|
| - // We disable histogram stuff in testing, especially in unit tests because
|
| - // they cause random failures.
|
| - bool update_histograms_;
|
| -
|
| - // Number of currently open windows, to be used in gpu memory allocation.
|
| - int window_count_;
|
| -
|
| - DomainBlockMap blocked_domains_;
|
| - mutable std::list<base::Time> timestamps_of_gpu_resets_;
|
| - bool domain_blocking_enabled_;
|
| -
|
| - std::vector<GpuSwitchCallback> gpu_switch_callbacks_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(GpuDataManagerImpl);
|
| };
|
|
|
|
|