Skip to content

Commit

Permalink
For Dx12 & Vulkan info collection on GPU process
Browse files Browse the repository at this point in the history
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: Antoine Labour <piman@chromium.org>
Reviewed-by: Maggie Chen <magchen@chromium.org>
Reviewed-by: Dominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#594561}
  • Loading branch information
zhenyao authored and Commit Bot committed Sep 27, 2018
1 parent 3f01662 commit da88bdc
Show file tree
Hide file tree
Showing 16 changed files with 142 additions and 103 deletions.
5 changes: 3 additions & 2 deletions components/viz/service/gl/gpu_service_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,9 @@ void GpuServiceImpl::GetGpuSupportedRuntimeVersion(
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
DCHECK(command_line->HasSwitch("disable-gpu-sandbox") || in_host_process());

gpu::RecordGpuSupportedRuntimeVersionHistograms(&gpu_info_);
std::move(callback).Run(gpu_info_);
gpu::RecordGpuSupportedRuntimeVersionHistograms(
&gpu_info_.dx12_vulkan_version_info);
std::move(callback).Run(gpu_info_.dx12_vulkan_version_info);
if (!in_host_process()) {
// The unsandboxed GPU process fulfilled its duty. Bye bye.
ExitProcess();
Expand Down
4 changes: 4 additions & 0 deletions content/browser/devtools/protocol/system_info_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ class AuxGPUInfoEnumerator : public gpu::GPUInfo::Enumerator {

void EndOverlayCapability() override {}

void BeginDx12VulkanVersionInfo() override {}

void EndDx12VulkanVersionInfo() override {}

void BeginAuxAttributes() override {
in_aux_attributes_ = true;
}
Expand Down
5 changes: 3 additions & 2 deletions content/browser/gpu/gpu_data_manager_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,10 @@ void GpuDataManagerImpl::UpdateDxDiagNode(
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_);
private_->UpdateDX12VulkanInfo(gpu_info);
private_->UpdateDx12VulkanInfo(dx12_vulkan_version_info);
}
#endif

Expand Down
3 changes: 2 additions & 1 deletion content/browser/gpu/gpu_data_manager_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ class CONTENT_EXPORT GpuDataManagerImpl : public GpuDataManager {
const gpu::GPUInfo& gpu_info,
const base::Optional<gpu::GPUInfo>& gpu_info_for_hardware_gpu);
#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);
#endif
// Update the GPU feature info. This updates the blacklist and enabled status
Expand Down
40 changes: 15 additions & 25 deletions content/browser/gpu/gpu_data_manager_impl_private.cc
Original file line number Diff line number Diff line change
Expand Up @@ -265,17 +265,19 @@ void UpdateDxDiagNodeOnIO(const gpu::DxDiagNode& 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
// should be updated on the UI thread since it can call into functions that
// expect to run in the UI thread.
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(
[](const gpu::GPUInfo& gpu_info) {
GpuDataManagerImpl::GetInstance()->UpdateDX12VulkanInfo(gpu_info);
[](const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info) {
GpuDataManagerImpl::GetInstance()->UpdateDx12VulkanInfo(
dx12_vulkan_version_info);
},
gpu_info));
dx12_vulkan_version_info));
}
#endif
} // anonymous namespace
Expand Down Expand Up @@ -417,7 +419,7 @@ void GpuDataManagerImplPrivate::RequestGpuSupportedRuntimeVersion() {
if (!host)
return;
host->gpu_service()->GetGpuSupportedRuntimeVersion(
base::BindOnce(&UpdateDX12VulkanInfoOnIO));
base::BindOnce(&UpdateDx12VulkanInfoOnIO));
});

