DirectX 12 Initialize Error:COMMAND_LIST_MULTIPLE_SWAPCHAIN_BUFFER_REFERENCES in my Draw() function

Viewed 39

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!

0 Answers
Related