小编Ant*_*eux的帖子

DXGI 可等待交换链不等待

我设置了一个 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)

directx dxgi directx-12

6
推荐指数
1
解决办法
2153
查看次数

标签 统计

directx ×1

directx-12 ×1

dxgi ×1