Поделиться через


Метод ID3D12CommandQueue::ExecuteCommandLists (d3d12.h)

Отправляет массив списков команд для выполнения.

Синтаксис

void ExecuteCommandLists(
  [in] UINT              NumCommandLists,
  [in] ID3D12CommandList * const *ppCommandLists
);

Параметры

[in] NumCommandLists

Количество списков команд, которые необходимо выполнить.

[in] ppCommandLists

Массив списков команд ID3D12CommandList для выполнения.

Возвращаемое значение

None

Remarks

Вызов ExecuteCommandLists дважды подряд (из одного потока или разных потоков) гарантирует, что первая рабочая нагрузка (A) завершится до второй рабочей нагрузки (B). Вызов ExecuteCommandLists с двумя списками команд позволяет драйверу объединить два списка команд таким образом, чтобы второй список команд (D) мог начать выполнение работы до завершения всех работ из первого списка (C). В частности, приложению разрешено вставлять сигнал ограждения или ждать между A и B, и драйвер не имеет видимости этого, поэтому драйвер должен убедиться, что все в A завершено до операции ограждения. В одном вызове API такая возможность отсутствует, поэтому драйвер может оптимизировать этот сценарий.

Драйвер может исправлять отправленные списки команд. Вызывающее приложение отвечает за то, чтобы блок обработки графики (GPU) в настоящее время не считывал ни один из отправленных списков команд из предыдущего выполнения.

Приложениям рекомендуется пакетировать выполнение списков команд, чтобы снизить фиксированные затраты, связанные с отправленными командами в GPU.

Проверка среды выполнения

Пакеты нельзя отправлять в очередь команд напрямую. Если пакет передается этому методу, среда выполнения откатит вызов. Среда выполнения также отключит вызов, если функция Close не была вызвана в одном или нескольких списках команд.

Среда выполнения определит, были ли сброшены распределители команд, связанные со списками команд, после вызова close . В этой ситуации среда выполнения отменит вызов и удалит устройство.

Среда выполнения отменит вызов и удалит устройство, если ограждение очереди команд указывает на то, что предыдущее выполнение какого-либо списка команд еще не завершено.

Среда выполнения проверит состояния "до" и "после" барьеров перехода ресурсов внутри ExecuteCommandLists. Если состояние "до" перехода не совпадает с состоянием "после" предыдущего перехода, среда выполнения отменит вызов и удалит устройство.

Среда выполнения проверяет состояния "до" и "после" запросов, используемых списками команд. При обнаружении ошибки среда выполнения отменит вызов и удалит устройство.

Уровень отладки

Уровень отладки выдает ошибки во всех случаях, когда среда выполнения удаляет вызов.

Уровень отладки выдает ошибку, если обнаруживает, что любой ресурс, на который ссылается список команд, включая запросы, был уничтожен.

Примеры

Отрисовывает сцену.

// Pipeline objects.
D3D12_VIEWPORT m_viewport;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D11DeviceContext> m_d3d11DeviceContext;
ComPtr<ID3D11On12Device> m_d3d11On12Device;
ComPtr<ID3D12Device> m_d3d12Device;
ComPtr<IDWriteFactory> m_dWriteFactory;
ComPtr<ID2D1Factory3> m_d2dFactory;
ComPtr<ID2D1Device2> m_d2dDevice;
ComPtr<ID2D1DeviceContext2> m_d2dDeviceContext;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D11Resource> m_wrappedBackBuffers[FrameCount];
ComPtr<ID2D1Bitmap1> m_d2dRenderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocators[FrameCount];
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
D3D12_RECT m_scissorRect;
// Render the scene.
void D3D1211on12::OnRender()
{
    // Record all the commands we need to render the scene into the command list.
    PopulateCommandList();

    // Execute the command list.
    ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() };
    m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);

    RenderUI();

    // Present the frame.
    ThrowIfFailed(m_swapChain->Present(1, 0));

    MoveToNextFrame();
}

См. пример кода в справочнике по D3D12.

Требования

   
Целевая платформа Windows
Header d3d12.h

См. также раздел

ID3D12CommandQueue