#ifndef CONTENT_BROWSER_GPU_GPU_DATA_MANAGER_IMPL_H_
#define CONTENT_BROWSER_GPU_GPU_DATA_MANAGER_IMPL_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <string>
#include "base/no_destructor.h"
#include "base/process/kill.h"
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
#include "base/values.h"
#include "build/build_config.h"
#include "content/common/content_export.h"
#include "content/public/browser/gpu_data_manager.h"
#include "content/public/common/three_d_api_types.h"
#include "gpu/config/device_perf_info.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_info.h"
#include "gpu/config/gpu_mode.h"
#include "media/base/supported_video_decoder_config.h"
#include "media/video/video_encode_accelerator.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "third_party/blink/public/mojom/gpu/gpu.mojom.h"
#include "ui/display/display_observer.h"
#include "ui/gfx/gpu_extra_info.h"
#if BUILDFLAG(IS_WIN)
#include "ui/gfx/mojom/dxgi_info.mojom.h"
#endif
class GURL;
namespace gpu {
struct GpuPreferences;
}
namespace content {
class GpuDataManagerImplPrivate;
class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager,
public display::DisplayObserver {
public:
enum GpuInfoRequest {
kGpuInfoRequestDirectX = 1 << 0,
kGpuInfoRequestVulkan = 1 << 1,
kGpuInfoRequestDawnInfo = 1 << 2,
kGpuInfoRequestDirectXVulkan =
kGpuInfoRequestVulkan | kGpuInfoRequestDirectX,
kGpuInfoRequestVideo = 1 << 3,
kGpuInfoRequestAll = kGpuInfoRequestDirectX | kGpuInfoRequestVulkan |
kGpuInfoRequestDawnInfo | kGpuInfoRequestVideo,
};
static GpuDataManagerImpl* GetInstance();
GpuDataManagerImpl(const GpuDataManagerImpl&) = delete;
GpuDataManagerImpl& operator=(const GpuDataManagerImpl&) = delete;
static bool Initialized();
gpu::GPUInfo GetGPUInfo() override;
gpu::GpuFeatureStatus GetFeatureStatus(gpu::GpuFeatureType feature) override;
bool GpuAccessAllowed(std::string* reason) override;
bool IsEssentialGpuInfoAvailable() override;
void RequestVideoMemoryUsageStatsUpdate(
VideoMemoryUsageStatsCallback callback) override;
void AddObserver(GpuDataManagerObserver* observer) override;
void RemoveObserver(GpuDataManagerObserver* observer) override;
void DisableHardwareAcceleration() override;
bool HardwareAccelerationEnabled() override;
bool IsGpuRasterizationForUIEnabled() override;
void AppendGpuCommandLine(base::CommandLine* command_line,
GpuProcessKind kind) override;
void BlocklistWebGLForTesting() override;
void SetSkiaGraphiteEnabledForTesting(bool enabled) override;
void StartUmaTimer();
void RequestDx12VulkanVideoGpuInfoIfNeeded(
GpuDataManagerImpl::GpuInfoRequest request,
bool delayed);
bool IsDx12VulkanVersionAvailable() const;
bool IsGpuFeatureInfoAvailable() const;
void UpdateGpuInfo(
const gpu::GPUInfo& gpu_info,
const std::optional<gpu::GPUInfo>& gpu_info_for_hardware_gpu);
#if BUILDFLAG(IS_WIN)
void UpdateDirectXInfo(uint32_t d3d12_feature_level,
uint32_t directml_feature_level);
void UpdateVulkanInfo(uint32_t vulkan_version);
void UpdateDevicePerfInfo(const gpu::DevicePerfInfo& device_perf_info);
void UpdateOverlayInfo(const gpu::OverlayInfo& overlay_info);
void UpdateDXGIInfo(gfx::mojom::DXGIInfoPtr dxgi_info);
void UpdateDirectXRequestStatus(bool request_continues);
void UpdateVulkanRequestStatus(bool request_continues);
bool DirectXRequested() const;
bool VulkanRequested() const;
void TerminateInfoCollectionGpuProcess();
#endif
void PostCreateThreads();
void UpdateDawnInfo(const std::vector<std::string>& dawn_info_list);
void UpdateGpuFeatureInfo(const gpu::GpuFeatureInfo& gpu_feature_info,
const std::optional<gpu::GpuFeatureInfo>&
gpu_feature_info_for_hardware_gpu);
void UpdateGpuExtraInfo(const gfx::GpuExtraInfo& gpu_extra_info);
void UpdateMojoMediaVideoDecoderCapabilities(
const media::SupportedVideoDecoderConfigs& configs);
void UpdateMojoMediaVideoEncoderCapabilities(
const media::VideoEncodeAccelerator::SupportedProfiles&
supported_profiles);
gpu::GpuFeatureInfo GetGpuFeatureInfo() const;
gpu::GPUInfo GetGPUInfoForHardwareGpu() const;
gpu::GpuFeatureInfo GetGpuFeatureInfoForHardwareGpu() const;
std::vector<std::string> GetDawnInfoList() const;
bool GpuAccessAllowedForHardwareGpu(std::string* reason);
bool IsGpuCompositingDisabledForHardwareGpu() const;
gfx::GpuExtraInfo GetGpuExtraInfo() const;
bool IsGpuCompositingDisabled() const;
void SetGpuCompositingDisabled();
void UpdateGpuPreferences(gpu::GpuPreferences* gpu_preferences,
GpuProcessKind kind) const;
void AddLogMessage(int level,
const std::string& header,
const std::string& message);
void ProcessCrashed();
base::Value::List GetLogMessages() const;
void HandleGpuSwitch();
void BlockDomainsFrom3DAPIs(const std::set<GURL>& urls,
gpu::DomainGuilt guilt);
bool Are3DAPIsBlocked(const GURL& top_origin_url,
ThreeDAPIType requester);
void UnblockDomainFrom3DAPIs(const GURL& url);
void DisableDomainBlockingFor3DAPIsForTesting();
gpu::GpuMode GetGpuMode() const;
void FallBackToNextGpuMode();
void FallBackToNextGpuModeDueToCrash();
bool CanFallback() const;
bool IsGpuProcessUsingHardwareGpu() const;
void SetApplicationVisible(bool is_visible);
void OnDisplayAdded(const display::Display& new_display) override;
void OnDisplaysRemoved(const display::Displays& removed_displays) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
#if BUILDFLAG(IS_LINUX)
bool IsGpuMemoryBufferNV12Supported();
#endif
static void BindReceiver(
mojo::PendingReceiver<blink::mojom::GpuDataManager> receiver);
private:
friend class GpuDataManagerImplPrivate;
friend class GpuDataManagerImplPrivateTest;
friend class base::NoDestructor<GpuDataManagerImpl>;
GpuDataManagerImpl();
~GpuDataManagerImpl() override;
mutable base::Lock lock_;
std::unique_ptr<GpuDataManagerImplPrivate> private_ GUARDED_BY(lock_)
PT_GUARDED_BY(lock_);
};
}
#endif