Commit da88bdc0 authored by Zhenyao Mo's avatar Zhenyao Mo Committed by Commit Bot

For Dx12 & Vulkan info collection on GPU process

only send back collected bits rather than full GPUInfo

BUG=718215
TEST=bots, manual
R=piman@chromium.org,magchen@chromium.org,dcheng@chromium.org

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: Ib7c6107057bd39579d3bad95400599c5a84ce8b0
Reviewed-on: https://chromium-review.googlesource.com/1246689
Commit-Queue: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Reviewed-by: default avatarMaggie Chen <magchen@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#594561}
parent 3f016624
...@@ -537,8 +537,9 @@ void GpuServiceImpl::GetGpuSupportedRuntimeVersion( ...@@ -537,8 +537,9 @@ void GpuServiceImpl::GetGpuSupportedRuntimeVersion(
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
DCHECK(command_line->HasSwitch("disable-gpu-sandbox") || in_host_process()); DCHECK(command_line->HasSwitch("disable-gpu-sandbox") || in_host_process());
gpu::RecordGpuSupportedRuntimeVersionHistograms(&gpu_info_); gpu::RecordGpuSupportedRuntimeVersionHistograms(
std::move(callback).Run(gpu_info_); &gpu_info_.dx12_vulkan_version_info);
std::move(callback).Run(gpu_info_.dx12_vulkan_version_info);
if (!in_host_process()) { if (!in_host_process()) {
// The unsandboxed GPU process fulfilled its duty. Bye bye. // The unsandboxed GPU process fulfilled its duty. Bye bye.
ExitProcess(); ExitProcess();
......
...@@ -90,6 +90,10 @@ class AuxGPUInfoEnumerator : public gpu::GPUInfo::Enumerator { ...@@ -90,6 +90,10 @@ class AuxGPUInfoEnumerator : public gpu::GPUInfo::Enumerator {
void EndOverlayCapability() override {} void EndOverlayCapability() override {}
void BeginDx12VulkanVersionInfo() override {}
void EndDx12VulkanVersionInfo() override {}
void BeginAuxAttributes() override { void BeginAuxAttributes() override {
in_aux_attributes_ = true; in_aux_attributes_ = true;
} }
......
...@@ -109,9 +109,10 @@ void GpuDataManagerImpl::UpdateDxDiagNode( ...@@ -109,9 +109,10 @@ void GpuDataManagerImpl::UpdateDxDiagNode(
private_->UpdateDxDiagNode(dx_diagnostics); private_->UpdateDxDiagNode(dx_diagnostics);
} }
void GpuDataManagerImpl::UpdateDX12VulkanInfo(const gpu::GPUInfo& gpu_info) { void GpuDataManagerImpl::UpdateDx12VulkanInfo(
const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info) {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
private_->UpdateDX12VulkanInfo(gpu_info); private_->UpdateDx12VulkanInfo(dx12_vulkan_version_info);
} }
#endif #endif
......
...@@ -78,7 +78,8 @@ class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager { ...@@ -78,7 +78,8 @@ class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager {
const gpu::GPUInfo& gpu_info, const gpu::GPUInfo& gpu_info,
const base::Optional<gpu::GPUInfo>& gpu_info_for_hardware_gpu); const base::Optional<gpu::GPUInfo>& gpu_info_for_hardware_gpu);
#if defined(OS_WIN) #if defined(OS_WIN)
void UpdateDX12VulkanInfo(const gpu::GPUInfo& gpu_info); void UpdateDx12VulkanInfo(
const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info);
void UpdateDxDiagNode(const gpu::DxDiagNode& dx_diagnostics); void UpdateDxDiagNode(const gpu::DxDiagNode& dx_diagnostics);
#endif #endif
// Update the GPU feature info. This updates the blacklist and enabled status // Update the GPU feature info. This updates the blacklist and enabled status
......
...@@ -265,17 +265,19 @@ void UpdateDxDiagNodeOnIO(const gpu::DxDiagNode& dx_diagnostics) { ...@@ -265,17 +265,19 @@ void UpdateDxDiagNodeOnIO(const gpu::DxDiagNode& dx_diagnostics) {
dx_diagnostics)); dx_diagnostics));
} }
void UpdateDX12VulkanInfoOnIO(const gpu::GPUInfo& gpu_info) { void UpdateDx12VulkanInfoOnIO(
const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info) {
// This function is called on the IO thread, but GPUInfo on GpuDataManagerImpl // This function is called on the IO thread, but GPUInfo on GpuDataManagerImpl
// should be updated on the UI thread since it can call into functions that // should be updated on the UI thread since it can call into functions that
// expect to run in the UI thread. // expect to run in the UI thread.
base::PostTaskWithTraits( base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI}, FROM_HERE, {BrowserThread::UI},
base::BindOnce( base::BindOnce(
[](const gpu::GPUInfo& gpu_info) { [](const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info) {
GpuDataManagerImpl::GetInstance()->UpdateDX12VulkanInfo(gpu_info); GpuDataManagerImpl::GetInstance()->UpdateDx12VulkanInfo(
dx12_vulkan_version_info);
}, },
gpu_info)); dx12_vulkan_version_info));
} }
#endif #endif
} // anonymous namespace } // anonymous namespace
...@@ -417,7 +419,7 @@ void GpuDataManagerImplPrivate::RequestGpuSupportedRuntimeVersion() { ...@@ -417,7 +419,7 @@ void GpuDataManagerImplPrivate::RequestGpuSupportedRuntimeVersion() {
if (!host) if (!host)
return; return;
host->gpu_service()->GetGpuSupportedRuntimeVersion( host->gpu_service()->GetGpuSupportedRuntimeVersion(
base::BindOnce(&UpdateDX12VulkanInfoOnIO)); base::BindOnce(&UpdateDx12VulkanInfoOnIO));
}); });
base::PostDelayedTaskWithTraits(FROM_HERE, {BrowserThread::IO}, base::PostDelayedTaskWithTraits(FROM_HERE, {BrowserThread::IO},
...@@ -494,23 +496,18 @@ void GpuDataManagerImplPrivate::UpdateGpuInfo( ...@@ -494,23 +496,18 @@ void GpuDataManagerImplPrivate::UpdateGpuInfo(
// If GPU process crashes and launches again, GPUInfo will be sent back from // If GPU process crashes and launches again, GPUInfo will be sent back from
// the new GPU process again, and may overwrite the DX12, Vulkan, DxDiagNode // the new GPU process again, and may overwrite the DX12, Vulkan, DxDiagNode
// info we already collected. This is to make sure it doesn't happen. // info we already collected. This is to make sure it doesn't happen.
uint32_t d3d12_feature_level = gpu_info_.d3d12_feature_level;
uint32_t vulkan_version = gpu_info_.vulkan_version;
gpu::DxDiagNode dx_diagnostics = gpu_info_.dx_diagnostics; gpu::DxDiagNode dx_diagnostics = gpu_info_.dx_diagnostics;
gpu::Dx12VulkanVersionInfo dx12_vulkan_version_info =
gpu_info_.dx12_vulkan_version_info;
#endif #endif
gpu_info_ = gpu_info; gpu_info_ = gpu_info;
#if defined(OS_WIN) #if defined(OS_WIN)
if (d3d12_feature_level) {
gpu_info_.d3d12_feature_level = d3d12_feature_level;
gpu_info_.supports_dx12 = true;
}
if (vulkan_version) {
gpu_info_.vulkan_version = vulkan_version;
gpu_info_.supports_vulkan = true;
}
if (!dx_diagnostics.IsEmpty()) { if (!dx_diagnostics.IsEmpty()) {
gpu_info_.dx_diagnostics = dx_diagnostics; gpu_info_.dx_diagnostics = dx_diagnostics;
} }
if (!dx12_vulkan_version_info.IsEmpty()) {
gpu_info_.dx12_vulkan_version_info = dx12_vulkan_version_info;
}
#endif // OS_WIN #endif // OS_WIN
if (!gpu_info_for_hardware_gpu_.IsInitialized()) { if (!gpu_info_for_hardware_gpu_.IsInitialized()) {
...@@ -536,16 +533,9 @@ void GpuDataManagerImplPrivate::UpdateDxDiagNode( ...@@ -536,16 +533,9 @@ void GpuDataManagerImplPrivate::UpdateDxDiagNode(
NotifyGpuInfoUpdate(); NotifyGpuInfoUpdate();
} }
void GpuDataManagerImplPrivate::UpdateDX12VulkanInfo( void GpuDataManagerImplPrivate::UpdateDx12VulkanInfo(
const gpu::GPUInfo& gpu_info) { const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info) {
if (gpu_info.d3d12_feature_level) { gpu_info_.dx12_vulkan_version_info = dx12_vulkan_version_info;
gpu_info_.d3d12_feature_level = gpu_info.d3d12_feature_level;
gpu_info_.supports_dx12 = true;
}
if (gpu_info.vulkan_version) {
gpu_info_.vulkan_version = gpu_info.vulkan_version;
gpu_info_.supports_vulkan = true;
}
// No need to call GetContentClient()->SetGpuInfo(). // No need to call GetContentClient()->SetGpuInfo().
NotifyGpuInfoUpdate(); NotifyGpuInfoUpdate();
} }
......
...@@ -65,7 +65,8 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate { ...@@ -65,7 +65,8 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
const base::Optional<gpu::GPUInfo>& optional_gpu_info_for_hardware_gpu); const base::Optional<gpu::GPUInfo>& optional_gpu_info_for_hardware_gpu);
#if defined(OS_WIN) #if defined(OS_WIN)
void UpdateDxDiagNode(const gpu::DxDiagNode& dx_diagnostics); void UpdateDxDiagNode(const gpu::DxDiagNode& dx_diagnostics);
void UpdateDX12VulkanInfo(const gpu::GPUInfo& gpu_info); void UpdateDx12VulkanInfo(
const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info);
#endif #endif
void UpdateGpuFeatureInfo(const gpu::GpuFeatureInfo& gpu_feature_info, void UpdateGpuFeatureInfo(const gpu::GpuFeatureInfo& gpu_feature_info,
const base::Optional<gpu::GpuFeatureInfo>& const base::Optional<gpu::GpuFeatureInfo>&
......
...@@ -213,11 +213,12 @@ std::unique_ptr<base::ListValue> BasicGpuInfoAsListValue( ...@@ -213,11 +213,12 @@ std::unique_ptr<base::ListValue> BasicGpuInfoAsListValue(
basic_info->Append(NewDescriptionValuePair( basic_info->Append(NewDescriptionValuePair(
"Driver D3D12 feature level", "Driver D3D12 feature level",
D3dFeaturelevelToString(gpu_info.d3d12_feature_level))); D3dFeaturelevelToString(
gpu_info.dx12_vulkan_version_info.d3d12_feature_level)));
basic_info->Append( basic_info->Append(NewDescriptionValuePair(
NewDescriptionValuePair("Driver Vulkan API version", "Driver Vulkan API version",
VulkanVersionToString(gpu_info.vulkan_version))); VulkanVersionToString(gpu_info.dx12_vulkan_version_info.vulkan_version)));
#endif #endif
basic_info->Append( basic_info->Append(
......
...@@ -58,6 +58,17 @@ void EnumerateOverlayCapability(const gpu::OverlayCapability& cap, ...@@ -58,6 +58,17 @@ void EnumerateOverlayCapability(const gpu::OverlayCapability& cap,
enumerator->AddInt("isScalingSupported", cap.is_scaling_supported); enumerator->AddInt("isScalingSupported", cap.is_scaling_supported);
enumerator->EndOverlayCapability(); enumerator->EndOverlayCapability();
} }
void EnumerateDx12VulkanVersionInfo(const gpu::Dx12VulkanVersionInfo& info,
gpu::GPUInfo::Enumerator* enumerator) {
enumerator->BeginDx12VulkanVersionInfo();
enumerator->AddBool("supportsDx12", info.supports_dx12);
enumerator->AddBool("supportsVulkan", info.supports_vulkan);
enumerator->AddInt("dx12FeatureLevel",
static_cast<int>(info.d3d12_feature_level));
enumerator->AddInt("vulkanVersion", static_cast<int>(info.vulkan_version));
enumerator->EndDx12VulkanVersionInfo();
}
#endif #endif
} // namespace } // namespace
...@@ -179,10 +190,7 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const { ...@@ -179,10 +190,7 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const {
bool supports_overlays; bool supports_overlays;
OverlayCapabilities overlay_capabilities; OverlayCapabilities overlay_capabilities;
DxDiagNode dx_diagnostics; DxDiagNode dx_diagnostics;
bool supports_dx12; Dx12VulkanVersionInfo dx12_vulkan_version_info;
bool supports_vulkan;
uint32_t d3d12_feature_level;
uint32_t vulkan_version;
#endif #endif
VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities; VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities;
...@@ -242,10 +250,7 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const { ...@@ -242,10 +250,7 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const {
enumerator->AddBool("supportsOverlays", supports_overlays); enumerator->AddBool("supportsOverlays", supports_overlays);
for (const auto& cap : overlay_capabilities) for (const auto& cap : overlay_capabilities)
EnumerateOverlayCapability(cap, enumerator); EnumerateOverlayCapability(cap, enumerator);
enumerator->AddBool("supportsDX12", supports_dx12); EnumerateDx12VulkanVersionInfo(dx12_vulkan_version_info, enumerator);
enumerator->AddBool("supportsVulkan", supports_vulkan);
enumerator->AddInt("d3dFeatureLevel", d3d12_feature_level);
enumerator->AddInt("vulkanVersion", vulkan_version);
#endif #endif
enumerator->AddInt("videoDecodeAcceleratorFlags", enumerator->AddInt("videoDecodeAcceleratorFlags",
video_decode_accelerator_capabilities.flags); video_decode_accelerator_capabilities.flags);
......
...@@ -104,6 +104,22 @@ struct GPU_EXPORT OverlayCapability { ...@@ -104,6 +104,22 @@ struct GPU_EXPORT OverlayCapability {
}; };
using OverlayCapabilities = std::vector<OverlayCapability>; using OverlayCapabilities = std::vector<OverlayCapability>;
struct GPU_EXPORT Dx12VulkanVersionInfo {
bool IsEmpty() const { return !d3d12_feature_level && !vulkan_version; }
// True if the GPU driver supports DX12.
bool supports_dx12 = false;
// True if the GPU driver supports Vulkan.
bool supports_vulkan = false;
// The supported d3d feature level in the gpu driver;
uint32_t d3d12_feature_level = 0;
// The support Vulkan API version in the gpu driver;
uint32_t vulkan_version = 0;
};
struct GPU_EXPORT GPUInfo { struct GPU_EXPORT GPUInfo {
struct GPU_EXPORT GPUDevice { struct GPU_EXPORT GPUDevice {
GPUDevice(); GPUDevice();
...@@ -245,17 +261,7 @@ struct GPU_EXPORT GPUInfo { ...@@ -245,17 +261,7 @@ struct GPU_EXPORT GPUInfo {
// The information returned by the DirectX Diagnostics Tool. // The information returned by the DirectX Diagnostics Tool.
DxDiagNode dx_diagnostics; DxDiagNode dx_diagnostics;
// True if the GPU driver supports DX12. Dx12VulkanVersionInfo dx12_vulkan_version_info;
bool supports_dx12 = false;
// True if the GPU driver supports Vulkan.
bool supports_vulkan = false;
// The supported d3d feature level in the gpu driver;
uint32_t d3d12_feature_level = 0;
// The support Vulkan API version in the gpu driver;
uint32_t vulkan_version = 0;
#endif #endif
VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities; VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities;
...@@ -312,6 +318,9 @@ struct GPU_EXPORT GPUInfo { ...@@ -312,6 +318,9 @@ struct GPU_EXPORT GPUInfo {
virtual void BeginOverlayCapability() = 0; virtual void BeginOverlayCapability() = 0;
virtual void EndOverlayCapability() = 0; virtual void EndOverlayCapability() = 0;
virtual void BeginDx12VulkanVersionInfo() = 0;
virtual void EndDx12VulkanVersionInfo() = 0;
protected: protected:
virtual ~Enumerator() = default; virtual ~Enumerator() = default;
}; };
......
...@@ -42,7 +42,8 @@ GPU_EXPORT bool CollectContextGraphicsInfo( ...@@ -42,7 +42,8 @@ GPU_EXPORT bool CollectContextGraphicsInfo(
#if defined(OS_WIN) #if defined(OS_WIN)
// Collect the DirectX Disagnostics information about the attached displays. // Collect the DirectX Disagnostics information about the attached displays.
GPU_EXPORT bool GetDxDiagnostics(DxDiagNode* output); GPU_EXPORT bool GetDxDiagnostics(DxDiagNode* output);
GPU_EXPORT void RecordGpuSupportedRuntimeVersionHistograms(GPUInfo* gpu_info); GPU_EXPORT void RecordGpuSupportedRuntimeVersionHistograms(
Dx12VulkanVersionInfo* dx12_vulkan_version_info);
#endif // OS_WIN #endif // OS_WIN
// Create a GL context and collect GL strings and versions. // Create a GL context and collect GL strings and versions.
......
...@@ -280,10 +280,10 @@ bool CollectDriverInfoD3D(const std::wstring& device_id, GPUInfo* gpu_info) { ...@@ -280,10 +280,10 @@ bool CollectDriverInfoD3D(const std::wstring& device_id, GPUInfo* gpu_info) {
} }
// DirectX 12 are included with Windows 10 and Server 2016. // DirectX 12 are included with Windows 10 and Server 2016.
void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) { void GetGpuSupportedD3D12Version(Dx12VulkanVersionInfo* info) {
TRACE_EVENT0("gpu", "GetGpuSupportedD3D12Version"); TRACE_EVENT0("gpu", "GetGpuSupportedD3D12Version");
gpu_info->supports_dx12 = false; info->supports_dx12 = false;
gpu_info->d3d12_feature_level = 0; info->d3d12_feature_level = 0;
base::NativeLibrary d3d12_library = base::NativeLibrary d3d12_library =
base::LoadNativeLibrary(base::FilePath(L"d3d12.dll"), nullptr); base::LoadNativeLibrary(base::FilePath(L"d3d12.dll"), nullptr);
...@@ -305,8 +305,8 @@ void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) { ...@@ -305,8 +305,8 @@ void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) {
for (auto level : feature_levels) { for (auto level : feature_levels) {
if (SUCCEEDED(D3D12CreateDevice(nullptr, level, _uuidof(ID3D12Device), if (SUCCEEDED(D3D12CreateDevice(nullptr, level, _uuidof(ID3D12Device),
nullptr))) { nullptr))) {
gpu_info->d3d12_feature_level = level; info->d3d12_feature_level = level;
gpu_info->supports_dx12 = true; info->supports_dx12 = true;
break; break;
} }
} }
...@@ -315,7 +315,7 @@ void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) { ...@@ -315,7 +315,7 @@ void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) {
base::UnloadNativeLibrary(d3d12_library); base::UnloadNativeLibrary(d3d12_library);
} }
bool BadAMDVulkanDriverVersion(GPUInfo* gpu_info) { bool BadAMDVulkanDriverVersion() {
// Both 32-bit and 64-bit dll are broken. If 64-bit doesn't exist, // Both 32-bit and 64-bit dll are broken. If 64-bit doesn't exist,
// 32-bit dll will be used to detect the AMD Vulkan driver. // 32-bit dll will be used to detect the AMD Vulkan driver.
const base::FilePath kAmdDriver64(FILE_PATH_LITERAL("amdvlk64.dll")); const base::FilePath kAmdDriver64(FILE_PATH_LITERAL("amdvlk64.dll"));
...@@ -347,7 +347,7 @@ bool BadAMDVulkanDriverVersion(GPUInfo* gpu_info) { ...@@ -347,7 +347,7 @@ bool BadAMDVulkanDriverVersion(GPUInfo* gpu_info) {
return false; return false;
} }
bool BadVulkanDllVersion(GPUInfo* gpu_info) { bool BadVulkanDllVersion() {
std::unique_ptr<FileVersionInfoWin> file_version_info( std::unique_ptr<FileVersionInfoWin> file_version_info(
static_cast<FileVersionInfoWin*>( static_cast<FileVersionInfoWin*>(
FileVersionInfoWin::CreateFileVersionInfo( FileVersionInfoWin::CreateFileVersionInfo(
...@@ -437,7 +437,7 @@ bool InitVulkanInstanceProc( ...@@ -437,7 +437,7 @@ bool InitVulkanInstanceProc(
} }
void GetGpuSupportedVulkanVersionAndExtensions( void GetGpuSupportedVulkanVersionAndExtensions(
GPUInfo* gpu_info, Dx12VulkanVersionInfo* info,
const std::vector<const char*>& requested_vulkan_extensions, const std::vector<const char*>& requested_vulkan_extensions,
std::vector<bool>* extension_support) { std::vector<bool>* extension_support) {
TRACE_EVENT0("gpu", "GetGpuSupportedVulkanVersionAndExtensions"); TRACE_EVENT0("gpu", "GetGpuSupportedVulkanVersionAndExtensions");
...@@ -450,18 +450,18 @@ void GetGpuSupportedVulkanVersionAndExtensions( ...@@ -450,18 +450,18 @@ void GetGpuSupportedVulkanVersionAndExtensions(
PFN_vkDestroyInstance vkDestroyInstance; PFN_vkDestroyInstance vkDestroyInstance;
VkInstance vk_instance = VK_NULL_HANDLE; VkInstance vk_instance = VK_NULL_HANDLE;
uint32_t physical_device_count = 0; uint32_t physical_device_count = 0;
gpu_info->supports_vulkan = false; info->supports_vulkan = false;
gpu_info->vulkan_version = 0; info->vulkan_version = 0;
// Skip if the system has an older AMD Vulkan driver amdvlk64.dll or // Skip if the system has an older AMD Vulkan driver amdvlk64.dll or
// amdvlk32.dll which crashes when vkCreateInstance() is called. This bug has // amdvlk32.dll which crashes when vkCreateInstance() is called. This bug has
// been fixed in the latest AMD driver. // been fixed in the latest AMD driver.
if (BadAMDVulkanDriverVersion(gpu_info)) { if (BadAMDVulkanDriverVersion()) {
return; return;
} }
// Some early versions of vulkan-1.dll might crash // Some early versions of vulkan-1.dll might crash
if (BadVulkanDllVersion(gpu_info)) { if (BadVulkanDllVersion()) {
return; return;
} }
...@@ -487,8 +487,8 @@ void GetGpuSupportedVulkanVersionAndExtensions( ...@@ -487,8 +487,8 @@ void GetGpuSupportedVulkanVersionAndExtensions(
result = vkEnumeratePhysicalDevices(vk_instance, &physical_device_count, result = vkEnumeratePhysicalDevices(vk_instance, &physical_device_count,
nullptr); nullptr);
if (result == VK_SUCCESS && physical_device_count > 0) { if (result == VK_SUCCESS && physical_device_count > 0) {
gpu_info->supports_vulkan = true; info->supports_vulkan = true;
gpu_info->vulkan_version = app_info.apiVersion; info->vulkan_version = app_info.apiVersion;
break; break;
} else { } else {
vkDestroyInstance(vk_instance, nullptr); vkDestroyInstance(vk_instance, nullptr);
...@@ -498,7 +498,7 @@ void GetGpuSupportedVulkanVersionAndExtensions( ...@@ -498,7 +498,7 @@ void GetGpuSupportedVulkanVersionAndExtensions(
} }
// Check whether the requested_vulkan_extensions are supported // Check whether the requested_vulkan_extensions are supported
if (gpu_info->supports_vulkan) { if (info->supports_vulkan) {
std::vector<VkPhysicalDevice> physical_devices(physical_device_count); std::vector<VkPhysicalDevice> physical_devices(physical_device_count);
vkEnumeratePhysicalDevices(vk_instance, &physical_device_count, vkEnumeratePhysicalDevices(vk_instance, &physical_device_count,
physical_devices.data()); physical_devices.data());
...@@ -533,26 +533,26 @@ void GetGpuSupportedVulkanVersionAndExtensions( ...@@ -533,26 +533,26 @@ void GetGpuSupportedVulkanVersionAndExtensions(
base::UnloadNativeLibrary(vulkan_library); base::UnloadNativeLibrary(vulkan_library);
} }
void RecordGpuSupportedRuntimeVersionHistograms(GPUInfo* gpu_info) { void RecordGpuSupportedRuntimeVersionHistograms(Dx12VulkanVersionInfo* info) {
// D3D // D3D
GetGpuSupportedD3D12Version(gpu_info); GetGpuSupportedD3D12Version(info);
UMA_HISTOGRAM_BOOLEAN("GPU.SupportsDX12", gpu_info->supports_dx12); UMA_HISTOGRAM_BOOLEAN("GPU.SupportsDX12", info->supports_dx12);
UMA_HISTOGRAM_ENUMERATION( UMA_HISTOGRAM_ENUMERATION(
"GPU.D3D12FeatureLevel", "GPU.D3D12FeatureLevel",
ConvertToHistogramFeatureLevel(gpu_info->d3d12_feature_level)); ConvertToHistogramFeatureLevel(info->d3d12_feature_level));
// Vulkan // Vulkan
const std::vector<const char*> vulkan_extensions = { const std::vector<const char*> vulkan_extensions = {
"VK_KHR_external_memory_win32", "VK_KHR_external_semaphore_win32", "VK_KHR_external_memory_win32", "VK_KHR_external_semaphore_win32",
"VK_KHR_win32_keyed_mutex"}; "VK_KHR_win32_keyed_mutex"};
std::vector<bool> extension_support(vulkan_extensions.size(), false); std::vector<bool> extension_support(vulkan_extensions.size(), false);
GetGpuSupportedVulkanVersionAndExtensions(gpu_info, vulkan_extensions, GetGpuSupportedVulkanVersionAndExtensions(info, vulkan_extensions,
&extension_support); &extension_support);
UMA_HISTOGRAM_BOOLEAN("GPU.SupportsVulkan", gpu_info->supports_vulkan); UMA_HISTOGRAM_BOOLEAN("GPU.SupportsVulkan", info->supports_vulkan);
UMA_HISTOGRAM_ENUMERATION( UMA_HISTOGRAM_ENUMERATION(
"GPU.VulkanVersion", "GPU.VulkanVersion",
ConvertToHistogramVulkanVersion(gpu_info->vulkan_version)); ConvertToHistogramVulkanVersion(info->vulkan_version));
for (size_t i = 0; i < vulkan_extensions.size(); ++i) { for (size_t i = 0; i < vulkan_extensions.size(); ++i) {
std::string name = "GPU.VulkanExtSupport."; std::string name = "GPU.VulkanExtSupport.";
......
...@@ -89,6 +89,14 @@ struct OverlayCapability { ...@@ -89,6 +89,14 @@ struct OverlayCapability {
bool is_scaling_supported; bool is_scaling_supported;
}; };
// gpu::Dx12VulkanVersionInfo
struct Dx12VulkanVersionInfo {
bool supports_dx12;
bool supports_vulkan;
uint32 d3d12_feature_level;
uint32 vulkan_version;
};
// Corresponds to |gpu::GPUInfo| in gpu/config/gpu_info.h // Corresponds to |gpu::GPUInfo| in gpu/config/gpu_info.h
struct GpuInfo { struct GpuInfo {
mojo_base.mojom.TimeDelta initialization_time; mojo_base.mojom.TimeDelta initialization_time;
...@@ -124,13 +132,7 @@ struct GpuInfo { ...@@ -124,13 +132,7 @@ struct GpuInfo {
[EnableIf=is_win] [EnableIf=is_win]
DxDiagNode dx_diagnostics; DxDiagNode dx_diagnostics;
[EnableIf=is_win] [EnableIf=is_win]
bool supports_dx12; Dx12VulkanVersionInfo dx12_vulkan_version_info;
[EnableIf=is_win]
bool supports_vulkan;
[EnableIf=is_win]
uint32 d3d12_feature_level;
[EnableIf=is_win]
uint32 vulkan_version;
VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities; VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities;
array<VideoEncodeAcceleratorSupportedProfile> array<VideoEncodeAcceleratorSupportedProfile>
video_encode_accelerator_supported_profiles; video_encode_accelerator_supported_profiles;
......
...@@ -14,6 +14,7 @@ public_deps = [ ...@@ -14,6 +14,7 @@ public_deps = [
] ]
type_mappings = [ type_mappings = [
"gpu.mojom.CollectInfoResult=gpu::CollectInfoResult", "gpu.mojom.CollectInfoResult=gpu::CollectInfoResult",
"gpu.mojom.Dx12VulkanVersionInfo=gpu::Dx12VulkanVersionInfo",
"gpu.mojom.GpuDevice=gpu::GPUInfo::GPUDevice", "gpu.mojom.GpuDevice=gpu::GPUInfo::GPUDevice",
"gpu.mojom.GpuInfo=gpu::GPUInfo", "gpu.mojom.GpuInfo=gpu::GPUInfo",
"gpu.mojom.VideoCodecProfile=gpu::VideoCodecProfile", "gpu.mojom.VideoCodecProfile=gpu::VideoCodecProfile",
......
...@@ -258,6 +258,18 @@ bool StructTraits< ...@@ -258,6 +258,18 @@ bool StructTraits<
out->is_scaling_supported = data.is_scaling_supported(); out->is_scaling_supported = data.is_scaling_supported();
return data.ReadFormat(&out->format); return data.ReadFormat(&out->format);
} }
// static
bool StructTraits<gpu::mojom::Dx12VulkanVersionInfoDataView,
gpu::Dx12VulkanVersionInfo>::
Read(gpu::mojom::Dx12VulkanVersionInfoDataView data,
gpu::Dx12VulkanVersionInfo* out) {
out->supports_dx12 = data.supports_dx12();
out->supports_vulkan = data.supports_vulkan();
out->d3d12_feature_level = data.d3d12_feature_level();
out->vulkan_version = data.vulkan_version();
return true;
}
#endif #endif
bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read( bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read(
...@@ -285,10 +297,6 @@ bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read( ...@@ -285,10 +297,6 @@ bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read(
#if defined(OS_WIN) #if defined(OS_WIN)
out->direct_composition = data.direct_composition(); out->direct_composition = data.direct_composition();
out->supports_overlays = data.supports_overlays(); out->supports_overlays = data.supports_overlays();
out->supports_dx12 = data.supports_dx12();
out->supports_vulkan = data.supports_vulkan();
out->d3d12_feature_level = data.d3d12_feature_level();
out->vulkan_version = data.vulkan_version();
#endif #endif
return data.ReadInitializationTime(&out->initialization_time) && return data.ReadInitializationTime(&out->initialization_time) &&
...@@ -309,6 +317,7 @@ bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read( ...@@ -309,6 +317,7 @@ bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read(
#if defined(OS_WIN) #if defined(OS_WIN)
data.ReadOverlayCapabilities(&out->overlay_capabilities) && data.ReadOverlayCapabilities(&out->overlay_capabilities) &&
data.ReadDxDiagnostics(&out->dx_diagnostics) && data.ReadDxDiagnostics(&out->dx_diagnostics) &&
data.ReadDx12VulkanVersionInfo(&out->dx12_vulkan_version_info) &&
#endif #endif
data.ReadVideoDecodeAcceleratorCapabilities( data.ReadVideoDecodeAcceleratorCapabilities(
&out->video_decode_accelerator_capabilities) && &out->video_decode_accelerator_capabilities) &&
......
...@@ -163,6 +163,29 @@ struct StructTraits<gpu::mojom::OverlayCapabilityDataView, ...@@ -163,6 +163,29 @@ struct StructTraits<gpu::mojom::OverlayCapabilityDataView,
} }
}; };
template <>
struct StructTraits<gpu::mojom::Dx12VulkanVersionInfoDataView,
gpu::Dx12VulkanVersionInfo> {
static bool Read(gpu::mojom::Dx12VulkanVersionInfoDataView data,
gpu::Dx12VulkanVersionInfo* out);
static bool supports_dx12(const gpu::Dx12VulkanVersionInfo& input) {
return input.supports_dx12;
}
static bool supports_vulkan(const gpu::Dx12VulkanVersionInfo& input) {
return input.supports_vulkan;
}
static uint32_t d3d12_feature_level(const gpu::Dx12VulkanVersionInfo& input) {
return input.d3d12_feature_level;
}
static uint32_t vulkan_version(const gpu::Dx12VulkanVersionInfo& input) {
return input.vulkan_version;
}
};
template <> template <>
struct StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo> { struct StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo> {
static bool Read(gpu::mojom::GpuInfoDataView data, gpu::GPUInfo* out); static bool Read(gpu::mojom::GpuInfoDataView data, gpu::GPUInfo* out);
...@@ -278,20 +301,9 @@ struct StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo> { ...@@ -278,20 +301,9 @@ struct StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo> {
return input.dx_diagnostics; return input.dx_diagnostics;
} }
static bool supports_dx12(const gpu::GPUInfo& input) { static const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info(
return input.supports_dx12; const gpu::GPUInfo& input) {
} return input.dx12_vulkan_version_info;
static bool supports_vulkan(const gpu::GPUInfo& input) {
return input.supports_vulkan;
}
static uint32_t d3d12_feature_level(const gpu::GPUInfo& input) {
return input.d3d12_feature_level;
}
static uint32_t vulkan_version(const gpu::GPUInfo& input) {
return input.vulkan_version;
} }
#endif #endif
......
...@@ -80,7 +80,8 @@ interface GpuService { ...@@ -80,7 +80,8 @@ interface GpuService {
[EnableIf=is_win] [EnableIf=is_win]
RequestCompleteGpuInfo() => (gpu.mojom.DxDiagNode dx_diagnostics); RequestCompleteGpuInfo() => (gpu.mojom.DxDiagNode dx_diagnostics);
[EnableIf=is_win] [EnableIf=is_win]
GetGpuSupportedRuntimeVersion() => (gpu.mojom.GpuInfo gpu_info); GetGpuSupportedRuntimeVersion()
=> (gpu.mojom.Dx12VulkanVersionInfo dx12_vulkan_version_info);
// Requests that the GPU process query system availability of HDR output and // Requests that the GPU process query system availability of HDR output and
// return it. // return it.
......
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