diff options
Diffstat (limited to 'Tests/VSWinStorePhone/Direct3DApp1/Direct3DBase.cpp')
-rw-r--r-- | Tests/VSWinStorePhone/Direct3DApp1/Direct3DBase.cpp | 301 |
1 files changed, 125 insertions, 176 deletions
diff --git a/Tests/VSWinStorePhone/Direct3DApp1/Direct3DBase.cpp b/Tests/VSWinStorePhone/Direct3DApp1/Direct3DBase.cpp index f09c8da..8f3452c 100644 --- a/Tests/VSWinStorePhone/Direct3DApp1/Direct3DBase.cpp +++ b/Tests/VSWinStorePhone/Direct3DApp1/Direct3DBase.cpp @@ -14,7 +14,7 @@ Direct3DBase::Direct3DBase() } // Initialize the Direct3D resources required to run. -void Direct3DBase::Initialize(CoreWindow^ window) +void Direct3DBase::Initialize(CoreWindow ^ window) { m_window = window; @@ -25,7 +25,8 @@ void Direct3DBase::Initialize(CoreWindow^ window) // Recreate all device resources and set them back to the current state. void Direct3DBase::HandleDeviceLost() { - // Reset these member variables to ensure that UpdateForWindowSizeChange recreates all resources. + // Reset these member variables to ensure that UpdateForWindowSizeChange + // recreates all resources. m_windowBounds.Width = 0; m_windowBounds.Height = 0; m_swapChain = nullptr; @@ -37,56 +38,50 @@ void Direct3DBase::HandleDeviceLost() // These are the resources that depend on the device. void Direct3DBase::CreateDeviceResources() { - // This flag adds support for surfaces with a different color channel ordering + // This flag adds support for surfaces with a different color channel + // ordering // than the API default. It is required for compatibility with Direct2D. UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #if defined(_DEBUG) - // If the project is in a debug build, enable debugging via SDK Layers with this flag. + // If the project is in a debug build, enable debugging via SDK Layers with + // this flag. creationFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif - // This array defines the set of DirectX hardware feature levels this app will support. + // This array defines the set of DirectX hardware feature levels this app + // will support. // Note the ordering should be preserved. - // Don't forget to declare your application's minimum required feature level in its - // description. All applications are assumed to support 9.1 unless otherwise stated. - D3D_FEATURE_LEVEL featureLevels[] = - { - 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, + // Don't forget to declare your application's minimum required feature level + // in its + // description. All applications are assumed to support 9.1 unless otherwise + // stated. + D3D_FEATURE_LEVEL featureLevels[] = { + 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 }; // Create the Direct3D 11 API device object and a corresponding context. ComPtr<ID3D11Device> device; ComPtr<ID3D11DeviceContext> context; - DX::ThrowIfFailed( - D3D11CreateDevice( - nullptr, // Specify nullptr to use the default adapter. - D3D_DRIVER_TYPE_HARDWARE, - nullptr, - creationFlags, // Set set debug and Direct2D compatibility flags. - featureLevels, // List of feature levels this app can support. - ARRAYSIZE(featureLevels), - D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION for Windows Store apps. - &device, // Returns the Direct3D device created. - &m_featureLevel, // Returns feature level of device created. - &context // Returns the device immediate context. - ) - ); + DX::ThrowIfFailed(D3D11CreateDevice( + nullptr, // Specify nullptr to use the default adapter. + D3D_DRIVER_TYPE_HARDWARE, nullptr, + creationFlags, // Set set debug and Direct2D compatibility flags. + featureLevels, // List of feature levels this app can support. + ARRAYSIZE(featureLevels), + D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION for Windows + // Store apps. + &device, // Returns the Direct3D device created. + &m_featureLevel, // Returns feature level of device created. + &context // Returns the device immediate context. + )); // Get the Direct3D 11.1 API device and context interfaces. - DX::ThrowIfFailed( - device.As(&m_d3dDevice) - ); + DX::ThrowIfFailed(device.As(&m_d3dDevice)); - DX::ThrowIfFailed( - context.As(&m_d3dContext) - ); + DX::ThrowIfFailed(context.As(&m_d3dContext)); } // Allocate all memory resources that change on a window SizeChanged event. @@ -100,9 +95,9 @@ void Direct3DBase::CreateWindowSizeDependentResources() float windowWidth = ConvertDipsToPixels(m_windowBounds.Width); float windowHeight = ConvertDipsToPixels(m_windowBounds.Height); - // The width and height of the swap chain must be based on the window's - // landscape-oriented width and height. If the window is in a portrait - // orientation, the dimensions must be reversed. +// The width and height of the swap chain must be based on the window's +// landscape-oriented width and height. If the window is in a portrait +// orientation, the dimensions must be reversed. #if WINVER > 0x0602 m_orientation = DisplayInformation::GetForCurrentView()->CurrentOrientation; #else @@ -113,126 +108,100 @@ void Direct3DBase::CreateWindowSizeDependentResources() m_orientation = DisplayProperties::CurrentOrientation; #endif #endif - bool swapDimensions = - m_orientation == DisplayOrientations::Portrait || + bool swapDimensions = m_orientation == DisplayOrientations::Portrait || m_orientation == DisplayOrientations::PortraitFlipped; m_renderTargetSize.Width = swapDimensions ? windowHeight : windowWidth; m_renderTargetSize.Height = swapDimensions ? windowWidth : windowHeight; - if(m_swapChain != nullptr) - { + if (m_swapChain != nullptr) { // If the swap chain already exists, resize it. DX::ThrowIfFailed( - m_swapChain->ResizeBuffers( - 2, // Double-buffered swap chain. - static_cast<UINT>(m_renderTargetSize.Width), - static_cast<UINT>(m_renderTargetSize.Height), - DXGI_FORMAT_B8G8R8A8_UNORM, - 0 - ) - ); - } - else - { - // Otherwise, create a new one using the same adapter as the existing Direct3D device. - DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; - swapChainDesc.Width = static_cast<UINT>(m_renderTargetSize.Width); // Match the size of the window. + m_swapChain->ResizeBuffers(2, // Double-buffered swap chain. + static_cast<UINT>(m_renderTargetSize.Width), + static_cast<UINT>(m_renderTargetSize.Height), + DXGI_FORMAT_B8G8R8A8_UNORM, 0)); + } else { + // Otherwise, create a new one using the same adapter as the existing + // Direct3D device. + DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; + swapChainDesc.Width = static_cast<UINT>( + m_renderTargetSize.Width); // Match the size of the window. swapChainDesc.Height = static_cast<UINT>(m_renderTargetSize.Height); - swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format. + swapChainDesc.Format = + DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format. swapChainDesc.Stereo = false; swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling. swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; #if PHONE && WINVER <= 0x0602 swapChainDesc.BufferCount = 1; // Use double-buffering to minimize latency. - swapChainDesc.Scaling = DXGI_SCALING_STRETCH; // On phone, only stretch and aspect-ratio stretch scaling are allowed. - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // On phone, no swap effects are supported. + swapChainDesc.Scaling = DXGI_SCALING_STRETCH; // On phone, only stretch and + // aspect-ratio stretch + // scaling are allowed. + swapChainDesc.SwapEffect = + DXGI_SWAP_EFFECT_DISCARD; // On phone, no swap effects are supported. #else swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency. swapChainDesc.Scaling = DXGI_SCALING_NONE; - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect. + swapChainDesc.SwapEffect = + DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this + // SwapEffect. #endif swapChainDesc.Flags = 0; - ComPtr<IDXGIDevice1> dxgiDevice; - DX::ThrowIfFailed( - m_d3dDevice.As(&dxgiDevice) - ); + ComPtr<IDXGIDevice1> dxgiDevice; + DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice)); ComPtr<IDXGIAdapter> dxgiAdapter; - DX::ThrowIfFailed( - dxgiDevice->GetAdapter(&dxgiAdapter) - ); + DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter)); ComPtr<IDXGIFactory2> dxgiFactory; DX::ThrowIfFailed( - dxgiAdapter->GetParent( - __uuidof(IDXGIFactory2), - &dxgiFactory - ) - ); - - Windows::UI::Core::CoreWindow^ window = m_window.Get(); - DX::ThrowIfFailed( - dxgiFactory->CreateSwapChainForCoreWindow( - m_d3dDevice.Get(), - reinterpret_cast<IUnknown*>(window), - &swapChainDesc, - nullptr, // Allow on all displays. - &m_swapChain - ) - ); - - // Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and - // ensures that the application will only render after each VSync, minimizing power consumption. - DX::ThrowIfFailed( - dxgiDevice->SetMaximumFrameLatency(1) - ); + dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), &dxgiFactory)); + + Windows::UI::Core::CoreWindow ^ window = m_window.Get(); + DX::ThrowIfFailed(dxgiFactory->CreateSwapChainForCoreWindow( + m_d3dDevice.Get(), reinterpret_cast<IUnknown*>(window), &swapChainDesc, + nullptr, // Allow on all displays. + &m_swapChain)); + + // Ensure that DXGI does not queue more than one frame at a time. This both + // reduces latency and + // ensures that the application will only render after each VSync, + // minimizing power consumption. + DX::ThrowIfFailed(dxgiDevice->SetMaximumFrameLatency(1)); } // Set the proper orientation for the swap chain, and generate the // 3D matrix transformation for rendering to the rotated swap chain. DXGI_MODE_ROTATION rotation = DXGI_MODE_ROTATION_UNSPECIFIED; - switch (m_orientation) - { + switch (m_orientation) { case DisplayOrientations::Landscape: rotation = DXGI_MODE_ROTATION_IDENTITY; m_orientationTransform3D = XMFLOAT4X4( // 0-degree Z-rotation - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - ); + 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f); break; case DisplayOrientations::Portrait: rotation = DXGI_MODE_ROTATION_ROTATE270; m_orientationTransform3D = XMFLOAT4X4( // 90-degree Z-rotation - 0.0f, 1.0f, 0.0f, 0.0f, - -1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - ); + 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); break; case DisplayOrientations::LandscapeFlipped: rotation = DXGI_MODE_ROTATION_ROTATE180; m_orientationTransform3D = XMFLOAT4X4( // 180-degree Z-rotation - -1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, -1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - ); + -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); break; case DisplayOrientations::PortraitFlipped: rotation = DXGI_MODE_ROTATION_ROTATE90; m_orientationTransform3D = XMFLOAT4X4( // 270-degree Z-rotation - 0.0f, -1.0f, 0.0f, 0.0f, - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - ); + 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); break; default: @@ -240,64 +209,35 @@ void Direct3DBase::CreateWindowSizeDependentResources() } #if !PHONE || WINVER > 0x0602 - DX::ThrowIfFailed( - m_swapChain->SetRotation(rotation) - ); + DX::ThrowIfFailed(m_swapChain->SetRotation(rotation)); #endif // !PHONE // Create a render target view of the swap chain back buffer. ComPtr<ID3D11Texture2D> backBuffer; DX::ThrowIfFailed( - m_swapChain->GetBuffer( - 0, - __uuidof(ID3D11Texture2D), - &backBuffer - ) - ); + m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), &backBuffer)); - DX::ThrowIfFailed( - m_d3dDevice->CreateRenderTargetView( - backBuffer.Get(), - nullptr, - &m_renderTargetView - ) - ); + DX::ThrowIfFailed(m_d3dDevice->CreateRenderTargetView( + backBuffer.Get(), nullptr, &m_renderTargetView)); // Create a depth stencil view. CD3D11_TEXTURE2D_DESC depthStencilDesc( - DXGI_FORMAT_D24_UNORM_S8_UINT, - static_cast<UINT>(m_renderTargetSize.Width), - static_cast<UINT>(m_renderTargetSize.Height), - 1, - 1, - D3D11_BIND_DEPTH_STENCIL - ); + DXGI_FORMAT_D24_UNORM_S8_UINT, static_cast<UINT>(m_renderTargetSize.Width), + static_cast<UINT>(m_renderTargetSize.Height), 1, 1, + D3D11_BIND_DEPTH_STENCIL); ComPtr<ID3D11Texture2D> depthStencil; DX::ThrowIfFailed( - m_d3dDevice->CreateTexture2D( - &depthStencilDesc, - nullptr, - &depthStencil - ) - ); - - CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D); - DX::ThrowIfFailed( - m_d3dDevice->CreateDepthStencilView( - depthStencil.Get(), - &depthStencilViewDesc, - &m_depthStencilView - ) - ); + m_d3dDevice->CreateTexture2D(&depthStencilDesc, nullptr, &depthStencil)); + + CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc( + D3D11_DSV_DIMENSION_TEXTURE2D); + DX::ThrowIfFailed(m_d3dDevice->CreateDepthStencilView( + depthStencil.Get(), &depthStencilViewDesc, &m_depthStencilView)); // Set the rendering viewport to target the entire window. - CD3D11_VIEWPORT viewport( - 0.0f, - 0.0f, - m_renderTargetSize.Width, - m_renderTargetSize.Height - ); + CD3D11_VIEWPORT viewport(0.0f, 0.0f, m_renderTargetSize.Width, + m_renderTargetSize.Height); m_d3dContext->RSSetViewports(1, &viewport); } @@ -306,14 +246,15 @@ void Direct3DBase::CreateWindowSizeDependentResources() void Direct3DBase::UpdateForWindowSizeChange() { if (m_window->Bounds.Width != m_windowBounds.Width || - m_window->Bounds.Height != m_windowBounds.Height || + m_window->Bounds.Height != m_windowBounds.Height || #if WINVER > 0x0602 - m_orientation != DisplayInformation::GetForCurrentView()->CurrentOrientation) + m_orientation != + DisplayInformation::GetForCurrentView()->CurrentOrientation) #else - m_orientation != DisplayProperties::CurrentOrientation) + m_orientation != DisplayProperties::CurrentOrientation) #endif { - ID3D11RenderTargetView* nullViews[] = {nullptr}; + ID3D11RenderTargetView* nullViews[] = { nullptr }; m_d3dContext->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews, nullptr); m_renderTargetView = nullptr; m_depthStencilView = nullptr; @@ -324,10 +265,14 @@ void Direct3DBase::UpdateForWindowSizeChange() void Direct3DBase::ReleaseResourcesForSuspending() { - // Phone applications operate in a memory-constrained environment, so when entering - // the background it is a good idea to free memory-intensive objects that will be - // easy to restore upon reactivation. The swapchain and backbuffer are good candidates - // here, as they consume a large amount of memory and can be reinitialized quickly. + // Phone applications operate in a memory-constrained environment, so when + // entering + // the background it is a good idea to free memory-intensive objects that + // will be + // easy to restore upon reactivation. The swapchain and backbuffer are good + // candidates + // here, as they consume a large amount of memory and can be reinitialized + // quickly. m_swapChain = nullptr; m_renderTargetView = nullptr; m_depthStencilView = nullptr; @@ -336,9 +281,11 @@ void Direct3DBase::ReleaseResourcesForSuspending() // Method to deliver the final image to the display. void Direct3DBase::Present() { - // The first argument instructs DXGI to block until VSync, putting the application - // to sleep until the next VSync. This ensures we don't waste any cycles rendering - // frames that will never be displayed to the screen. +// The first argument instructs DXGI to block until VSync, putting the +// application +// to sleep until the next VSync. This ensures we don't waste any cycles +// rendering +// frames that will never be displayed to the screen. #if PHONE && WINVER <= 0x0602 HRESULT hr = m_swapChain->Present(1, 0); #else @@ -350,12 +297,13 @@ void Direct3DBase::Present() parameters.pScrollRect = nullptr; parameters.pScrollOffset = nullptr; - HRESULT hr = m_swapChain->Present1(1, 0 , ¶meters); + HRESULT hr = m_swapChain->Present1(1, 0, ¶meters); #endif // Discard the contents of the render target. // This is a valid operation only when the existing contents will be entirely - // overwritten. If dirty or scroll rects are used, this call should be removed. + // overwritten. If dirty or scroll rects are used, this call should be + // removed. m_d3dContext->DiscardView(m_renderTargetView.Get()); // Discard the contents of the depth stencil. @@ -363,23 +311,24 @@ void Direct3DBase::Present() // If the device was removed either by a disconnect or a driver upgrade, we // must recreate all device resources. - if (hr == DXGI_ERROR_DEVICE_REMOVED) - { + if (hr == DXGI_ERROR_DEVICE_REMOVED) { HandleDeviceLost(); - } - else - { + } else { DX::ThrowIfFailed(hr); } } -// Method to convert a length in device-independent pixels (DIPs) to a length in physical pixels. +// Method to convert a length in device-independent pixels (DIPs) to a length +// in physical pixels. float Direct3DBase::ConvertDipsToPixels(float dips) { static const float dipsPerInch = 96.0f; #if WINVER > 0x0602 - return floor(dips * DisplayInformation::GetForCurrentView()->LogicalDpi / dipsPerInch + 0.5f); // Round to nearest integer. + return floor(dips * DisplayInformation::GetForCurrentView()->LogicalDpi / + dipsPerInch + + 0.5f); // Round to nearest integer. #else - return floor(dips * DisplayProperties::LogicalDpi / dipsPerInch + 0.5f); // Round to nearest integer. + return floor(dips * DisplayProperties::LogicalDpi / dipsPerInch + + 0.5f); // Round to nearest integer. #endif } |