функция обратного вызова 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 для количества элементов в списке расположений исправлений.
Если драйвер отображения пользовательского режима обнаруживает, что большая часть сбросов буфера команд происходит из-за того, что у драйвера заканчивается свободное место в буфере команд, списке выделения или списке расположений исправлений, драйвер может запросить изменение их размера. Чтобы изменить размер буфера команд, драйвер устанавливает флаг битового поля ResizeCommandBuffer в элементе FlagsD3DDDICB_RENDER и помещает запрошенный размер в элемент NewCommandBufferSize D3DDDICB_RENDER. Аналогичным образом, чтобы изменить размер списка выделения, драйвер устанавливает флаг битового поля ResizeAllocationList в элементе Flags D3DDDICB_RENDER и помещает требуемое количество элементов в элемент NewAllocationListSize D3DDDICB_RENDER. Чтобы изменить размер списка расположений исправлений, драйвер устанавливает флаг битового поля ResizePatchLocationList в элементе Flags D3DDDICB_RENDER и помещает запрошенное количество элементов в элемент NewPatchLocationListSize D3DDDICB_RENDER.
Примеры
В следующем примере кода показано, как отправить текущий буфер команд для отрисовки в драйвер мини-порта дисплея. В этом примере кода создается список выделения после создания буфера команд и списка исправлений. Это не является оптимальным для производительности, так как буфер команд анализируется больше, чем необходимо. Однако эту реализацию проще показать. В рабочем драйвере создание буфера команд одновременно со списками выделений и исправлений является более эффективным.
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) |