void Graphics::CameraResources::CreateResourcesForBackBuffer()

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
                )
            );
    }
}