Compatibilidad con clientes de Gráficos Low-Level

[Estas funciones están sujetas a cambios con cada revisión del sistema operativo. En su lugar, use Microsoft DirectDraw y Microsoft Direct3DAPIs; estas API aíslan las aplicaciones de estos cambios en el sistema operativo y ocultan muchas otras dificultades implicadas en la interacción directa con los controladores de pantalla. Para obtener más información, vea Introduction to Display.]

DirectDraw y Direct3D usan algunas rutinas de modo kernel para comunicarse con el sistema operativo y el controlador de pantalla.

El kernel del sistema operativo parece ser un controlador de pantalla DirectDraw/Direct3D desde el punto de vista de los componentes del modo de usuario. Sin embargo, existen algunas diferencias entre los controladores kernel y display. Los componentes del modo kernel mantienen una copia de estructuras que representan objetos DirectDraw/Direct3D, como dispositivos y superficies. El componente de modo de usuario de DirectDraw/Direct3D solicita la creación de esas estructuras, a las que se hace referencia con identificadores devueltos por el modo kernel. Por lo tanto, las diferencias se encuentran principalmente en los argumentos pasados a las rutinas: el kernel acepta identificadores, mientras que los controladores suelen aceptar punteros.

Evolución de los puntos de entrada del modo kernel

DirectDraw realiza todas sus conexiones al modo kernel a través del Gdi32.dll mediante varios puntos de entrada. Estos puntos de entrada normalmente solo calculan las referencias de los parámetros. Como parte de la creación del dispositivo, el Gdi32.dll devuelve punteros a rutinas dentro de sí que, a continuación, se usan en DirectDraw y Direct3D 7.0.

Direct3D 8. x realiza una interrupción limpia de Gdi32.dll y llama directamente a los puntos de entrada en modo kernel.

Llamar al kernel

Estos puntos de entrada son similares y, en muchos casos, idénticos a los puntos de entrada del propio controlador de pantalla, por lo que un conocimiento de los materiales del Kit de desarrollo de controladores (DDK) para DirectDraw y Direct3D es un requisito previo esencial para usar estas funciones.

Llamar a estas funciones difiere entre los sistemas operativos. En Windows 2000, W2KUMODE. La biblioteca LIB contiene rutinas que permiten que el subproceso que realiza la llamada realice la transición al modo kernel. Estas rutinas no realizan la serialización de parámetros y son el mecanismo de llamada ideal en Windows 2000. El mecanismo que realiza la transición al modo kernel se basa en la ordenación de una tabla. Esta ordenación cambiará en las revisiones del sistema operativo. Por lo tanto, no es aconsejable compilar una aplicación que se base en W2KUMODE. LIB para Windows 2000 y espera que se ejecute sin modificar en Windows XP. En la sección siguiente se describe un mecanismo para crear la portabilidad del sistema operativo.

En Windows XP, D3D8THK.DLL exporta todas las funciones del modo kernel, pero con un nombre ligeramente decorado. En el ejemplo siguiente se muestra cómo las aplicaciones pueden usar el alias de las funciones de cliente de bajo nivel mediante el preprocesador. Antes de hacerlo, vincule dinámicamente a D3D8THK.DLL.


#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h"      // Brings in the definition of "NtGdiDdUnlock", 
.                       //   which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);

Escritura de aplicaciones portátiles

Hay varias técnicas disponibles para que una aplicación sea portátil en todos los sistemas operativos. El más sólido es instalar el paquete redistribuible microsoft DirectX 8.x en Windows 2000 como parte del proceso de instalación de su propia aplicación. Esto garantiza que D3D8THK.DLL estará disponible en sistemas Windows 2000 y permite una única ruta de acceso de código en la aplicación, ya que puede usar la misma técnica que se describe anteriormente para Windows XP.

Las aplicaciones también pueden compilar su propio archivo DLL aislado e implementar dos versiones de ese archivo DLL, una para Windows 2000 con la técnica mostrada anteriormente y otra para Windows XP que usa D3D8THK.DLL.

Creación de dispositivos

