blob: 4d8a21068f4905a19fc4c7b1800676f5ab8feb27 [file] [log] [blame]
// 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.
#include "remoting/host/win/evaluate_3d_display_mode.h"
#include <D3DCommon.h>
#include <comdef.h>
#include <dxgi1_3.h>
#include <wrl/client.h>
#include <iostream>
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/native_library.h"
#include "base/scoped_native_library.h"
#include "base/strings/string_util.h"
#include "base/win/windows_version.h"
#include "remoting/host/evaluate_capability.h"
#include "remoting/host/host_exit_codes.h"
#include "remoting/host/switches.h"
namespace remoting {
namespace {
constexpr char k3dDisplayModeEnabled[] = "3D-Display-Mode";
typedef HRESULT(WINAPI* CreateDXGIFactory2Function)(UINT Flags,
REFIID riid,
void** ppFactory);
} // namespace
int Evaluate3dDisplayMode() {
// CreateDXGIFactory2 does not exist prior to Win 8.1 but neither does 3D
// display mode.
if (base::win::GetVersion() < base::win::VERSION_WIN8_1)
return kSuccessExitCode;
// We can't directly reference CreateDXGIFactory2 is it does not exist on
// earlier Windows builds. Therefore we need a LoadLibrary / GetProcAddress
// dance.
base::ScopedNativeLibrary library(base::FilePath(L"dxgi.dll"));
if (!library.is_valid()) {
PLOG(INFO) << "Failed to get DXGI library module.";
return kInitializationFailed;
}
CreateDXGIFactory2Function factory_func =
reinterpret_cast<CreateDXGIFactory2Function>(
library.GetFunctionPointer("CreateDXGIFactory2"));
if (!factory_func) {
PLOG(INFO) << "Failed to get CreateDXGIFactory2 function handle.";
return kInitializationFailed;
}
Microsoft::WRL::ComPtr<IDXGIFactory2> factory;
HRESULT hr = factory_func(/*flags=*/0, IID_PPV_ARGS(&factory));
if (hr != S_OK) {
LOG(WARNING) << "CreateDXGIFactory2 failed: 0x" << std::hex << hr;
return kInitializationFailed;
}
if (factory->IsWindowedStereoEnabled())
std::cout << k3dDisplayModeEnabled << std::endl;
return kSuccessExitCode;
}
bool Get3dDisplayModeEnabled() {
std::string output;
if (EvaluateCapability(kEvaluate3dDisplayMode, &output) != kSuccessExitCode)
return false;
base::TrimString(output, base::kWhitespaceASCII, &output);
bool is_3d_display_mode_enabled = (output == k3dDisplayModeEnabled);
LOG_IF(INFO, is_3d_display_mode_enabled) << "3D Display Mode enabled.";
return is_3d_display_mode_enabled;
}
} // namespace remoting