PFND3DDDI_RENDERCB función de devolución de llamada (d3dumddi.h)
La función pfnRenderCb envía el búfer de comandos actual para su representación en el controlador de miniporte de pantalla.
Sintaxis
PFND3DDDI_RENDERCB Pfnd3dddiRendercb;
HRESULT Pfnd3dddiRendercb(
HANDLE hDevice,
D3DDDICB_RENDER *unnamedParam2
)
{...}
Parámetros
hDevice
Identificador del dispositivo de visualización (contexto de gráficos).
unnamedParam2
pData [in, out]
Puntero a una estructura de D3DDDICB_RENDER que describe el búfer de comandos actual que se va a representar.
Valor devuelto
pfnRenderCb devuelve uno de los siguientes valores:
Código devuelto | Descripción |
---|---|
S_OK | El búfer de comandos se ha representado correctamente. |
D3DDDIERR_PRIVILEGEDINSTRUCTION | El controlador de minipuerto de pantalla detectó una instrucción con privilegios en el búfer de comandos; Las instrucciones con privilegios no pueden estar presentes en un búfer de comandos. |
D3DDDIERR_ILLEGALINSTRUCTION | El controlador de minipuerto de pantalla detectó instrucciones que el hardware gráfico no puede admitir. |
D3DDDIERR_INVALIDHANDLE | El controlador de minipuerto de pantalla detectó un identificador no válido en el búfer de comandos. |
D3DDDIERR_CANTRENDERLOCKEDALLOCATION | El administrador de memoria de vídeo detectó referencias a una asignación bloqueada en la lista de asignaciones. Tenga en cuenta que el administrador de memoria de vídeo devuelve este error solo si no se pudo cambiar la posición de la asignación a un segmento de memoria del sistema o AGP. |
D3DDDIERR_INVALIDUSERBUFFER | El controlador de minipuerto de pantalla detectó una saturación o saturación de datos o instrucciones. Es decir, el controlador recibió menos o más instrucciones o datos de los esperados. |
E_OUTOFMEMORY | pfnRenderCb no se pudo completar debido a una memoria insuficiente. |
E_INVALIDARG | Los parámetros se validaron y determinaron que son incorrectos. |
Esta función también podría devolver otros valores HRESULT.
Comentarios
Cuando el controlador de pantalla en modo de usuario debe enviar el búfer de comandos actual para su representación en el controlador de miniporte de pantalla de pantalla (por ejemplo, durante una llamada a la función Flush o Flush (D3D10) del controlador de pantalla en modo de usuario), el controlador de pantalla en modo de usuario debe llamar a la función pfnRenderCb . El controlador de pantalla en modo de usuario debe establecer el parámetro hDevice en el valor del tiempo de ejecución de Microsoft Direct3D proporcionado durante la llamada CreateDevice o CreateDevice(D3D10). En la estructura de D3DDDICB_RENDER a la que apunta el parámetro pData , el controlador de pantalla en modo de usuario también debe establecer:
- El miembro CommandLength al número de bytes de comandos del búfer de comandos que comienzan desde el desplazamiento cero.
- El miembro CommandOffset a distinto de cero si el controlador de pantalla en modo de usuario debe especificar un desplazamiento para el primer comando de hardware en el búfer de comandos.
- Miembro NumAllocations al número de elementos de la lista de asignación.
- Miembro NumPatchLocations al número de elementos de la lista de ubicación de revisión.
Si el controlador de pantalla en modo de usuario detecta que la mayoría de los vaciados del búfer de comandos se deben a que el controlador se queda sin espacio en el búfer de comandos, la lista de asignaciones o la lista de ubicaciones de revisión, el controlador puede solicitar que se cambie el tamaño. Para cambiar el tamaño del búfer de comandos, el controlador establece la marca de campo de bits ResizeCommandBuffer en el miembro Flags de D3DDDICB_RENDER y coloca el tamaño solicitado en el miembro NewCommandBufferSize de D3DDDICB_RENDER. Del mismo modo, para cambiar el tamaño de la lista de asignación, el controlador establece la marca de campo de bits ResizeAllocationList en el miembro Flags de D3DDDICB_RENDER y coloca el número solicitado de elementos en el miembro NewAllocationListSize de D3DDDICB_RENDER. Para cambiar el tamaño de la lista de ubicación de revisión, el controlador establece la marca de campo de bits ResizePatchLocationList en el miembro Flags de D3DDDICB_RENDER y coloca el número solicitado de elementos en el miembro NewPatchLocationListSize de D3DDDICB_RENDER.
Ejemplos
En el ejemplo de código siguiente se muestra cómo enviar el búfer de comandos actual para representarlo en el controlador de miniporte de pantalla. Este ejemplo de código genera la lista de asignación después de generar el búfer de comandos y la lista de revisiones. Esto no es óptimo para el rendimiento porque el búfer de comandos se analiza más de lo necesario. Sin embargo, esta implementación es más fácil de mostrar. En un controlador de producción, la generación del búfer de comandos al mismo tiempo que las listas de asignación y revisión son más eficaces.
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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Disponible en Windows Vista y versiones posteriores de los sistemas operativos Windows. |
Plataforma de destino | Escritorio |
Encabezado | d3dumddi.h (incluya D3dumddi.h) |