Index: win8/metro_driver/direct3d_helper.cc |
diff --git a/win8/metro_driver/direct3d_helper.cc b/win8/metro_driver/direct3d_helper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f787237364b47a4c13206bd5ad074b5d06b10a73 |
--- /dev/null |
+++ b/win8/metro_driver/direct3d_helper.cc |
@@ -0,0 +1,127 @@ |
+// Copyright 2012 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 "stdafx.h" |
+#include "win8/metro_driver/direct3d_helper.h" |
+#include "win8/metro_driver/winrt_utils.h" |
+ |
+#include "base/logging.h" |
+ |
+#include <windows.graphics.display.h> |
+ |
+namespace { |
+ |
+void CheckIfFailed(HRESULT hr) { |
+ DCHECK(!FAILED(hr)); |
+ DVLOG(ERROR) << "Direct3D call failed, hr = " << hr; |
+} |
+ |
+float GetLogicalDpi() { |
+ mswr::ComPtr<wingfx::Display::IDisplayPropertiesStatics> display_properties; |
+ CheckIfFailed(winrt_utils::CreateActivationFactory( |
+ RuntimeClass_Windows_Graphics_Display_DisplayProperties, |
+ display_properties.GetAddressOf())); |
+ float dpi = 0.0; |
+ CheckIfFailed(display_properties->get_LogicalDpi(&dpi)); |
+ return dpi; |
+} |
+ |
+float ConvertDipsToPixels(float dips) { |
+ static const float dips_per_inch = 96.f; |
+ float logical_dpi = GetLogicalDpi(); |
+ return floor(dips * logical_dpi / dips_per_inch + 0.5f); |
+} |
+ |
+} |
+ |
+namespace metro_driver { |
+ |
+Direct3DHelper::Direct3DHelper() { |
+} |
+ |
+Direct3DHelper::~Direct3DHelper() { |
+} |
+ |
+void Direct3DHelper::Initialize(winui::Core::ICoreWindow* window) { |
+ window_ = window; |
+ CreateDeviceResources(); |
+ CreateWindowSizeDependentResources(); |
+} |
+ |
+// TODO(scottmg): Need to handle resize messages and recreation. |
+ |
+void Direct3DHelper::CreateDeviceResources() { |
+ unsigned int creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; |
+ D3D_FEATURE_LEVEL feature_levels[] = { |
+ D3D_FEATURE_LEVEL_11_1, |
+ D3D_FEATURE_LEVEL_11_0, |
+ D3D_FEATURE_LEVEL_10_1, |
+ D3D_FEATURE_LEVEL_10_0, |
+ D3D_FEATURE_LEVEL_9_3, |
+ D3D_FEATURE_LEVEL_9_2, |
+ D3D_FEATURE_LEVEL_9_1, |
+ }; |
+ |
+ mswr::ComPtr<ID3D11Device> device; |
+ mswr::ComPtr<ID3D11DeviceContext> context; |
+ CheckIfFailed( |
+ D3D11CreateDevice( |
+ nullptr, |
+ D3D_DRIVER_TYPE_HARDWARE, |
+ nullptr, |
+ creation_flags, |
+ feature_levels, |
+ ARRAYSIZE(feature_levels), |
+ D3D11_SDK_VERSION, |
+ &device, |
+ &feature_level_, |
+ &context)); |
+ CheckIfFailed(device.As(&d3d_device_)); |
+ CheckIfFailed(context.As(&d3d_context_)); |
+} |
+ |
+void Direct3DHelper::CreateWindowSizeDependentResources() { |
+ CheckIfFailed(window_->get_Bounds(&window_bounds_)); |
+ float window_width = ConvertDipsToPixels(window_bounds_.Width); |
+ float window_height = ConvertDipsToPixels(window_bounds_.Height); |
+ |
+ // TODO(scottmg): Orientation. |
+ |
+ if (swap_chain_ != nullptr) { |
+ // TODO(scottmg): Resize if it already exists. |
+ NOTIMPLEMENTED(); |
+ } else { |
+ DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = { 0 }; |
+ swap_chain_desc.Width = window_width; |
+ swap_chain_desc.Height = window_height; |
+ swap_chain_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; |
+ swap_chain_desc.Stereo = false; |
+ swap_chain_desc.SampleDesc.Count = 1; |
+ swap_chain_desc.SampleDesc.Quality = 0; |
+ swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; |
+ swap_chain_desc.BufferCount = 2; // TODO(scottmg): Probably 1 is fine. |
+ swap_chain_desc.Scaling = DXGI_SCALING_NONE; |
+ swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; |
+ swap_chain_desc.Flags = 0; |
+ |
+ mswr::ComPtr<IDXGIDevice1> dxgi_device; |
+ CheckIfFailed(d3d_device_.As(&dxgi_device)); |
+ |
+ mswr::ComPtr<IDXGIAdapter> dxgi_adapter; |
+ CheckIfFailed(dxgi_device->GetAdapter(&dxgi_adapter)); |
+ |
+ mswr::ComPtr<IDXGIFactory2> dxgi_factory; |
+ CheckIfFailed(dxgi_adapter->GetParent( |
+ __uuidof(IDXGIFactory2), &dxgi_factory)); |
+ |
+ CheckIfFailed(dxgi_factory->CreateSwapChainForCoreWindow( |
+ d3d_device_.Get(), |
+ reinterpret_cast<IUnknown*>(window_), |
+ &swap_chain_desc, |
+ nullptr, |
+ &swap_chain_)); |
+ } |
+} |
+ |
+} // namespace metro_driver |