Поделиться через


Поддержка клиентов низкого уровня графики

[Эти функции могут изменяться при каждой редакции операционной системы. Вместо этого используйте Microsoft DirectDraw и Microsoft Direct3DAPIs; эти API изолируют приложения от таких изменений операционной системы и скрывают множество других трудностей, связанных с взаимодействием непосредственно с драйверами отображения. Дополнительные сведения см. в разделе "Общие сведения о отображении".]

DirectDraw и Direct3D используют некоторые подпрограммы режима ядра для взаимодействия с операционной системой и драйвером отображения.

Ядро операционной системы, как представляется, является драйвером отображения DirectDraw/Direct3D с точки зрения компонентов пользовательского режима. Однако существуют некоторые различия между ядрами и драйверами отображения. Компоненты режима ядра сохраняют копию структур, представляющих объекты DirectDraw/Direct3D, такие как устройства и поверхности. Компонент пользовательского режима DirectDraw/Direct3D запрашивает создание этих структур, которые называются дескрипторами, возвращаемыми режимом ядра. Следовательно, различия в основном находятся в аргументах, передаваемых подпрограммам: ядро принимает дескрипторы, в то время как драйверы обычно принимают указатели.

Эволюция точек входа в режим ядра

DirectDraw делает все его подключения к режиму ядра через Gdi32.dll с помощью нескольких точек входа. Обычно эти точки входа просто маршалы параметров. В рамках создания устройства Gdi32.dll возвращает указатели на подпрограммы внутри себя, которые затем используются DirectDraw и Direct3D 7.0.

Direct3D 8.x делает чистый разрыв от Gdi32.dll и вызывается непосредственно в точках входа в режим ядра.

Вызов ядра

Эти точки входа похожи и, во многих случаях, идентичны точкам входа в самом драйвере отображения, поэтому понимание материалов комплекта средств разработки драйверов (DDK) для DirectDraw и Direct3D является необходимым условием для использования этих функций.

Вызов этих функций отличается от операционных систем. В Windows 2000 W2KUMODE. Библиотека LIB содержит подпрограммы, позволяющие вызывающей потоку перейти в режим ядра. Эти подпрограммы не маршалируют параметры и являются идеальным механизмом вызова в Windows 2000. Механизм, который делает переход в режим ядра, зависит от порядка таблицы. Это упорядочение изменится в разных версиях операционной системы. Поэтому не рекомендуется создавать приложение, использующее W2KUMODE. LIB для Windows 2000 и ожидает, что он будет работать без изменений в Windows XP. Механизм создания переносимости операционной системы описан в следующем разделе.

В Windows XP D3D8THK.DLL экспортирует все функции режима ядра, но с небольшим украшенным именем. В следующем примере показано, как приложения могут псевдонимом низкоуровневых клиентских функций с помощью препроцессора. Перед этим динамическое связывание с D3D8THK.DLL.


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

Написание переносимых приложений

Для переносимого приложения в операционных системах доступны несколько методов. Наиболее надежным является установка распространяемого пакета Microsoft DirectX 8.x в Windows 2000 в рамках процесса установки собственного приложения. Это гарантирует, что D3D8THK.DLL будут доступны в системах Windows 2000 и позволяют использовать один путь к коду в приложении, так как можно использовать тот же метод, что и для Windows XP выше.

Приложения также могут создавать собственные библиотеки DLL и реализовывать две версии этой библиотеки DLL, одну для Windows 2000, используя описанный выше метод и один для Windows XP, использующий D3D8THK.DLL.

Создание устройства

DirectDraw и Direct3D сначала должны создать экземпляр абстракции ядра объекта драйвера. В Gdi32.dll и Ddraw.dll это достигается путем вызова DdCreateDirectDrawObject, DdQueryDirectDrawObject и DdReenableDirectDrawObject. В Direct3D 8.x, это достигается путем вызова NtGdiDdCreateDirectDrawObject, NtGdiDdQueryDirectDrawObject и NtGdiDdReenableDirectDrawObject. Обратите внимание, что точки входа GdiEntry* — это просто маршалеры для точек входа в режиме ядра.