base::PostDelayedTaskWithTraits(FROM_HERE, {BrowserThread::IO},
Expand Down Expand Up @@ -494,23 +496,18 @@ void GpuDataManagerImplPrivate::UpdateGpuInfo(
// 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
// 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::Dx12VulkanVersionInfo dx12_vulkan_version_info =
gpu_info_.dx12_vulkan_version_info;
#endif
gpu_info_ = gpu_info;
#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()) {
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

if (!gpu_info_for_hardware_gpu_.IsInitialized()) {
Expand All @@ -536,16 +533,9 @@ void GpuDataManagerImplPrivate::UpdateDxDiagNode(
NotifyGpuInfoUpdate();
}

void GpuDataManagerImplPrivate::UpdateDX12VulkanInfo(
const gpu::GPUInfo& gpu_info) {
if (gpu_info.d3d12_feature_level) {
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;
}
void GpuDataManagerImplPrivate::UpdateDx12VulkanInfo(
const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info) {
gpu_info_.dx12_vulkan_version_info = dx12_vulkan_version_info;
// No need to call GetContentClient()->SetGpuInfo().
NotifyGpuInfoUpdate();
}
Expand Down
3 changes: 2 additions & 1 deletion content/browser/gpu/gpu_data_manager_impl_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ class CONTENT_EXPORT GpuDataManagerImplPrivate {
const base::Optional<gpu::GPUInfo>& optional_gpu_info_for_hardware_gpu);
#if defined(OS_WIN)
void UpdateDxDiagNode(const gpu::DxDiagNode& dx_diagnostics);
void UpdateDX12VulkanInfo(const gpu::GPUInfo& gpu_info);
void UpdateDx12VulkanInfo(
const gpu::Dx12VulkanVersionInfo& dx12_vulkan_version_info);
#endif
void UpdateGpuFeatureInfo(const gpu::GpuFeatureInfo& gpu_feature_info,
const base::Optional<gpu::GpuFeatureInfo>&
Expand Down
9 changes: 5 additions & 4 deletions content/browser/gpu/gpu_internals_ui.cc
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,12 @@ std::unique_ptr<base::ListValue> BasicGpuInfoAsListValue(

basic_info->Append(NewDescriptionValuePair(
"Driver D3D12 feature level",
D3dFeaturelevelToString(gpu_info.d3d12_feature_level)));
D3dFeaturelevelToString(
gpu_info.dx12_vulkan_version_info.d3d12_feature_level)));

basic_info->Append(
NewDescriptionValuePair("Driver Vulkan API version",
VulkanVersionToString(gpu_info.vulkan_version)));
basic_info->Append(NewDescriptionValuePair(
"Driver Vulkan API version",
VulkanVersionToString(gpu_info.dx12_vulkan_version_info.vulkan_version)));
#endif

basic_info->Append(
Expand Down
21 changes: 13 additions & 8 deletions gpu/config/gpu_info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,17 @@ void EnumerateOverlayCapability(const gpu::OverlayCapability& cap,
enumerator->AddInt("isScalingSupported", cap.is_scaling_supported);
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

} // namespace
Expand Down Expand Up @@ -179,10 +190,7 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const {
bool supports_overlays;
OverlayCapabilities overlay_capabilities;
DxDiagNode dx_diagnostics;
bool supports_dx12;
bool supports_vulkan;
uint32_t d3d12_feature_level;
uint32_t vulkan_version;
Dx12VulkanVersionInfo dx12_vulkan_version_info;
#endif

VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities;
Expand Down Expand Up @@ -242,10 +250,7 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const {
enumerator->AddBool("supportsOverlays", supports_overlays);
for (const auto& cap : overlay_capabilities)
EnumerateOverlayCapability(cap, enumerator);
enumerator->AddBool("supportsDX12", supports_dx12);
enumerator->AddBool("supportsVulkan", supports_vulkan);
enumerator->AddInt("d3dFeatureLevel", d3d12_feature_level);
enumerator->AddInt("vulkanVersion", vulkan_version);
EnumerateDx12VulkanVersionInfo(dx12_vulkan_version_info, enumerator);
#endif
enumerator->AddInt("videoDecodeAcceleratorFlags",
video_decode_accelerator_capabilities.flags);
Expand Down
31 changes: 20 additions & 11 deletions gpu/config/gpu_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,22 @@ struct GPU_EXPORT 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 GPUDevice {
GPUDevice();
Expand Down Expand Up @@ -245,17 +261,7 @@ struct GPU_EXPORT GPUInfo {
// The information returned by the DirectX Diagnostics Tool.
DxDiagNode dx_diagnostics;

// 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;
Dx12VulkanVersionInfo dx12_vulkan_version_info;
#endif

VideoDecodeAcceleratorCapabilities video_decode_accelerator_capabilities;
Expand Down Expand Up @@ -312,6 +318,9 @@ struct GPU_EXPORT GPUInfo {
virtual void BeginOverlayCapability() = 0;
virtual void EndOverlayCapability() = 0;

virtual void BeginDx12VulkanVersionInfo() = 0;
virtual void EndDx12VulkanVersionInfo() = 0;

protected:
virtual ~Enumerator() = default;
};
Expand Down
3 changes: 2 additions & 1 deletion gpu/config/gpu_info_collector.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ GPU_EXPORT bool CollectContextGraphicsInfo(
#if defined(OS_WIN)
// Collect the DirectX Disagnostics information about the attached displays.
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

// Create a GL context and collect GL strings and versions.
Expand Down
44 changes: 22 additions & 22 deletions gpu/config/gpu_info_collector_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -280,10 +280,10 @@ bool CollectDriverInfoD3D(const std::wstring& device_id, GPUInfo* gpu_info) {
}

// DirectX 12 are included with Windows 10 and Server 2016.
void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) {
void GetGpuSupportedD3D12Version(Dx12VulkanVersionInfo* info) {
TRACE_EVENT0("gpu", "GetGpuSupportedD3D12Version");
gpu_info->supports_dx12 = false;
gpu_info->d3d12_feature_level = 0;
info->supports_dx12 = false;
info->d3d12_feature_level = 0;

base::NativeLibrary d3d12_library =
base::LoadNativeLibrary(base::FilePath(L"d3d12.dll"), nullptr);
Expand All @@ -305,8 +305,8 @@ void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) {
for (auto level : feature_levels) {
if (SUCCEEDED(D3D12CreateDevice(nullptr, level, _uuidof(ID3D12Device),
nullptr))) {
gpu_info->d3d12_feature_level = level;
gpu_info->supports_dx12 = true;
info->d3d12_feature_level = level;
info->supports_dx12 = true;
break;
}
}
Expand All @@ -315,7 +315,7 @@ void GetGpuSupportedD3D12Version(GPUInfo* gpu_info) {
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,
// 32-bit dll will be used to detect the AMD Vulkan driver.
const base::FilePath kAmdDriver64(FILE_PATH_LITERAL("amdvlk64.dll"));
Expand Down Expand Up @@ -347,7 +347,7 @@ bool BadAMDVulkanDriverVersion(GPUInfo* gpu_info) {
return false;
}

bool BadVulkanDllVersion(GPUInfo* gpu_info) {
bool BadVulkanDllVersion() {
std::unique_ptr<FileVersionInfoWin> file_version_info(
static_cast<FileVersionInfoWin*>(
FileVersionInfoWin::CreateFileVersionInfo(
Expand Down Expand Up @@ -437,7 +437,7 @@ bool InitVulkanInstanceProc(
}

void GetGpuSupportedVulkanVersionAndExtensions(
GPUInfo* gpu_info,
Dx12VulkanVersionInfo* info,
const std::vector<const char*>& requested_vulkan_extensions,
std::vector<bool>* extension_support) {
TRACE_EVENT0("gpu", "GetGpuSupportedVulkanVersionAndExtensions");
Expand All @@ -450,18 +450,18 @@ void GetGpuSupportedVulkanVersionAndExtensions(
PFN_vkDestroyInstance vkDestroyInstance;
VkInstance vk_instance = VK_NULL_HANDLE;
uint32_t physical_device_count = 0;
gpu_info->supports_vulkan = false;
gpu_info->vulkan_version = 0;
info->supports_vulkan = false;
info->vulkan_version = 0;

// Skip if the system has an older AMD Vulkan driver amdvlk64.dll or
// amdvlk32.dll which crashes when vkCreateInstance() is called. This bug has
// been fixed in the latest AMD driver.
if (BadAMDVulkanDriverVersion(gpu_info)) {
if (BadAMDVulkanDriverVersion()) {
return;
}

// Some early versions of vulkan-1.dll might crash
if (BadVulkanDllVersion(gpu_info)) {
if (BadVulkanDllVersion()) {
return;
}

Expand All @@ -487,8 +487,8 @@ void GetGpuSupportedVulkanVersionAndExtensions(
result = vkEnumeratePhysicalDevices(vk_instance, &physical_device_count,
nullptr);
if (result == VK_SUCCESS && physical_device_count > 0) {
gpu_info->supports_vulkan = true;
gpu_info->vulkan_version = app_info.apiVersion;
info->supports_vulkan = true;
info->vulkan_version = app_info.apiVersion;
break;
} else {
vkDestroyInstance(vk_instance, nullptr);
Expand All @@ -498,7 +498,7 @@ void GetGpuSupportedVulkanVersionAndExtensions(
}

// 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);
vkEnumeratePhysicalDevices(vk_instance, &physical_device_count,
physical_devices.data());
Expand Down Expand Up @@ -533,26 +533,26 @@ void GetGpuSupportedVulkanVersionAndExtensions(
base::UnloadNativeLibrary(vulkan_library);
}

void RecordGpuSupportedRuntimeVersionHistograms(GPUInfo* gpu_info) {
void RecordGpuSupportedRuntimeVersionHistograms(Dx12VulkanVersionInfo* info) {
// D3D
GetGpuSupportedD3D12Version(gpu_info);
UMA_HISTOGRAM_BOOLEAN("GPU.SupportsDX12", gpu_info->supports_dx12);
GetGpuSupportedD3D12Version(info);
UMA_HISTOGRAM_BOOLEAN("GPU.SupportsDX12", info->supports_dx12);
UMA_HISTOGRAM_ENUMERATION(
"GPU.D3D12FeatureLevel",
ConvertToHistogramFeatureLevel(gpu_info->d3d12_feature_level));
ConvertToHistogramFeatureLevel(info->d3d12_feature_level));

// Vulkan
const std::vector<const char*> vulkan_extensions = {
"VK_KHR_external_memory_win32", "VK_KHR_external_semaphore_win32",
"VK_KHR_win32_keyed_mutex"};
std::vector<bool> extension_support(vulkan_extensions.size(), false);
GetGpuSupportedVulkanVersionAndExtensions(gpu_info, vulkan_extensions,
GetGpuSupportedVulkanVersionAndExtensions(info, vulkan_extensions,
&extension_support);

UMA_HISTOGRAM_BOOLEAN("GPU.SupportsVulkan", gpu_info->supports_vulkan);
UMA_HISTOGRAM_BOOLEAN("GPU.SupportsVulkan", info->supports_vulkan);
UMA_HISTOGRAM_ENUMERATION(
"GPU.VulkanVersion",
ConvertToHistogramVulkanVersion(gpu_info->vulkan_version));
ConvertToHistogramVulkanVersion(info->vulkan_version));

for (size_t i = 0; i < vulkan_extensions.size(); ++i) {
std::string name = "GPU.VulkanExtSupport.";
Expand Down
Loading

0 comments on commit da88bdc

Please sign in to comment.