Ejemplo n.º 1
0
	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);
				}
			}
		}
	}
Ejemplo n.º 2
0
	/**
	*  @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();
				}
			}
		}
	}