void D3D12Fullscreen::LoadSizeDependentResources() { UpdatePostViewAndScissor(); // Create frame resources. { CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart()); // Create a RTV for each frame. for (UINT n = 0; n < FrameCount; n++) { ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n]))); m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle); rtvHandle.Offset(1, m_rtvDescriptorSize); NAME_D3D12_OBJECT_INDEXED(m_renderTargets, n); } } // Update resolutions shown in app title. UpdateTitle(); // This is where you would create/resize intermediate render targets, depth stencils, or other resources // dependent on the window size. }
// Set up appropriate views for the intermediate render target. void D3D12Fullscreen::LoadSceneResolutionDependentResources() { // Update resolutions shown in app title. UpdateTitle(); // Set up the scene viewport and scissor rect to match the current scene rendering resolution. { m_sceneViewport.Width = static_cast<float>(m_resolutionOptions[m_resolutionIndex].Width); m_sceneViewport.Height = static_cast<float>(m_resolutionOptions[m_resolutionIndex].Height); m_sceneViewport.MaxDepth = 1.0f; m_sceneScissorRect.right = static_cast<LONG>(m_resolutionOptions[m_resolutionIndex].Width); m_sceneScissorRect.bottom = static_cast<LONG>(m_resolutionOptions[m_resolutionIndex].Height); } // Update post-process viewport and scissor rectangle. UpdatePostViewAndScissor(); // Create RTV for the intermediate render target. { D3D12_RESOURCE_DESC swapChainDesc = m_renderTargets[m_frameIndex]->GetDesc(); const CD3DX12_CLEAR_VALUE clearValue(swapChainDesc.Format, ClearColor); const CD3DX12_RESOURCE_DESC renderTargetDesc = CD3DX12_RESOURCE_DESC::Tex2D( swapChainDesc.Format, m_resolutionOptions[m_resolutionIndex].Width, m_resolutionOptions[m_resolutionIndex].Height, 1u, 1u, swapChainDesc.SampleDesc.Count, swapChainDesc.SampleDesc.Quality, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET, D3D12_TEXTURE_LAYOUT_UNKNOWN, 0u); CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), FrameCount, m_rtvDescriptorSize); ThrowIfFailed(m_device->CreateCommittedResource( &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), D3D12_HEAP_FLAG_NONE, &renderTargetDesc, D3D12_RESOURCE_STATE_RENDER_TARGET, &clearValue, IID_PPV_ARGS(&m_intermediateRenderTarget))); m_device->CreateRenderTargetView(m_intermediateRenderTarget.Get(), nullptr, rtvHandle); NAME_D3D12_OBJECT(m_intermediateRenderTarget); } // Create SRV for the intermediate render target. m_device->CreateShaderResourceView(m_intermediateRenderTarget.Get(), nullptr, m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart()); }