Función D3DKMTPresent (d3dkmthk.h)

La función D3DKMTPresent envía un comando presente al subsistema del kernel de gráficos de Microsoft DirectX (Dxgkrnl.sys).

Sintaxis

NTSTATUS D3DKMTPresent(
  [in] D3DKMT_PRESENT *unnamedParam1
);

Parámetros

[in] unnamedParam1

pData: puntero a una estructura D3DKMT_PRESENT que describe los parámetros para presentar.

Valor devuelto

D3DKMTPresent devuelve un valor NTSTATUS, como uno de los siguientes valores:

Código devuelto Descripción
STATUS_SUCCESS El presente se realizó correctamente.
STATUS_DEVICE_REMOVED El adaptador de gráficos se detuvo o se restableció el contexto de presentación.
STATUS_INVALID_PARAMETER Los parámetros se validaron y determinaron que son incorrectos.
STATUS_NO_MEMORY D3DKMTPresent no se pudo completar debido a una memoria insuficiente.
STATUS_GRAPHICS_ALLOCATION_INVALID El identificador de superficie principal se invalidó debido a un cambio en el modo de presentación. Si el controlador de cliente instalable (ICD) de OpenGL recibe este código de error, debe volver a abrir o volver a crear el identificador principal, reemplace todas las referencias del búfer de comandos al identificador anterior por el nuevo identificador y, a continuación, vuelva a enviar el búfer.
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE Error en el contexto del dispositivo de representación que especifica el miembro hContext de D3DKMT_PRESENT .

Nota

El código de error STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE no indica el inicio de un proceso de detección y recuperación de tiempo de espera (TDR) o que la GPU dejó de responder. Por ejemplo, el subsistema del kernel de gráficos de DirectX coloca un dispositivo en un estado de error si el controlador de miniporte de pantalla indica que un búfer DMA enviado desde este dispositivo produjo un error o si el administrador de memoria de vídeo no pudo paginar todas las asignaciones necesarias para un búfer DMA incluso después de dividir el búfer DMA. Una vez que un dispositivo está en un estado de error, no puede realizar más operaciones y debe destruirse y volver a crearse. El ICD puede llamar a la función D3DKMTGetDeviceState para determinar un motivo más preciso del error.

Comentarios

La función D3DKMTPresent puede devolver STATUS_INVALID_PARAMETER, dependiendo de la combinación de valores de parámetro (es decir, los valores de los miembros de la estructura D3DKMT_PRESENT a la que apunta pData ). En la lista siguiente se describen las combinaciones más comunes de valores de parámetro que podrían provocar que D3DKMTPresent devuelva STATUS_INVALID PARAMETER:

  • El miembro hDestination no es NULL y se cumple al menos una de las condiciones siguientes:

    • El miembro pSrcSubRects es NULL.
    • El miembro SubRectCnt es 0.
    • No se establece la marca de campo de bits Blt del miembro Flags .
    • No se ha establecido la marca de campo de bits SrcRectValid de Flags .
    • Se establece la marca de campo de bits ColorFill de Flags .
    • Se establece la marca de campo de bits FlipDoNotFlip, FlipDoNotWait o FlipRestart de Flags .
    • Se establece la marca de campo de bits SrcColorKey o DstColorKey de Flags .
    • El miembro hSource es igual a hDestination.
    • El origen y el destino no son una superficie principal.
  • Se establece la marca de campo de bits Flip de Flags y se cumple al menos una de las condiciones siguientes:

    • Se establece la marca de campo de bits ColorFill de Flags .
    • Se establece la marca de campo de bits Blt de Flags .
    • Se establece la marca de campo de bits SrcColorKey o DstColorKey de Flags .
    • Se establece la marca de campo de bits SrcRectValid o DstRectValid de Flags .
    • Se establece la marca girar campo de bits de Flags .
    • Se establece la marca de campo de bits RestrictVidPnSource de Flags .
    • El origen no es una superficie principal.
    • El controlador de minipuerto de pantalla no admite el intervalo de volteo que especifica el miembro FlipInterval .
    • No se llamó previamente a la función D3DKMTSetDisplayMode .
  • Se establece la marca de campo de bits ColorFill de Flags y se cumple una de las condiciones siguientes:

    • pSrcSubRects es NULL.
    • SubRectCnt es 0.
    • Se establece la marca de campo de bits Blt de Flags .
    • Se establece la marca de campo de bits FlipDoNotFlip, FlipDoNotWait o FlipRestart de Flags .
    • Se establece la marca de campo de bits SrcColorKey o DstColorKey de Flags .
    • Se establece la marca de campo de bits SrcRectValid de Flags .
  • La marca de campo de bits Blt de Flags se establece y se cumple una de las condiciones siguientes:

    • pSrcSubRects es NULL.
    • SubRectCnt es 0.
    • Se establece la marca de campo de bits ColorFill de Flags .
    • Se establece la marca de campo de bits FlipDoNotFlip, FlipDoNotWait o FlipRestart de Flags .

Los controladores gráficos en modo de usuario que llaman a D3DKMTPresent para el estilo blit presentes, con la marca de campo de bits Blt de Flags establecida, deben tener especial cuidado para asegurarse de que todo el trabajo enviado previamente a los contextos que se presentan es totalmente purgable. Si no lo hace, se puede producir el interbloqueo de la aplicación o, en algunos casos, el interbloqueo del escritorio del usuario actual. Un contexto es totalmente purgable si solo contiene esperas en el objeto de sincronización de GPU donde la señal correspondiente ya se ha puesto en cola en la base de datos del programador de GPU y donde esa señal no está detrás de otra espera indestable. En otras palabras, si el espacio de usuario de todos los procesos del sistema se pausa inmediatamente después de la llamada a D3DKMTPresent, la espera se satisfacería una vez que la cadena de representación dependiente ya en cola al programador de GPU finalizaría la representación. Un controlador nunca debe llamar a blit presente en un contexto que dependa de una espera de GPU que no esté satisfecho actualmente y que se espera que alguna operación posterior se origine en este u otro proceso.

Ejemplos

En el ejemplo de código siguiente se muestra cómo un ICD de OpenGL puede usar D3DKMTPresent para presentar datos.

HRESULT Present(D3DKMT_HANDLE hDevice, 
                HWND hWnd, 
                RECT* pSrcRect,
                 RECT* pDstRect)
{
    D3DKMT_PRESENT PresentData = {0};

    PresentData.hDevice = hDevice;
    PresentData.Flags.Blt = 
    PresentData.Flags.DstRectValid = 
    PresentData.Flags.SrcRectValid = TRUE;
    PresentData.hWindow = hWnd;
    PresentData.DstRect = *pDstRect;
    PresentData.SrcRect = *pSrcRect;
    PresentData.SubRectCnt = 1;  
    PresentData.pSrcSubRects = pSrcRect; 

    if (NT_SUCCESS((*pfnKTPresent)(&PresentData))) {
        return S_OK;
    }
    return E_FAIL;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista
Plataforma de destino Universal
Encabezado d3dkmthk.h (incluya D3dkmthk.h)
Library Gdi32.lib
Archivo DLL Gdi32.dll

Consulte también

D3DKMTGetDeviceState

D3DKMTSetDisplayMode

D3DKMT_PRESENT