123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- #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<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.
- &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<UINT>(m_renderTargetSize.Width),
- static_cast<UINT>(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<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
- )
- );
- // 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;
- }
|