После вызова этих функций возвращается дескриптор, представляющий абстракцию объекта ядра устройства DirectDraw. Этот объект ядра представляет экземпляр драйвера, принадлежащий драйверу отображения. Этот дескриптор можно использовать в последующих вызовах, таких как DdCreateSurfaceObject (или NtGdiDdCreateSurfaceObject в Direct3D 8.x) для создания дополнительных объектов.

Объекты ядра

Для управления представлениями определенных объектов в режиме ядра используются несколько точек входа. DdCreateSurfaceObject (или NtGdiDdCreateSurfaceObject в Direct3D 8.x) является хорошим примером. Эта точка входа создает объект режима ядра, представляющий часть системной памяти. Точка входа возвращает дескриптор, и этот дескриптор можно использовать в последующих вызовах рисования. Ядро наследует указатель на собственную структуру от этих дескрипторов и передает этот указатель на драйвер отображения, который затем выполняет операцию.

Функции

В этой таблице перечислены функции, представляющие точки входа в режим ядра, и вспомогательные подпрограммы пользовательского режима в Gdi32.dll, которые обтекают эти точки входа.

Раздел Содержимое
DdAttachSurface Функция DdAttachSurface присоединяет два представления поверхности режима ядра.
DdCreateDIBSection Создает структуру DIBSECTION, которая использует свою цветовую таблицу с устройством.
GdiEntry9 #defined в качестве псевдонима для этой функции.
DdCreateDirectDrawObject Оболочка для функции NtGdiDdCreateDirectDrawObject и создает представление объекта DirectDraw на стороне ядра. Дескриптор этого представления будет храниться в pDirectDrawGlobal-hDD>.
GdiEntry1 определяется как псевдоним для этой функции.
DdCreateSurfaceObject Оболочка для функции NtGdiDdCreateSurfaceObject и создает объект поверхности режима ядра.
GdiEntry4 определяется как псевдоним для этой функции.
DdDeleteDirectDrawObject Оболочка для функции NtGdiDdDeleteDirectDrawObject и удаляет объект DirectDraw режима ядра, созданный ранее с помощью DdCreateDirectDrawObject.
GdiEntry3 определяется как псевдоним для этой функции.
DdDeleteSurfaceObject Оболочка для функции NtGdiDdDeleteSurfaceObject и удаляет объект поверхности режима ядра, ранее созданный ntGdiDdCreateSurfaceObject.
GdiEntry5 определяется как псевдоним для этой функции.
DdGetDC Оболочка для функции NtGdiDdGetDC и возвращает контекст устройства интерфейса графического устройства Windows (GDI), представляющий указанную поверхность DirectDraw.
GdiEntry7 определяется как псевдоним для этой функции.
DdGetDxHandle DdGetDxHandle возвращает дескриптор API Microsoft DirectX в режиме ядра для использования в последующих вызовах точек входа в режиме ядра, которые управляют механизмом API DirectX.
DdQueryDirectDrawObject Оболочка для функции NtGdiDdQueryDirectDrawObject и запрашивает ранее созданное представление режима ядра для возможностей.
GdiEntry2 определяется как псевдоним для этой функции.
DdQueryDisplay Параметры Uniqueness Возвращает текущее значение целого числа, которое увеличивается при каждом переключении режима, например при наличии классического коммутатора, быстрого пользовательского коммутатора или полноэкранного окна Microsoft MS-DOS. Приложение может многократно вызывать эту функцию и сравнивать старые и новые значения возвращаемого значения, чтобы определить, изменились ли параметры отображения.
GdiEntry13 определяется как псевдоним для этой функции.
DdReenableDirectDrawObject Оболочка для функции NtGdiDdReenableDirectDrawObject. Он повторно включает экземпляр драйвера DirectDraw после события переключателя режима, такого как переключатель режима true, внешний вид полноэкранного окна MS-DOS или изменение драйвера дисплея.
GdiEntry10 определяется как псевдоним для этой функции.
DdReleaseDC Оболочка для функции NtGdiDdReleaseDC и освобождает контроллер домена, полученный ранее через DdGetDC или GdiEntry7.
GdiEntry8 определяется как псевдоним для этой функции.
DdResetVisrgn Оболочка для функции NtGdiDdResetVisrgn и обеспечивает своевременную информацию о регионе вырезки для окон на рабочем столе.
GdiEntry6 определяется как псевдоним для этой функции.
DdSetGammaRamp Функция DdSetGammaRamp задает гамма-пандус для устройства.
DdSwapTextureHandles Разработано для интерфейсов драйверов устройств (DDIs) до Microsoft DirectDraw 7.0 и ничего не делает в системах Microsoft Windows NT. Все параметры игнорируются.
GdiEntry16 определяется как псевдоним для этой функции.
DdUnattachSurface Функция DdUnattachSurface удаляет вложение, созданное с помощью DdAttachSurface, между двумя объектами поверхности в режиме ядра.
NtGdiD3DContextCreate Создает контекст.
NtGdiD3DContextDetextDesk Удаляет указанный контекст.
NtGdiD3DContextDetextAll Запрашивает объем свободной памяти в куче памяти, управляемой драйвером.
NtGdiD3DDrawPrimitives2 Отрисовывает примитивы и возвращает обновленное состояние отрисовки.
NtGdiD3DGetDriverState Используется средами выполнения DirectDraw и Direct3D для получения сведений от драйвера о текущем состоянии.
NtGdiD3DValidateTextureStageState Возвращает количество проходов, в которых оборудование может выполнять операции смешения, указанные в текущем состоянии.
NtGdiDdAddAlphaBlt Не реализовано.
NtGdiDdAddAttachedSurface Присоединяет поверхность к другой поверхности.
NtGdiDdAttachSurface Присоединяет два представления поверхности в режиме ядра.
NtGdiDdBeginMoCompFrame Начинает декодировать новый кадр.
NtGdiDdBlt Выполняет передачу битовых блоков.
NtGdiDdCanCreateD3DBuffer Определяет, может ли драйвер создать команду уровня драйвера или буфер вершин указанного описания.
NtGdiDdCanCreateSurface Указывает, может ли драйвер создать поверхность указанного описания поверхности.
NtGdiDdColorControl Управляет элементами управления светом и яркостью поверхности наложения.
NtGdiDdCreateD3DBuffer Используется для создания команды уровня драйвера или буфера вершин указанного описания.
NtGdiDdCreateDirectDrawObject Создает представление объекта DirectDraw на стороне ядра.
NtGdiDdCreateMoComp Уведомляет драйвер о том, что декодировщик программного обеспечения начнет использовать компенсацию движения с указанным GUID.
NtGdiDdCreateSurface Присоединяет поверхность к другой поверхности.
NtGdiDdCreateSurfaceEx Создает поверхность Direct3D из поверхности DirectDraw и связывает с ней запрошенное значение дескриптора.
NtGdiDdCreateSurfaceObject Создает объект поверхности в режиме ядра, представляющий объект поверхности в пользовательском режиме, на который ссылается puSurfaceLocal.
NtGdiDdDeleteDirectDrawObject Уничтожает ранее созданный объект устройства DirectDraw в режиме ядра.
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject удаляет ранее созданный объект поверхности режима ядра.
NtGdiDdDeskdD3DBuffer Уничтожает ранее выделенный объект surface DirectDraw в режиме ядра, созданный с членом dwCaps структуры DDSCAPS, равным DDSCAPS_EXECUTEBUFFER.
NtGdiDdDeskMoComp Уведомляет водителя о том, что этот объект компенсации движения больше не будет использоваться. Теперь драйверу необходимо выполнить любую необходимую очистку.
NtGdiDdDeskSurface Уничтожает ранее выделенный объект surface DirectDraw в режиме ядра.
NtGdiDdEndMoCompFrame Завершает декодированные кадры.
NtGdiDdFlip Приводит к обмену памяти поверхности, связанной с целевым и текущим поверхностями.
NtGdiDdFlipToGDISurface Уведомляет драйвер, когда DirectDraw перевернется на поверхность GDI или с нее.
NtGdiDdGetAvailDriverMemory Запрашивает объем свободной памяти во всех кучах памяти видео.
NtGdiDdGetBltStatus Запрашивает состояние blit указанной поверхности.
NtGdiDdGetDC Создает контроллер домена для указанной поверхности.
NtGdiDdGetDriverInfo Запрашивает драйвер для дополнительных функций DirectDraw и Direct3D, поддерживаемых драйвером.
NtGdiDdGetDxHandle Возвращает дескриптор API DirectX в режиме ядра для использования в последующих вызовах точек входа в режиме ядра, которые управляют механизмом API DirectX.
NtGdiDdGetFlipStatus Определяет, произошло ли последнее запрошенное переворачивание на поверхности.
NtGdiDdGetInternalMoCompInfo Позволяет драйверу сообщать о том, что он выделяет память отображения для выполнения компенсации движения.
NtGdiDdGetMoCompBuffInfo Позволяет драйверу указать, сколько промежуточных поверхностей требуется для поддержки указанного GUID, а также размера, расположения и формата каждой из этих поверхностей.
NtGdiDdGetMoCompFormats Указывает несжатые форматы, для которых оборудование может декодировать данные.
NtGdiDdGetMoCompGuids Извлекает количество идентификаторов GUID, поддерживаемых драйвером.
NtGdiDdGetScanLine Возвращает количество текущей физической строки сканирования.
NtGdiDdLock Блокирует указанную область памяти поверхности и предоставляет допустимый указатель на блок памяти, связанный с поверхностью.
NtGdiDdLockDD3D Используется для блокировки указанной области буферной памяти и предоставления допустимого указателя на блок памяти, связанный с буфером.
NtGdiDdQueryDirectDrawObject Запрашивает ранее созданное представление объекта DirectDraw в режиме ядра для его возможностей.
NtGdiDdQueryMoCompStatus Запрашивает состояние последней операции отрисовки в указанную поверхность.
NtGdiDdReenableDirectDrawObject Повторно включает объект устройства в режиме ядра DirectDraw после переключения режима.
NtGdiDdReleaseDC Освобождает созданный ранее контроллер домена для указанного объекта surface DirectDraw в режиме ядра.
NtGdiDdRenderMoComp Указывает драйверу, какой макроблок будет отображаться путем указания поверхностей, содержащих макроблоки, смещения в каждой поверхности, в которой существуют макроблоки, и размера данных макроблока для отрисовки.
NtGdiDdResetVisrgn Используется для включения пользовательского режима для получения допустимого понимания области вырезки для окон на рабочем столе. Это вырезка может измениться асинхронно с точки зрения потоков пользовательского режима.
NtGdiDdSetColorKey Задает значение ключа цвета для указанной поверхности.
NtGdiDdSetExclusiveMode Уведомляет драйвер, когда приложение DirectDraw переключается на монопольный режим или с него.
NtGdiDdSetGammaRamp Задает гамма-пандус для устройства.
NtGdiDdSetOverlayPosition Задает позицию для наложения.
NtGdiDdUnattachSurface Удаляет вложение, созданное с помощью NtGdiDdAttachSurface, между двумя объектами поверхностного режима ядра.
NtGdiDdUnlock Освобождает блокировку, удерживаемую на указанной поверхности.
NtGdiDdUnlockDD3D Используется для освобождения блокировки, удерживаемой на указанной области буферной памяти.
NtGdiDdUpdateOverlay Изменяет или изменяет визуальные атрибуты поверхности наложения.
NtGdiDdWaitForVerticalBlank Возвращает вертикальное пустое состояние устройства.

 

Выделение буфера вершин и команд

Общие сведения о отображении