ID3D12GraphicsCommandList :: Close()返回E_INVALIDARG

时间:2015-12-11 23:01:34

标签: c++ windows-10 direct3d direct3d12

我正在关注Direct3D12上的Rastertek教程,可以找到here

我已经仔细检查以确保我的所有代码都与他相同,但我遇到了命令列表的问题。当我在清除后缓冲区后关闭命令列表时,方法ID3D12GraphicsCommandList::Close()返回E_INVALIDARG,这意味着在记录命令列表期间我做错了。但是,我所做的一切似乎都不对。

D3D12_RESOURCE_BARRIER Barrier;

hr = CommandAllocator->Reset(); HANDLE_HR(__LINE__);

hr = CommandList->Reset (
    CommandAllocator,
    nullptr
); HANDLE_HR(__LINE__);

Barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
Barrier.Transition.pResource = RenderTargetResource[BufferIndex];
Barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
Barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
Barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
Barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;

CommandList->ResourceBarrier(1, &Barrier);

RenderTargetViewPtr.ptr = RenderTargetViewHandle.ptr + BufferIndex * RenderTargetBytes;

CommandList->OMSetRenderTargets(1, &RenderTargetViewPtr, FALSE, nullptr);

FLOAT color[] = { 1.0, 1.0, 1.0, 1.0 };

CommandList->ClearRenderTargetView(RenderTargetViewHandle, color, 0, nullptr);

Barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
Barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;

CommandList->ResourceBarrier(1, &Barrier);

hr = CommandList->Close(); HANDLE_HR(__LINE__);

我的整个项目可以在this github branch找到。

此代码有什么问题?

似乎资源障碍是问题,但它们相当无害。评论OMSetRenderTargets()ClearRenderTargetView()仍会导致从E_INVALIDARG返回Close()

我也尝试使用ID3D12InfoQueue界面来找出问题所在。 Close()返回错误时队列中没有消息 - 我已检查以确保接口正常工作,因为消息执行时会出现其他错误。

0 个答案:

没有答案