我设置了一个 DX12 应用程序,它只清除每帧的后缓冲区。
它确实是准系统:没有 PSO,没有根...唯一的特殊性是它在启动新帧( msdn waitable swap chain )之前等待交换链上的 Present() 完成(我将帧延迟设置为 1 ,如下所示)以及只有 2 个缓冲区)。
第一帧运行良好,但它立即开始绘制第二帧,当然,命令分配器抱怨它正在重置,而命令仍在 GPU 上执行。
我当然可以设置一个栅栏来等待 GPU 在移动到新框架之前完成,但我认为这是可等待交换链对象的工作。
这是渲染例程:
if (m_command_allocator->Reset() == E_FAIL) { throw; }
HRESULT res = S_OK;
res = m_command_list->Reset(m_command_allocator.Get(), nullptr);
if (res == E_FAIL || res == E_OUTOFMEMORY) { throw; }
m_command_list->ResourceBarrier(1,
&CD3DX12_RESOURCE_BARRIER::Transition(m_render_targets[m_frame_index].Get(),
D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
m_command_list->RSSetViewports(1, &m_screen_viewport);
m_command_list->RSSetScissorRects(1, &m_scissor_rect);
m_command_list->ClearRenderTargetView(get_rtv_handle(),
DirectX::Colors::BlueViolet, 0, nullptr);
m_command_list->OMSetRenderTargets(1, &get_rtv_handle(), true, nullptr);
m_command_list->ResourceBarrier(1,
&CD3DX12_RESOURCE_BARRIER::Transition(m_render_targets[m_frame_index].Get(),
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
tools::throw_if_failed(m_command_list->Close());
ID3D12CommandList* ppCommandLists[] = { m_command_list.Get() };
m_command_queue->ExecuteCommandLists(_countof(ppCommandLists),
ppCommandLists);
if (m_swap_chain->Present(1, …Run Code Online (Sandbox Code Playgroud)