Compartir a través de


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.
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 de los valores que se devuelven en el pNewCommandBuffer y NuevosCommandBufferSize miembros de D3DDDICB_RENDER. Del mismo modo, el controlador debe determinar la dirección base y el número de elementos de la siguiente lista de asignación y lista de ubicación de revisión de los valores que se devuelven en el pNewAllocationList y miembros NewAllocationListSize y pNewPatchLocationList y miembros NewPatchLocationListSize respectivamente.

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.

Nota Aunque el controlador pueda 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 es correcta, el controlador debe comprobar los valores que se devuelven en los NewCommandBufferSize, NewAllocationListSizey NewPatchLocationListSize miembros de D3DDDICB_RENDER.
 
Si el controlador de visualización en modo de usuario establece el hContext miembro de la estructura de D3DDDICB_RENDER a la que apunta el parámetro pData para 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 el 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. Direct3D Versión 11 Nota: Para obtener más información sobre cómo llama el controlador pfnRenderCb, vea Cambios de Direct3D 10.

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)

Consulte también

createDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

flush

pfnCreateContextCb