функция обратного вызова 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 битовое поле в элементе Flags члена D3DDDICB_RENDER и помещает запрошенный размер в NewCommandBufferSize член D3DDDICB_RENDER. Аналогичным образом, чтобы изменить размер списка выделения, драйвер задает флаг ResizeAllocationList битовое поле в элементе флагов D3DDDICB_RENDER и помещает запрошенное количество элементов в элемент NewAllocationListSize члена D3DDDICB_RENDER. Чтобы изменить размер списка исправлений, драйвер задает флаг ResizePatchLocationList битового поля в элементе флагов 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 (include D3dumddi.h) |