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.
Después de una llamada a pfnRenderCb, el controlador de pantalla en modo de usuario debe determinar la dirección base y el tamaño del búfer de comandos que debe usar para su siguiente envío a partir de los valores que se devuelven en los miembros pNewCommandBuffer y NewCommandBufferSize de D3DDDICB_RENDER. Del mismo modo, el controlador debe determinar la dirección base y el número de elementos de la lista de asignación siguiente y la lista de ubicación de revisión de los valores que se devuelven en los miembros pNewAllocationList y NewAllocationListSize y los miembros pNewPatchLocationListSize respectivamente.

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.

Nota Aunque el controlador puede solicitar que se cambie el tamaño del búfer de comandos y las listas de asignación y ubicación de revisión, es posible que el administrador de memoria de vídeo no pueda cumplir. Por lo tanto, independientemente de si la llamada a pfnRenderCb se realiza correctamente, el controlador debe comprobar los valores devueltos en los miembros NewCommandBufferSize, NewAllocationListSize y NewPatchLocationListSize de D3DDDICB_RENDER.
 
Si el controlador de visualización en modo de usuario establece el miembro hContext de la estructura D3DDDICB_RENDER a la que apunta el parámetro pData en NULL, el tiempo de ejecución de Microsoft Direct3D envía la operación de representación al contexto predeterminado del dispositivo. Si el controlador de visualización en modo de usuario establece hContext en un identificador válido que la función pfnCreateContextCb devolvió anteriormente y que representa un contexto de dispositivo, el tiempo de ejecución de Direct3D envía la operación de representación a ese contexto. Nota de Direct3D versión 11: Para obtener más información sobre cómo el controlador llama a pfnRenderCb, consulta Cambios de Direct3D 10.

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)

Consulte también

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

Vaciar

pfnCreateContextCb