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

La función DxgkDdiAcquireSwizzlingRange hace que una asignación sea accesible a través de la apertura de la unidad de procesamiento central (CPU) para el segmento determinado.

Sintaxis

DXGKDDI_ACQUIRESWIZZLINGRANGE DxgkddiAcquireswizzlingrange;

NTSTATUS DxgkddiAcquireswizzlingrange(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_ACQUIRESWIZZLINGRANGE pAcquireSwizzlingRange
)
{...}

Parámetros

[in] hAdapter

Identificador de un bloque de contexto asociado a un adaptador de pantalla. El controlador de miniporte 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] pAcquireSwizzlingRange

Puntero a una estructura de DXGKARG_ACQUIRESWIZZLINGRANGE que contiene información para hacer que una asignación sea accesible a través de la apertura de la CPU.

Valor devuelto

DxgkDdiAcquireSwizzlingRange devuelve uno de los siguientes valores:

Código devuelto Descripción
STATUS_SUCCESS DxgkDdiAcquireSwizzlingRange hizo que la asignación sea accesible correctamente.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED DxgkDdiAcquireSwizzlingRange no pudo programar el intervalo de giro para la asignación. El administrador de memoria de vídeo no puede adquirir el rango de desplazante sin realizar más intentos.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE DxgkDdiAcquireSwizzlingRange no pudo programar el intervalo de giro para la asignación porque otro rango de giro está usando actualmente los recursos de la unidad de procesamiento gráfico (GPU) necesarios. El administrador de memoria de vídeo intenta liberar un intervalo que está actualmente en uso e intenta volver a configurar el intervalo de desenlace.

Comentarios

Se llama a la función DxgkDdiAcquireSwizzlingRange después de que el controlador de pantalla en modo de usuario solicite una dirección virtual que haga referencia a los bits de una asignación (es decir, después de que el controlador de pantalla en modo de usuario llame a la función pfnLockCb con la marca de campo de bits AcquireAperture establecida en el miembro Flags de la estructura D3DDDICB_LOCK y mientras la asignación se encuentra actualmente en un segmento de memoria accesible para CPU). Si la marca de campo de bits AcquireAperture no está establecida en la llamada a pfnLockCb, no se llama a DxgkDdiAcquireSwizzlingRange y la asignación debe tener un formato que pueda procesar el controlador de pantalla en modo de usuario o una aplicación.

Cuando se llama a DxgkDdiAcquireSwizzlingRange , el controlador de minipuerto de pantalla debe realizar la asignación especificada (es decir, el miembro hAllocation de la estructura DXGKARG_ACQUIRESWIZZLINGRANGE a la que apunta el parámetro pAcquireSwizzlingRange ) a través de la apertura de CPU para el segmento especificado (es decir, el miembro SegmentId de DXGKARG_ACQUIRESWIZZLINGRANGE). La asignación debe aparecer exactamente como aparece en la memoria del equipo después de una expulsión desenlace.

No todas las solicitudes del controlador de pantalla en modo de usuario son accesibles para el controlador de miniporte de pantalla. Los intervalos de oscilación adquiridos por el administrador de memoria de vídeo se almacenan en caché en función de la asignación a la que están asociados y a los datos privados especificados. En la primera solicitud del controlador de pantalla en modo de usuario para acceder a una asignación, se llama a la función DxgkDdiAcquireSwizzlingRange del controlador de miniporte para que la asignación sea accesible. En las solicitudes posteriores con datos privados coincidentes, la asignación de configuración anterior se usa para acceder a la asignación.

El administrador de memoria de vídeo llama a la función DxgkDdiReleaseSwizzlingRange del controlador de miniporte para liberar un rango de asignación cuando se expulsa o destruye una asignación, o cuando otra asignación requiere una apertura. Una asignación se puede asociar con cualquier número de intervalos de giro (por ejemplo, una apertura por nivel MIP).

El número de intervalos giratorios que admite un adaptador lo expone el controlador en el miembro NumberOfSwizzlingRanges de la estructura DXGK_DRIVERCAPS cuando se llama a la función DxgkDdiQueryAdapterInfo del controlador. Todos los intervalos son iguales (es decir, cualquier intervalo puede desenlazar o hasta que cualquier tipo de mosaico o desenlazamiento). El administrador de memoria de vídeo arbitra los intervalos de desenlace disponibles entre todas las aplicaciones que las requieren.

El controlador debe usar la E/S asignada por memoria (MMIO) para configurar un intervalo de desenlace. Estos accesos de intervalo de giro no deben interferir con la ejecución de la GPU (es decir, la GPU no debe estar inactiva cuando se llama a DxgkDdiAcquireSwizzlingRange ).

Todas las llamadas a DxgkDdiAcquireSwizzlingRange se serializan entre sí, pero no con ninguna otra función DDI.

Si la GPU admite intervalos de desplazamiento que redirigen el acceso de CPU a segmentos de memoria no accesibles para CPU o memoria del sistema, el controlador de pantalla en modo usuario puede establecer la combinación de marcas de campo de bits AcquireAperture y UseAlternateVA en el miembro Flags de la estructura D3DDDICB_LOCK en una llamada a la función pfnLockCb para bloquear la asignación. En esta situación, el administrador de memoria de vídeo llama a la función DxgkDdiAcquireSwizzlingRange del controlador de minipuerto de pantalla para adquirir un rango de giro para la asignación aunque la asignación se encuentre en un segmento de memoria no accesible para cpu o un segmento de apertura. Los intervalos de giro están asociados a algunos recursos de GPU (por ejemplo, intervalos de apertura PCI) que administra el controlador y no son accesibles para el administrador de memoria de vídeo ni se tienen en cuenta.

Es posible que se produzca un error en una llamada a DxgkDdiAcquireSwizzlingRange para adquirir un intervalo de swizzling porque se ha agotado un recurso administrado por el controlador. Aunque el rango de desplazante es gratuito, es posible que no se pueda usar debido al recurso que falta. El controlador puede indicar que un intervalo de desenlazado no está disponible para el administrador de memoria de vídeo devolviendo STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE de DxgkDdiAcquireSwizzlingRange. A continuación, el administrador de memoria de vídeo intenta liberar un rango de swizzling que está actualmente en uso y, a continuación, llama a la función DxgkDdiAcquireSwizzlingRange del controlador para configurar el nuevo intervalo de swizzling. Si se liberan todos los rangos de desenlazado y el controlador sigue produciendo un error con STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE, el administrador de memoria de vídeo no puede adquirir un intervalo de desenlazado para la asignación.

DxgkDdiAcquireSwizzlingRange debe ser paginable.

Requisitos

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

Consulte también

D3DDDICB_LOCK

DXGKARG_ACQUIRESWIZZLINGRANGE

DXGK_DRIVERCAPS

DxgkDdiAddDevice

DxgkDdiCreateAllocation

DxgkDdiQueryAdapterInfo

DxgkDdiReleaseSwizzlingRange

pfnLockCb