DXGKDDI_QUERYCURRENTFENCE función de devolución de llamada (d3dkmddi.h)

La función DxgkDdiQueryCurrentFence consulta el identificador de barrera de envío completado más reciente en la unidad de ejecución de comandos de hardware.

Sintaxis

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

NTSTATUS DxgkddiQuerycurrentfence(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}

Parámetros

[in] hAdapter

Identificador de un bloque de contexto asociado a un adaptador de pantalla. El controlador de minipuerto de pantalla proporcionó anteriormente este identificador al subsistema del kernel de gráficos de Microsoft DirectX en el parámetro de salida MiniportDeviceContext de la función DxgkDdiAddDevice .

[in/out] pCurrentFence

Puntero a una estructura DXGKARG_QUERYCURRENTFENCE que contiene información sobre los datos de barrera actuales.

Valor devuelto

DxgkDdiQueryCurrentFence devuelve STATUS_SUCCESS o un resultado de error adecuado si los datos de barrera no se recuperan correctamente.

Comentarios

Una barrera es una instrucción que contiene 64 bits de datos y una dirección. El controlador de minipuerto de pantalla puede insertar una barrera en la secuencia de acceso directo a memoria (DMA) que se envía a la unidad de procesamiento gráfico (GPU). Cuando la GPU lee la barrera, la GPU escribe los datos de barrera en la dirección de barrera especificada. Sin embargo, antes de que la GPU pueda escribir los datos de barrera en la memoria, debe asegurarse de que todos los píxeles de los primitivos que preceden a la instrucción de barrera se retiran y se escriben correctamente en la memoria.

Nota No es necesario que la GPU detenga toda la canalización mientras espera el último píxel de los primitivos que preceden a la instrucción de barrera para retirarse; en su lugar, la GPU puede ejecutar los primitivos que siguen la instrucción de barrera.
 
El hardware que admite el espacio de direcciones virtuales por contexto de GPU debe admitir los siguientes tipos de barreras:
  • Las vallas normales son barreras que se pueden insertar en un búfer DMA que se crea en modo de usuario. Dado que el contenido de un búfer DMA del modo de usuario no es de confianza, las barreras dentro de dicho búfer de DMA deben hacer referencia a una dirección virtual en el espacio de direcciones de contexto de GPU y no a una dirección física. El acceso a dicha dirección virtual está enlazado por el mismo mecanismo de validación de memoria que cualquier otra dirección virtual a la que accede la GPU.
  • Las barreras con privilegios son barreras que solo se pueden insertar en un búfer DMA que se crea (y solo es accesible) en modo kernel. Las barreras dentro de un búfer de DMA hacen referencia a una dirección física en la memoria.

    Tenga en cuenta que si la dirección de destino de barrera era accesible en modo de usuario, el software malintencionado podría realizar una operación de gráficos sobre la ubicación de memoria de la barrera y, por tanto, invalidar el contenido de lo que esperaba recibir el kernel.

Tenga en cuenta que un búfer DMA con privilegios puede contener barreras normales y con privilegios. Sin embargo, si un búfer DMA con privilegios contiene una barrera normal, el componente de kernel que generó un búfer de DMA de este tipo es consciente de que la barrera normal dentro de nunca podría ser accesible.

Si el controlador de minipuerto de pantalla perdió la última valla de un búfer DMA, es posible que se llame a la función DxgkDdiQueryCurrentFence del controlador para informar de la barrera perdida. Por ejemplo, si el hardware genera una barrera a la memoria, la función DxgkDdiInterruptRoutine del controlador se desencadena para leer la memoria. Sin embargo, si los datos de la barrera no están disponibles cuando el controlador intenta leer los datos (por ejemplo, si hay un conjunto de chips defectuoso), la barrera normalmente se notifica en la siguiente interrupción, a menos que se detengan las interrupciones. Si se han detenido las interrupciones y el subsistema del kernel de gráficos de DirectX espera demasiado tiempo para una barrera, el subsistema llama a la función DxgkDdiQueryCurrentFence del controlador para comprobar la barrera actual y determinar cualquier barrera pendiente que pueda haber perdido.

Antes de que el controlador de minipuerto de pantalla vuelva de una llamada a DxgkDdiQueryCurrentFence, si aún no se ha notificado el identificador de barrera de envío completado por hardware más reciente, el controlador debe llamar a la función DxgkCbNotifyInterrupt para notificar la barrera. Para implementar esta funcionalidad, el controlador:

  1. Realiza un seguimiento de la barrera que se informó por última vez al sistema operativo.
  2. Genera irQL a la interrupción del dispositivo. Para elevar IRQL al nivel de interrupción, el controlador puede llamar a la función DxgkCbSynchronizeExecution para sincronizar con su función DxgkDdiInterruptRoutine .
  3. En irQL de interrupción del dispositivo, compara la última barrera notificada con la última barrera completada por hardware.
  4. En irQL de interrupción del dispositivo, llama a DxgkCbNotifyInterrupt solo cuando la última barrera de hardware completada es más reciente que la última barrera notificada.
DxgkDdiQueryCurrentFence debe ser paginable.

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista
Plataforma de destino Escritorio
Encabezado d3dkmddi.h (incluya D3dkmddi.h)
IRQL PASSIVE_LEVEL

Consulte también

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine