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


функция обратного вызова 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 и NewCommandBufferSizeD3DDDICB_RENDER. Аналогичным образом драйвер должен определить базовый адрес и количество элементов следующего списка выделения и списка расположений исправлений из значений, возвращаемых в элементах pNewAllocationList и NewAllocationListSize и pNewPatchLocationList и NewPatchLocationListSize соответственно.

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

Примечание Несмотря на то, что драйвер может запросить изменение размера буфера команд, а также списков выделения и расположения исправлений, диспетчер видеопамяти может не соответствовать требованиям. Таким образом, независимо от того, выполнен ли вызов pfnRenderCb , драйвер должен проверить значения, возвращаемые в элементах NewCommandBufferSize, NewAllocationListSize и NewPatchLocationListSize D3DDDICB_RENDER.
 
Если драйвер отображения пользовательского режима задает для элемента hContextструктуры D3DDDICB_RENDER , на которую указывает параметр pData , значение NULL, среда выполнения Microsoft Direct3D отправляет операцию отрисовки в контекст устройства по умолчанию. Если драйвер отображения пользовательского режима задает для hContext допустимый дескриптор, который ранее возвращалась функцией pfnCreateContextCb и представляет контекст устройства, среда выполнения 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 (включая D3dumddi.h)

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

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

Очистка

pfnCreateContextCb