I just start learning DX12 and follow 3D Game Programming With DirectX12 to code
But when i finishing coding and compiled and ran,it occured with this error:
A single command list cannot write to multiple buffers within a particular swapchain. [ STATE_SETTING ERROR #904: COMMAND_LIST_MULTIPLE_SWAPCHAIN_BUFFER_REFERENCES] Search for several hours on Internet and couldn't find useful solution.
I try solving this problems for a whole day but can't solve it.I've also searched it but find just a few results,and most of the solutions don't work.
void Draw()
{
//REUSE COMMAND ALLOCATOR AND COMMAND LIST
ThrowIfFailed(mCommandAllocator->Reset());
ThrowIfFailed(mCommandList->Reset(mCommandAllocator.Get(), nullptr));
//CONVERT TO RENDER TARGET TO GET READY TO BE RENDERED
UINT& ref_mCurrentBackBuffer = mCurrentBackBuffer;
D3D12_RESOURCE_BARRIER barrier = CD3DX12_RESOURCE_BARRIER::Transition(mSwapChainBuffer[ref_mCurrentBackBuffer].Get(),
D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
mCommandList->ResourceBarrier(1, &barrier);
//SET VIEWPORT AND SCISSORRECT
mCommandList->RSSetViewports(1, &mViewport);
mCommandList->RSSetScissorRects(1, &mScissorRect);
//GET HANDLE THEN CLEAR
D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = CD3DX12_CPU_DESCRIPTOR_HANDLE(mRtvHeap->GetCPUDescriptorHandleForHeapStart(),
ref_mCurrentBackBuffer, mrtvDescriptorSize);
mCommandList->ClearRenderTargetView(rtvHandle, DirectX::Colors::DeepPink, 0, nullptr); //CLEAR THE WHOLE RENDER TARGET INSTEAD OF JUST A RECT
D3D12_CPU_DESCRIPTOR_HANDLE dsvHandle = mDsvHeap->GetCPUDescriptorHandleForHeapStart();
mCommandList->ClearDepthStencilView(dsvHandle, D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL,
1.0f, 0, 0, nullptr);
//SET RENDER HANDLE
mCommandList->OMSetRenderTargets(1, &rtvHandle, true, &dsvHandle);
//CONVERT TO SHOW MODE,READY TO BE PUSH INTO FRONT BUFFER
D3D12_RESOURCE_BARRIER barrier1 = CD3DX12_RESOURCE_BARRIER::Transition(mSwapChainBuffer[ref_mCurrentBackBuffer].Get(),
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT);
mCommandList->ResourceBarrier(1, &barrier1);
ThrowIfFailed(mCommandList->Close());
ID3D12CommandList* mCommandLists[] = { mCommandList.Get() };
mCommandQueue->ExecuteCommandLists(_countof(mCommandLists), mCommandLists);
//SWAP FRONT BACK BUFFER
ThrowIfFailed(mSwapChain->Present(0, 0));
ref_mCurrentBackBuffer = (ref_mCurrentBackBuffer + 1) % 2;
FlushCommandQueue();
}
By Adding // to ClearRenderTarget() and OMSetRenderTarget(), it ran without error
The whole code is below: https://github.com/THRASHvektor/MyDxRenderer/tree/master
I am eager to know why this error occurs and get my code running.If somebody figure out plet me know pls,thank!