void SwapChain::resizeBuffers() { // Is there a valid swap chain? if (nullptr != mDxgiSwapChain) { Direct3D11Renderer& direct3D11Renderer = static_cast<Direct3D11Renderer&>(getRenderer()); // Get the currently set render target Renderer::IRenderTarget *renderTargetBackup = direct3D11Renderer.omGetRenderTarget(); // In case this swap chain is the current render target, we have to unset it before continuing if (this == renderTargetBackup) { direct3D11Renderer.omSetRenderTarget(nullptr); } else { renderTargetBackup = nullptr; } // Release the views if (nullptr != mD3D11DepthStencilView) { mD3D11DepthStencilView->Release(); mD3D11DepthStencilView = nullptr; } if (nullptr != mD3D11RenderTargetView) { mD3D11RenderTargetView->Release(); mD3D11RenderTargetView = nullptr; } // Get the swap chain width and height, ensures they are never ever zero UINT width = 1; UINT height = 1; getSafeWidthAndHeight(width, height); // Resize the Direct3D 11 swap chain // -> Preserve the existing buffer count and format if (SUCCEEDED(mDxgiSwapChain->ResizeBuffers(0, width, height, DXGI_FORMAT_UNKNOWN, 0))) { // Create the Direct3D 11 views createDirect3D11Views(); // If required, restore the previously set render target if (nullptr != renderTargetBackup) { direct3D11Renderer.omSetRenderTarget(renderTargetBackup); } } } }
/** * @brief * Create the Direct3D 11 views */ void SwapChain::createDirect3D11Views() { // Create a render target view ID3D11Texture2D *d3d11Texture2DBackBuffer = nullptr; HRESULT hResult = mDxgiSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<LPVOID*>(&d3d11Texture2DBackBuffer)); if (SUCCEEDED(hResult)) { // Get the Direct3D 11 device instance ID3D11Device *d3d11Device = static_cast<Direct3D11Renderer&>(getRenderer()).getD3D11Device(); // Create a render target view hResult = d3d11Device->CreateRenderTargetView(d3d11Texture2DBackBuffer, nullptr, &mD3D11RenderTargetView); d3d11Texture2DBackBuffer->Release(); if (SUCCEEDED(hResult)) { // Get the swap chain width and height, ensures they are never ever zero UINT width = 1; UINT height = 1; getSafeWidthAndHeight(width, height); // Create depth stencil texture ID3D11Texture2D *d3d11Texture2DDepthStencil = nullptr; D3D11_TEXTURE2D_DESC d3d11Texture2DDesc; ::ZeroMemory(&d3d11Texture2DDesc, sizeof(d3d11Texture2DDesc)); d3d11Texture2DDesc.Width = width; d3d11Texture2DDesc.Height = height; d3d11Texture2DDesc.MipLevels = 1; d3d11Texture2DDesc.ArraySize = 1; d3d11Texture2DDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; d3d11Texture2DDesc.SampleDesc.Count = 1; d3d11Texture2DDesc.SampleDesc.Quality = 0; d3d11Texture2DDesc.Usage = D3D11_USAGE_DEFAULT; d3d11Texture2DDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; d3d11Texture2DDesc.CPUAccessFlags = 0; d3d11Texture2DDesc.MiscFlags = 0; hResult = d3d11Device->CreateTexture2D(&d3d11Texture2DDesc, nullptr, &d3d11Texture2DDepthStencil); if (SUCCEEDED(hResult)) { // Create the depth stencil view D3D11_DEPTH_STENCIL_VIEW_DESC d3d11DepthStencilViewDesc; ::ZeroMemory(&d3d11DepthStencilViewDesc, sizeof(d3d11DepthStencilViewDesc)); d3d11DepthStencilViewDesc.Format = d3d11Texture2DDesc.Format; d3d11DepthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; d3d11DepthStencilViewDesc.Texture2D.MipSlice = 0; d3d11Device->CreateDepthStencilView(d3d11Texture2DDepthStencil, &d3d11DepthStencilViewDesc, &mD3D11DepthStencilView); d3d11Texture2DDepthStencil->Release(); } } } }