DirectDraw y Direct3D deben crear primero una instancia de la abstracción del kernel del objeto de controlador. En Gdi32.dll y Ddraw.dll, esto se logra llamando a DdCreateDirectDrawObject, DdQueryDirectDrawObject y DdReenableDirectDrawObject. En Direct3D 8. x, esto se logra llamando a NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject y NtGdiDdReenableDirectDrawObject. Tenga en cuenta que los puntos de entrada GdiEntry* son simplemente serializadores para los puntos de entrada en modo kernel.

Después de llamar a estas funciones, se devuelve un identificador que representa la abstracción del objeto kernel de un dispositivo DirectDraw. Este objeto kernel representa una instancia de controlador propiedad del controlador de visualización. Este identificador se puede usar en llamadas posteriores, como DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject en Direct3D 8. x) para crear objetos adicionales.

Objetos kernel

Algunos puntos de entrada se usan para administrar las representaciones del modo kernel de determinados objetos. DdCreateSurfaceObject (o NtGdiDdCreateSurfaceObject en Direct3D 8. x) es un buen ejemplo. Este punto de entrada crea un objeto de modo kernel que representa un fragmento de memoria del sistema. El punto de entrada devuelve un identificador y este identificador se puede usar en llamadas de dibujo posteriores. El kernel deriva un puntero a su propia estructura de estos identificadores y pasa ese puntero al controlador de pantalla, que luego lleva a cabo la operación.

Functions

En esta tabla se enumeran las funciones que representan los puntos de entrada del modo kernel y las rutinas auxiliares del modo de usuario en Gdi32.dll que encapsulan estos puntos de entrada.

