// Create the resources that will be used every frame. void D3D12DynamicIndexing::CreateFrameResources() { // Initialize each frame resource. CD3DX12_CPU_DESCRIPTOR_HANDLE cbvSrvHandle(m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart(), CityMaterialCount + 1, m_cbvSrvDescriptorSize); // Move past the SRVs. for (UINT i = 0; i < FrameCount; i++) { FrameResource* pFrameResource = new FrameResource(m_device.Get(), CityRowCount, CityColumnCount, CityMaterialCount, CitySpacingInterval); UINT64 cbOffset = 0; for (UINT j = 0; j < CityRowCount; j++) { for (UINT k = 0; k < CityColumnCount; k++) { // Describe and create a constant buffer view (CBV). D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; cbvDesc.BufferLocation = pFrameResource->m_cbvUploadHeap->GetGPUVirtualAddress() + cbOffset; cbvDesc.SizeInBytes = sizeof(FrameResource::SceneConstantBuffer); cbOffset += cbvDesc.SizeInBytes; m_device->CreateConstantBufferView(&cbvDesc, cbvSrvHandle); cbvSrvHandle.Offset(m_cbvSrvDescriptorSize); } } pFrameResource->InitBundle(m_device.Get(), m_pipelineState.Get(), i, m_numIndices, &m_indexBufferView, &m_vertexBufferView, m_cbvSrvHeap.Get(), m_cbvSrvDescriptorSize, m_samplerHeap.Get(), m_rootSignature.Get()); m_frameResources.push_back(pFrameResource); } }
// Create the resources that will be used every frame. void D3D12DynamicIndexing::CreateFrameResources() { ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), m_pipelineState.Get())); // Initialize each frame resource. CD3DX12_CPU_DESCRIPTOR_HANDLE cbvSrvHandle(m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart(), CityMaterialCount + 1, m_cbvSrvDescriptorSize); // Move past the SRVs. for (UINT i = 0; i < FrameCount; i++) { FrameResource* pFrameResource = new FrameResource(m_device.Get(), CityRowCount, CityColumnCount, CityMaterialCount, CitySpacingInterval); UINT64 cbOffset = 0; for (UINT j = 0; j < CityRowCount; j++) { for (UINT k = 0; k < CityColumnCount; k++) { // Describe and create a constant buffer view (CBV). D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; cbvDesc.BufferLocation = pFrameResource->m_cbvUploadHeap->GetGPUVirtualAddress() + cbOffset; cbvDesc.SizeInBytes = sizeof(FrameResource::SceneConstantBuffer); cbOffset += cbvDesc.SizeInBytes; m_device->CreateConstantBufferView(&cbvDesc, cbvSrvHandle); cbvSrvHandle.Offset(m_cbvSrvDescriptorSize); } } pFrameResource->InitBundle(m_device.Get(), m_pipelineState.Get(), i, m_numIndices, &m_indexBufferView, &m_vertexBufferView, m_cbvSrvHeap.Get(), m_cbvSrvDescriptorSize, m_samplerHeap.Get(), m_rootSignature.Get()); m_frameResources.push_back(pFrameResource); } // Close the command list and use it to execute the initial setup. // This places the CBVs in the heap. ThrowIfFailed(m_commandList->Close()); ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); }