#include "pch.h" #include "Direct3DBase.h" using namespace DirectX; using namespace Microsoft::WRL; using namespace Windows::UI::Core; using namespace Windows::Foundation; using namespace Windows::Graphics::Display; // Constructor. Direct3DBase::Direct3DBase() { } // Initialize the Direct3D resources required to run. void Direct3DBase::Initialize() { CreateDeviceResources(); } // These are the resources that depend on the device. void Direct3DBase::CreateDeviceResources() { // 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. creationFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif // 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 }; // Create the Direct3D 11 API device object and a corresponding context. ComPtr device; ComPtr 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. &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( context.As(&m_d3dContext) ); } // Allocate all memory resources that depend on the window size. void Direct3DBase::CreateWindowSizeDependentResources() { // Create a descriptor for the render target buffer. CD3D11_TEXTURE2D_DESC renderTargetDesc( DXGI_FORMAT_B8G8R8A8_UNORM, static_cast(m_renderTargetSize.Width), static_cast(m_renderTargetSize.Height), 1, 1, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE ); renderTargetDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX | D3D11_RESOURCE_MISC_SHARED_NTHANDLE; // Allocate a 2-D surface as the render target buffer. DX::ThrowIfFailed( m_d3dDevice->CreateTexture2D( &renderTargetDesc, nullptr, &m_renderTarget ) ); DX::ThrowIfFailed( m_d3dDevice->CreateRenderTargetView( m_renderTarget.Get(), nullptr, &m_renderTargetView ) ); // Create a depth stencil view. CD3D11_TEXTURE2D_DESC depthStencilDesc( DXGI_FORMAT_D24_UNORM_S8_UINT, static_cast(m_renderTargetSize.Width), static_cast(m_renderTargetSize.Height), 1, 1, D3D11_BIND_DEPTH_STENCIL ); ComPtr 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 ) ); // Set the rendering viewport to target the entire window. CD3D11_VIEWPORT viewport( 0.0f, 0.0f, m_renderTargetSize.Width, m_renderTargetSize.Height ); m_d3dContext->RSSetViewports(1, &viewport); } void Direct3DBase::UpdateForRenderResolutionChange(float width, float height) { m_renderTargetSize.Width = width; m_renderTargetSize.Height = height; ID3D11RenderTargetView* nullViews[] = {nullptr}; m_d3dContext->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews, nullptr); m_renderTarget = nullptr; m_renderTargetView = nullptr; m_depthStencilView = nullptr; m_d3dContext->Flush(); CreateWindowSizeDependentResources(); } void Direct3DBase::UpdateForWindowSizeChange(float width, float height) { m_windowBounds.Width = width; m_windowBounds.Height = height; }