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


Метод ID3D12GraphicsCommandList::ResolveQueryData (d3d12.h)

Извлекает данные из запроса. ResolveQueryData работает со всеми типами кучи (по умолчанию, отправкой и обратной передачей).

Синтаксис

void ResolveQueryData(
  [in] ID3D12QueryHeap  *pQueryHeap,
  [in] D3D12_QUERY_TYPE Type,
  [in] UINT             StartIndex,
  [in] UINT             NumQueries,
  [in] ID3D12Resource   *pDestinationBuffer,
  [in] UINT64           AlignedDestinationBufferOffset
);

Параметры

[in] pQueryHeap

Тип: ID3D12QueryHeap*

Указывает ID3D12QueryHeap , содержащий запросы для разрешения.

[in] Type

Тип: D3D12_QUERY_TYPE

Указывает тип запроса, один член D3D12_QUERY_TYPE.

[in] StartIndex

Тип: UINT

Указывает индекс первого запроса для разрешения.

[in] NumQueries

Тип: UINT

Указывает количество запросов для разрешения.

[in] pDestinationBuffer

Тип: ID3D12Resource*

Указывает буфер назначения ID3D12Resource , который должен находиться в состоянии D3D12_RESOURCE_STATE_COPY_DEST.

[in] AlignedDestinationBufferOffset

Тип: UINT64

Задает смещение выравнивания в буфере назначения. Значение должно быть кратно 8 байтам.

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

None

Remarks

ResolveQueryData выполняет пакетную операцию, которая записывает данные запроса в буфер назначения. Данные запроса записываются в буфер назначения и параметр .

ResolveQueryData преобразует непрозрачные данные запросов приложения в кучу непрозрачных запросов приложения в значения, не зависящие от адаптера, которые могут быть доступны вашему приложению. Разрешение запросов в куче, которые не были завершены (так же, как и запросы ID3D12GraphicsCommandList::BeginQuery , но не ID3D12GraphicsCommandList::EndQuery) или которые были неинициализированы, приводит к неопределенному поведению и может привести к зависам или удалению устройства. Уровень отладки выдает ошибку, если обнаруживает, что приложение разрешило неполные или неинициализированные запросы.

Примечание

Разрешение неполных или неинициализированных запросов является неопределенным поведением, так как драйвер может внутренне хранить GPUVA или другие данные в неразрешенных запросах. Поэтому попытка разрешить эти запросы к неинициализированным данным может вызвать сбой страницы или зависание устройства. В более старых версиях уровня отладки это поведение не проверялось.

Двоичные запросы окклюзии записывают 64-разрядные данные на запрос. Наименьший значимый бит — 0 (объект был полностью occluded) или 1 (по крайней мере 1 выборка объекта была бы нарисована). Остальные биты — 0. Запросы к окклюзии записывают 64-разрядные данные на каждый запрос. Значение — это количество выборок, прошедших тестирование. Запросы меток времени записывают по 64 бита на запрос, что представляет собой тактовое значение, которое должно сравниваться с соответствующей частотой очереди команд (см. раздел Время выполнения).

Запросы статистики конвейера записывают D3D12_QUERY_DATA_PIPELINE_STATISTICS структуру для каждого запроса. Все запросы потоковой статистики записывают D3D12_QUERY_DATA_SO_STATISTICS структуру для каждого запроса.

Базовая среда выполнения проверит следующее.

  • StartIndex и NumQueries находятся в диапазоне.
  • AlignedDestinationBufferOffset кратно 8 байтам.
  • DestinationBuffer — это буфер.
  • Записанные данные не переполняют выходной буфер.
  • Тип запроса должен поддерживаться типом списка команд.
  • Тип запроса должен поддерживаться кучей запросов.

Уровень отладки выдаст предупреждение, если целевой буфер не находится в состоянии D3D12_RESOURCE_STATE_COPY_DEST или если для каких-либо разрешаемых запросов не был вызван ID3D12GraphicsCommandList::EndQuery .

Примеры

В примере D3D12PredicationQueries используется ID3D12GraphicsCommandList::ResolveQueryData следующим образом:

// Fill the command list with all the render commands and dependent state.
void D3D12PredicationQueries::PopulateCommandList()
{
    // Command list allocators can only be reset when the associated 
    // command lists have finished execution on the GPU; apps should use 
    // fences to determine GPU execution progress.
    ThrowIfFailed(m_commandAllocators[m_frameIndex]->Reset());

    // However, when ExecuteCommandList() is called on a particular command 
    // list, that command list can then be reset at any time and must be before 
    // re-recording.
    ThrowIfFailed(m_commandList->Reset(m_commandAllocators[m_frameIndex].Get(), m_pipelineState.Get()));

    // Set necessary state.
    m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());

    ID3D12DescriptorHeap* ppHeaps[] = { m_cbvHeap.Get() };
    m_commandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);

    m_commandList->RSSetViewports(1, &m_viewport);
    m_commandList->RSSetScissorRects(1, &m_scissorRect);

    // Indicate that the back buffer will be used as a render target.
    m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));

    CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize);
    CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
    m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, &dsvHandle);

    // Record commands.
    const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
    m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
    m_commandList->ClearDepthStencilView(dsvHandle, D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);

    // Draw the quads and perform the occlusion query.
    {
        CD3DX12_GPU_DESCRIPTOR_HANDLE cbvFarQuad(m_cbvHeap->GetGPUDescriptorHandleForHeapStart(), m_frameIndex * CbvCountPerFrame, m_cbvSrvDescriptorSize);
        CD3DX12_GPU_DESCRIPTOR_HANDLE cbvNearQuad(cbvFarQuad, m_cbvSrvDescriptorSize);

        m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
        m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);

        // Draw the far quad conditionally based on the result of the occlusion query
        // from the previous frame.
        m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
        m_commandList->SetPredication(m_queryResult.Get(), 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
        m_commandList->DrawInstanced(4, 1, 0, 0);

        // Disable predication and always draw the near quad.
        m_commandList->SetPredication(nullptr, 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
        m_commandList->SetGraphicsRootDescriptorTable(0, cbvNearQuad);
        m_commandList->DrawInstanced(4, 1, 4, 0);

        // Run the occlusion query with the bounding box quad.
        m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
        m_commandList->SetPipelineState(m_queryState.Get());
        m_commandList->BeginQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);
        m_commandList->DrawInstanced(4, 1, 8, 0);
        m_commandList->EndQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);

        // Resolve the occlusion query and store the results in the query result buffer
        // to be used on the subsequent frame.
        m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_PREDICATION, D3D12_RESOURCE_STATE_COPY_DEST));
        m_commandList->ResolveQueryData(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0, 1, m_queryResult.Get(), 0);
        m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PREDICATION));
    }

    // Indicate that the back buffer will now be used to present.
    m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));

    ThrowIfFailed(m_commandList->Close());
}

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

Требования

Требование Значение
Целевая платформа Windows
Header d3d12.h
Библиотека D3d12.lib
DLL D3d12.dll

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

ID3D12GraphicsCommandList