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 miniport para mostrar.
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 miniporte 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 asignación. Tenga en cuenta que el administrador de memoria de vídeo devuelve este error solo si no pudo cambiar la posición de la asignación a un segmento de memoria del sistema o AGP. |
D3DDDIERR_INVALIDUSERBUFFER | El controlador de miniporte de pantalla detectó una saturación o una 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 puede devolver otros valores HRESULT.
Observaciones
Cuando el controlador de pantalla en modo de usuario debe enviar el búfer de comandos actual para la representación en el controlador de miniporte de pantalla de pantalla (por ejemplo, durante una llamada al controlador de pantalla en modo de usuario función Flush o Flush(D3D10), el controlador de pantalla en modo de usuario debe llamar a la función pfnRenderCb. El controlador de visualización en modo de usuario debe establecer el parámetro hDevice en el valor proporcionado por el tiempo de ejecución de Microsoft Direct3D durante la llamada CreateDevice o CreateDevice(D3D10). En la estructura 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 cero de desplazamiento.
- El commandOffset miembro 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.
- El NumAllocations miembro al número de elementos de la lista de asignación.
- El NumPatchLocations miembro al número de elementos de la lista de localización de revisiones.
Si el controlador de visualización 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 asignación o la lista de ubicación de revisión, el controlador puede solicitar que se cambien de tamaño. Para cambiar el tamaño del búfer de comandos, el controlador establece el ResizeCommandBuffer marca de campo de bits 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 el ResizeAllocationList marca de campo de bits en el miembro Marcas 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 revisiones, el controlador establece el ResizePatchLocationList marca de campo de bits 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 su representación en el controlador de miniporte para mostrar. 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, generar el búfer de comandos al mismo tiempo que las listas de asignación y revisión es más eficaz.
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 | Valor |
---|---|
cliente mínimo admitido | Disponible en Windows Vista y versiones posteriores de los sistemas operativos Windows. |
de la plataforma de destino de | Escritorio |
encabezado de | d3dumddi.h (incluya D3dumddi.h) |