mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.9 KiB
162 lines
4.9 KiB
#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; |
|
}
|
|
|