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


функция обратного вызова PFND3DDDI_RENDERCB (d3dumddi.h)

Функция pfnRenderCb отправляет текущий буфер команд для отрисовки в драйвер мини-порта отображения.

Синтаксис

PFND3DDDI_RENDERCB Pfnd3dddiRendercb;

HRESULT Pfnd3dddiRendercb(
  HANDLE hDevice,
  D3DDDICB_RENDER *unnamedParam2
)
{...}

Параметры

hDevice

Дескриптор устройства отображения (графический контекст).

unnamedParam2

pData [in, out]

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

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

pfnRenderCb возвращает одно из следующих значений:

Возвращаемый код Описание
S_OK Буфер команд успешно отрисован.
D3DDDIERR_PRIVILEGEDINSTRUCTION Драйвер минипорта отображения обнаружил привилегированную инструкцию в буфере команд; Привилегированные инструкции не могут присутствовать в буфере команд.
D3DDDIERR_ILLEGALINSTRUCTION Драйвер минипорта отображения обнаружил инструкции, которые не поддерживают графическое оборудование.
D3DDDIERR_INVALIDHANDLE Драйвер мини-порта отображения обнаружил недопустимый дескриптор в буфере команд.
D3DDDIERR_CANTRENDERLOCKEDALLOCATION Диспетчер памяти видео обнаружил ссылки на заблокированное выделение в списке выделения. Обратите внимание, что диспетчер памяти видео возвращает эту ошибку только в том случае, если он не может переместить выделение в сегмент AGP или системной памяти.
D3DDDIERR_INVALIDUSERBUFFER Драйвер мини-порта отображения обнаружил недостаточное выполнение или перезапуск данных или инструкций. То есть драйвер получил меньше или больше инструкций или данных, чем ожидалось.
E_OUTOFMEMORY pfnRenderCb не удалось завершить из-за нехватки памяти.
E_INVALIDARG Параметры были проверены и определены как неверные.

Эта функция также может возвращать другие значения HRESULT.

Замечания

Если драйвер отображения в пользовательском режиме должен отправить текущий буфер команд для отрисовки в драйвер минипорта отображения (например, во время вызова функции драйвера отображения в пользовательском режиме Flush или Flush(D3D10), драйвер отображения в пользовательском режиме должен вызвать функцию pfnRenderCb. Драйвер отображения в пользовательском режиме должен задать параметр hDevice значением среды выполнения Microsoft Direct3D, предоставленной во время вызова CreateDevice или CreateDevice(D3D10). В структуре D3DDDICB_RENDER, на которую указывает параметр pData , драйвер отображения в пользовательском режиме должен также задать:

  • Элемент CommandLength число байт команд в буфере команд, начинающихся с нуля смещения.
  • Элемент commandOffset в ненулевое значение, если драйвер отображения в пользовательском режиме должен указать смещение первой аппаратной команды в буфере команд.
  • Элемент NumAllocations число элементов в списке выделения.
  • Элемент NumPatchLocations количество элементов в списке расположений исправлений.
После вызова pfnRenderCbдрайвер отображения в пользовательском режиме должен определить базовый адрес и размер буфера команд, который он должен использовать для следующей отправки из значений, возвращаемых в pNewCommandBuffer и NewCommandBufferSize членов D3DDDICB_RENDER. Аналогичным образом драйвер должен определить базовый адрес и количество элементов следующего списка выделения и списка расположений исправлений из значений, возвращаемых в pNewAllocationList и членов NewAllocationListSize и pNewPatchLocationList и NewPatchLocationListSize соответственно.

Если драйвер отображения в пользовательском режиме обнаруживает, что большая часть сбросов буфера команд происходит из-за того, что драйвер выходит из пространства в буфере команд, списке выделения или списке исправлений, драйвер может запросить их изменения. Чтобы изменить размер буфера команд, драйвер задает флаг ResizeCommandBuffer битовое поле в элементе Flags члена D3DDDICB_RENDER и помещает запрошенный размер в NewCommandBufferSize член D3DDDICB_RENDER. Аналогичным образом, чтобы изменить размер списка выделения, драйвер задает флаг ResizeAllocationList битовое поле в элементе флагов D3DDDICB_RENDER и помещает запрошенное количество элементов в элемент NewAllocationListSize члена D3DDDICB_RENDER. Чтобы изменить размер списка исправлений, драйвер задает флаг ResizePatchLocationList битового поля в элементе флагов D3DDDICB_RENDER и помещает запрошенное количество элементов в NewPatchLocationListSize члена D3DDDICB_RENDER.

Примечание Даже если драйвер может запросить, чтобы буфер команд и списки выделения и расположения исправлений были изменены, диспетчер памяти видео может не соответствовать требованиям. Таким образом, независимо от того, является ли вызов pfnRenderCb, драйвер должен проверить значения, возвращаемые в NewCommandBufferSize, NewAllocationListSizeи NewPatchLocationListSize членов D3DDDICB_RENDER.
 
Если драйвер отображения в пользовательском режиме задает hContext член структуры D3DDDICB_RENDER, на которую указывает параметр pData, NULL, среда выполнения Microsoft Direct3D отправляет операцию отрисовки в контекст устройства по умолчанию. Если драйвер отображения в пользовательском режиме задает hContext допустимым дескриптором, который ранее возвращалась функция pfnCreateContextC b и представляет контекст устройства, среда выполнения Direct3D отправляет операцию отрисовки в этот контекст. Direct3D версии 11 Примечание. Дополнительные сведения о том, как драйвер вызывает pfnRenderCb, см. изменения с Direct3D 10.

Примеры

В следующем примере кода показано, как отправить текущий буфер команд для отрисовки в драйвер мини-порта отображения. В этом примере кода создается список выделения после создания буфера команд и списка исправлений. Это не оптимально для производительности, так как буфер команд анализируется более чем необходимо. Однако эту реализацию проще показать. В рабочем драйвере создание буфера команд в то же время, что и списки выделений и исправлений, эффективнее.

VOID CD3DContext::SubmitDXVABuffer(DWORD Size) {
    D3DDDICB_RENDER     renderCBData = {0};
    DWORD               dwAllocationListUsed;
    HRESULT             hr;

    if (GenerateAllocationListFromCmdBuf(R200UpdateQSParamsForDXVASubmit(m_pR200Ctx, Size), m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBufAllocList, m_dwHwCmdBufAllocListSize, &dwAllocationListUsed) == FALSE)
    {
        DBG_BREAK;
        return;
    }

    // 3-D and video packets must be in sync. If the last packet that was sent went to 
    // the 3-D engine, that packet must finish before the new packet runs on the hardware.

    renderCBData.CommandOffset  = 0;
    renderCBData.CommandLength  = Size + sizeof(UMD_CMDBUF_INFO);
    renderCBData.NumAllocations = dwAllocationListUsed;
    renderCBData.hContext = m_sContexts[MULTI_ENGINE_NODE_VIDEO].hContext;

    // Copy command-buffer data from the internal buffer to the buffer that was created by dxgkrnl
    memcpy(m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBuf, m_pHwCmdBuf + GetCmdBufPreambleSize(m_pR200Ctx), renderCBData.CommandLength);
 
    m_d3dCallbacks.pfnRenderCb(m_hD3D, &renderCBData);

        // Makes video the last engine that work was submitted to
        m_LastEngineSubmit = MULTI_ENGINE_NODE_VIDEO;
    }

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно в Windows Vista и более поздних версиях операционных систем Windows.
целевая платформа Настольный
заголовка d3dumddi.h (include D3dumddi.h)

См. также

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

Flush

pfnCreateContextCb