in Shared/Graphics/CameraResources.cpp [35:145]
void Graphics::CameraResources::CreateResourcesForBackBuffer(
Graphics::DeviceResources* pDeviceResources,
HolographicCameraRenderingParameters^ cameraParameters
)
{
const auto device = pDeviceResources->GetD3DDevice();
// Get the WinRT object representing the holographic camera's back buffer.
IDirect3DSurface^ surface = cameraParameters->Direct3D11BackBuffer;
// Get a DXGI interface for the holographic camera's back buffer.
// Holographic cameras do not provide the DXGI swap chain, which is owned
// by the system. The Direct3D back buffer resource is provided using WinRT
// interop APIs.
ComPtr<ID3D11Resource> resource;
ASSERT_SUCCEEDED(
GetDXGIInterfaceFromObject(surface, IID_PPV_ARGS(&resource))
);
// Get a Direct3D interface for the holographic camera's back buffer.
ComPtr<ID3D11Texture2D> cameraBackBuffer;
ASSERT_SUCCEEDED(
resource.As(&cameraBackBuffer)
);
// Determine if the back buffer has changed. If so, ensure that the render target view
// is for the current back buffer.
if (_d3dBackBuffer.Get() != cameraBackBuffer.Get())
{
// This can change every frame as the system moves to the next buffer in the
// swap chain. This mode of operation will occur when certain rendering modes
// are activated.
_d3dBackBuffer = cameraBackBuffer;
// Create a render target view of the back buffer.
// Creating this resource is inexpensive, and is better than keeping track of
// the back buffers in order to pre-allocate render target views for each one.
ASSERT_SUCCEEDED(
device->CreateRenderTargetView(
_d3dBackBuffer.Get(),
nullptr,
&_d3dRenderTargetView
)
);
// Get the DXGI format for the back buffer.
// This information can be accessed by the app using CameraResources::GetBackBufferDXGIFormat().
D3D11_TEXTURE2D_DESC backBufferDesc;
_d3dBackBuffer->GetDesc(&backBufferDesc);
_dxgiFormat = backBufferDesc.Format;
// Check for render target size changes.
Windows::Foundation::Size currentSize = _holographicCamera->RenderTargetSize;
if (_d3dRenderTargetSize != currentSize)
{
// Set render target size.
_d3dRenderTargetSize = currentSize;
// A new depth stencil view is also needed.
_d3dDepthStencilView.Reset();
}
}
// Refresh depth stencil resources, if needed.
if (_d3dDepthStencilView == nullptr)
{
// Create a depth stencil view for use with 3D rendering if needed.
CD3D11_TEXTURE2D_DESC depthStencilDesc(
DXGI_FORMAT_R16_TYPELESS,
static_cast<UINT>(_d3dRenderTargetSize.Width),
static_cast<UINT>(_d3dRenderTargetSize.Height),
_isStereo ? 2 : 1, // Create two textures when rendering in stereo.
1, // Use a single mipmap level.
D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE
);
ASSERT_SUCCEEDED(
device->CreateTexture2D(
&depthStencilDesc,
nullptr,
&_d3dDepthStencil
)
);
CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(
_isStereo ? D3D11_DSV_DIMENSION_TEXTURE2DARRAY : D3D11_DSV_DIMENSION_TEXTURE2D,
DXGI_FORMAT_D16_UNORM
);
ASSERT_SUCCEEDED(
device->CreateDepthStencilView(
_d3dDepthStencil.Get(),
&depthStencilViewDesc,
&_d3dDepthStencilView
)
);
}
// Create the constant buffer, if needed.
if (_viewProjectionConstantBuffer == nullptr)
{
// Create a constant buffer to store view and projection matrices for the camera.
CD3D11_BUFFER_DESC constantBufferDesc(sizeof(ViewProjectionConstantBuffer), D3D11_BIND_CONSTANT_BUFFER);
ASSERT_SUCCEEDED(
device->CreateBuffer(
&constantBufferDesc,
nullptr,
&_viewProjectionConstantBuffer
)
);
}
}