Tema Contenido
DdAttachSurface La función DdAttachSurface asocia dos representaciones de superficie en modo kernel.
DdCreateDIBSection Crea una estructura DIBSECTION que comparte su tabla de colores con el dispositivo.
GdiEntry9 se #defined como alias para esta función.
DdCreateDirectDrawObject Contenedor para la función NtGdiDdCreateDirectDrawObject y crea una representación del lado kernel del objeto DirectDraw. Un identificador de esta representación se almacenará en pDirectDrawGlobal-hDDD>.
GdiEntry1 se define como alias para esta función.
DdCreateSurfaceObject Contenedor para la función NtGdiDdCreateSurfaceObject y crea un objeto de superficie en modo kernel.
GdiEntry4 se define como alias para esta función.
DdDeleteDirectDrawObject Contenedor para la función NtGdiDdDeleteDirectDrawObject y elimina un objeto DirectDraw en modo kernel que se creó anteriormente mediante DdCreateDirectDrawObject.
GdiEntry3 se define como alias para esta función.
DdDeleteSurfaceObject Contenedor para la función NtGdiDdDeleteSurfaceObject y elimina un objeto de superficie en modo kernel creado anteriormente por NtGdiDdCreateSurfaceObject.
GdiEntry5 se define como alias para esta función.
DdGetDC Contenedor para la función NtGdiDdGetDC y devuelve un contexto de dispositivo de interfaz de dispositivos gráficos (GDI) de Windows (DC) que representa la superficie de DirectDraw indicada.
GdiEntry7 se define como alias para esta función.
DdGetDxHandle DdGetDxHandle devuelve el identificador de LA API de Microsoft DirectX en modo kernel para usarlo en llamadas posteriores a los puntos de entrada del modo kernel que controlan el mecanismo de la API de DirectX.
DdQueryDirectDrawObject Contenedor para la función NtGdiDdQueryDirectDrawObject y consulta una representación en modo kernel creada previamente para las funcionalidades.
GdiEntry2 se define como alias para esta función.
DdQueryDisplaySettingsUniqueness Devuelve el valor actual de un entero que se incrementa cada vez que se produce un modificador de modo, como cuando hay un conmutador de escritorio, un conmutador de usuario rápido o un cuadro microsoft MS-DOS de pantalla completa. La aplicación puede llamar a esta función repetidamente y comparar los valores antiguos y nuevos del valor devuelto para determinar si la configuración de visualización ha cambiado.
GdiEntry13 se define como un alias para esta función.
DdReenableDirectDrawObject Contenedor para la función NtGdiDdReenableDirectDrawObject . Vuelve a habilitar una instancia del controlador directDraw después de un evento de estilo de conmutador de modo como un conmutador de modo verdadero, la apariencia de un cuadro MS-DOS de pantalla completa o el cambio del controlador de pantalla.
GdiEntry10 se define como alias para esta función.
DdReleaseDC Contenedor para la función NtGdiDdReleaseDC y libera un controlador de dominio obtenido previamente a través de DdGetDC o GdiEntry7.
GdiEntry8 se define como alias para esta función.
DdResetVisrgn Contenedor para la función NtGdiDdResetVisrgn y habilita la información en modo de usuario oportuna en la región de recorte para windows en el escritorio.
GdiEntry6 se define como alias para esta función.
DdSetGammaRamp La función DdSetGammaRamp establece la rampa gamma para el dispositivo.
DdSwapTextureHandles Desarrollado para interfaces de controlador de dispositivo (DDIs) antes de Microsoft DirectDraw 7.0 y no hace nada en los sistemas Microsoft Windows NT. Se omiten todos los parámetros.
GdiEntry16 se define como alias para esta función.
DdUnattachSurface La función DdUnattachSurface quita un archivo adjunto, creado con DdAttachSurface, entre dos objetos de superficie en modo kernel.
NtGdiD3DContextCreate Crea un contexto.
NtGdiD3DContextDestroy Elimina el contexto especificado.
NtGdiD3DContextDestroyAll Consulta la cantidad de memoria libre en el montón de memoria administrada por el controlador.
NtGdiD3DDrawPrimitives2 Representa primitivos y devuelve el estado de representación actualizado.
NtGdiD3DGetDriverState Usado por los entornos de ejecución de DirectDraw y Direct3D para obtener información del controlador sobre su estado actual.
NtGdiD3DValidateTextureStageState Devuelve el número de pases en los que el hardware puede realizar las operaciones de mezcla especificadas en el estado actual.
NtGdiDdAddAlphaBlt Sin implementar.
NtGdiDdAddAttachedSurface Adjunta una superficie a otra superficie.
NtGdiDdAttachSurface Asocia dos representaciones de superficie en modo kernel.
NtGdiDdBeginMoCompFrame Inicia la descodificación de un nuevo marco.
NtGdiDdBlt Realiza una transferencia de bloques de bits.
NtGdiDdCanCreateD3DBuffer Determina si el controlador puede crear un comando de nivel de controlador o un búfer de vértices de la descripción especificada.
NtGdiDdCanCreateSurface Indica si el controlador puede crear una superficie de la descripción de la superficie especificada.
NtGdiDdColorControl Controla la luminancia y los controles de brillo de una superficie superpuesta.
NtGdiDdCreateD3DBuffer Se usa para crear un comando de nivel de controlador o un búfer de vértices de la descripción especificada.
NtGdiDdCreateDirectDrawObject Crea una representación del lado kernel del objeto DirectDraw.
NtGdiDdCreateMoComp Notifica al controlador que un descodificador de software comenzará a usar la compensación de movimiento con el GUID especificado.
NtGdiDdCreateSurface Adjunta una superficie a otra superficie.
NtGdiDdCreateSurfaceEx Crea una superficie de Direct3D a partir de una superficie de DirectDraw y asocia un valor de identificador solicitado.
NtGdiDdCreateSurfaceObject Crea un objeto de superficie en modo kernel que representa el objeto de superficie en modo de usuario al que hace referencia puSurfaceLocal.
NtGdiDdDeleteDirectDrawObject Destruye un objeto de dispositivo directDraw en modo kernel creado anteriormente.
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject elimina un objeto de superficie en modo kernel creado anteriormente.
NtGdiDdDestroyD3DBuffer Destruye un objeto de superficie directDraw en modo kernel asignado previamente que se creó con el miembro dwCaps de la estructura DDSCAPS establecida en DDSCAPS_EXECUTEBUFFER.
NtGdiDdDestroyMoComp Notifica al conductor que este objeto de compensación de movimiento ya no se usará. El controlador ahora debe realizar cualquier limpieza necesaria.
NtGdiDdDestroySurface Destruye un objeto de superficie directDraw en modo kernel asignado previamente.
NtGdiDdEndMoCompFrame Completa un marco descodificado.
NtGdiDdFlip Hace que la memoria expuesta asociada a las superficies de destino y actuales se interdistintamente.
NtGdiDdFlipToGDISurface Notifica al controlador cuando DirectDraw se voltea hacia o desde una superficie GDI.
NtGdiDdGetAvailDriverMemory Consulta la cantidad de memoria libre en todos los montones de memoria de vídeo.
NtGdiDdGetBltStatus Consulta el estado de la ranura de la superficie especificada.
NtGdiDdGetDC Crea un controlador de dominio para la superficie especificada.
NtGdiDdGetDriverInfo Consulta el controlador para obtener funcionalidades adicionales de DirectDraw y Direct3D que admite el controlador.
NtGdiDdGetDxHandle Devuelve el identificador de api directX en modo kernel que se va a usar en llamadas posteriores a los puntos de entrada del modo kernel que controlan el mecanismo de la API de DirectX.
NtGdiDdGetFlipStatus Determina si se ha producido el volteo solicitado más recientemente en una superficie.
NtGdiDdGetInternalMoCompInfo Permite al controlador informar de que asigna internamente memoria de visualización para realizar una compensación de movimiento.
NtGdiDdGetMoCompBuffInfo Permite al controlador especificar cuántas superficies provisionales son necesarias para admitir el GUID especificado y el tamaño, la ubicación y el formato de cada una de estas superficies.
NtGdiDdGetMoCompFormats Indica los formatos sin comprimir a los que el hardware puede descodificar los datos.
NtGdiDdGetMoCompGuids Recupera el número de GUID que admite el controlador.
NtGdiDdGetScanLine Devuelve el número de la línea de examen físico actual.
NtGdiDdLock Bloquea un área especificada de memoria expuesta y proporciona un puntero válido a un bloque de memoria asociado a una superficie.
NtGdiDdLockD3D Se usa para bloquear un área especificada de memoria del búfer y para proporcionar un puntero válido a un bloque de memoria asociado al búfer.
NtGdiDdQueryDirectDrawObject Consulta una representación en modo kernel creada anteriormente de un objeto DirectDraw para sus funcionalidades.
NtGdiDdQueryMoCompStatus Consulta el estado de la operación de representación más reciente en la superficie especificada.
NtGdiDdReenableDirectDrawObject Vuelve a habilitar un objeto de dispositivo en modo kernel de DirectDraw después de un modificador de modo.
NtGdiDdReleaseDC Libera el controlador de dominio creado anteriormente para el objeto de superficie directDraw en modo kernel indicado.
NtGdiDdRenderMoComp Indica al controlador qué macroblocks se van a representar especificando las superficies que contienen los macroblocks, los desplazamientos en cada superficie donde existen los macroblocks y el tamaño de los datos de macroblock que se van a representar.
NtGdiDdResetVisrgn Se usa para permitir que el modo de usuario comprenda de forma válida la región de recorte para las ventanas en el escritorio. Este recorte puede cambiar de forma asincrónica desde el punto de vista de los subprocesos en modo de usuario.
NtGdiDdSetColorKey Establece el valor de clave de color de la superficie especificada.
NtGdiDdSetExclusiveMode Notifica al controlador cuando una aplicación de DirectDraw cambia a o desde el modo exclusivo.
NtGdiDdSetGammaRamp Establece la rampa gamma para el dispositivo.
NtGdiDdSetOverlayPosition Establece la posición de una superposición.
NtGdiDdUnattachSurface Quita un archivo adjunto, creado con NtGdiDdAttachSurface, entre dos objetos de superficie en modo kernel.
NtGdiDdUnlock Libera el bloqueo mantenido en la superficie especificada.
NtGdiDdUnlockD3D Se usa para liberar un bloqueo mantenido en un área especificada de memoria del búfer.
NtGdiDdUpdateOverlay Cambia la posición o modifica los atributos visuales de una superficie superpuesta.
NtGdiDdWaitForVerticalBlank Devuelve el estado en blanco vertical del dispositivo.

 

Asignación de búfer de vértices y comandos

Introducción a la presentación