图形 Low-Level 客户端支持

[这些函数可能会随每个作系统修订而更改。 请改用 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中完全中断,并直接调用内核模式入口点。

调用内核

这些入口点相似,在许多情况下,与显示驱动程序本身的入口点相同,因此了解 DirectDraw 和 Direct3D 的驱动程序开发工具包(DDK)材料是使用这些函数的必要先决条件。

调用这些函数在作系统之间有所不同。 在 Windows 2000 上,W2KUMODE。LIB 库包含使调用线程能够转换为内核模式的例程。 这些例程不执行参数封送,并且是 Windows 2000 上的理想调用机制。 转换到内核模式的机制依赖于表的排序。 此排序将在作系统修订之间更改。 因此,不建议生成依赖于W2KUMODE的应用程序。LIB for 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);

编写可移植应用程序

可通过多种技术使应用程序跨作系统移植。 最可靠的是在 Windows 2000 上安装 Microsoft DirectX 8.x 可再发行组件包,作为应用程序安装过程的一部分。 这可以保证D3D8THK.DLL在 Windows 2000 系统上可用,并允许应用程序中的单一代码路径,因为可以使用上述 Windows XP 所述的相同技术。

应用程序还可以生成自己的隔离 DLL 并实现该 DLL 的两个版本,一个用于 Windows 2000,使用上面所示的技术,另一个用于使用D3D8THK.DLL的 Windows XP。

设备创建

DirectDraw 和 Direct3D 必须先创建内核的驱动程序对象的抽象实例。 在 Gdi32.dll 和 Ddraw.dll中,这是通过调用 DdCreateDirectDrawObjectDdQueryDirectDrawObjectDdReenableDirectDrawObject来实现的。 在 Direct3D 8 中。x,可通过调用 NtGdiDdCreateDirectDrawObjectNtGdiDdQueryDirectDrawObjectNtGdiDdReenableDirectDrawObject来实现此目的。 请注意,GdiEntry* 入口点只是内核模式入口点的封送器。

调用这些函数后,将返回一个句柄,表示 DirectDraw 设备的内核对象的抽象。 此内核对象表示显示驱动程序拥有的驱动程序实例。 此句柄可用于后续调用,例如 DdCreateSurfaceObject(或 Direct3D 8 中的 NtGdiDdCreateSurfaceObject)。x) 生成更多对象。

内核对象

几个入口点用于管理某些对象的内核模式表示形式。 Direct3D 8 中的 DdCreateSurfaceObject(或 NtGdiDdCreateSurfaceObject)。x) 是一个很好的示例。 此入口点创建表示系统内存的内核模式对象。 入口点返回句柄,此句柄可用于后续绘图调用。 内核从这些句柄派生指向其自身结构的指针,并将该指针传递给显示驱动程序,然后执行该作。

功能

下表列出了表示内核模式入口点的函数,以及包装这些入口点 Gdi32.dll 中的用户模式帮助程序例程。

主题 内容
DdAttachSurface DdAttachSurface 函数附加两个内核模式图面表示形式。
DdCreateDIBSection 创建 DIBSECTION 结构,该结构与设备共享其颜色表。
GdiEntry9 作为此函数的别名 #defined。
DdCreateDirectDrawObject NtGdiDdCreateDirectDrawObject 函数的包装器,并创建 DirectDraw 对象的内核端表示形式。 此表示形式的句柄将存储在 pDirectDrawGlobal->hDD 中。
GdiEntry1 定义为此函数的别名。
DdCreateSurfaceObject NtGdiDdCreateSurfaceObject 函数的包装器,并创建内核模式图面对象。
GdiEntry4 定义为此函数的别名。
DdDeleteDirectDrawObject NtGdiDdDeleteDirectDrawObject 函数的包装器,并删除以前使用 DdCreateDirectDrawObject创建的内核模式 DirectDraw 对象。
GdiEntry3 定义为此函数的别名。
DdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject 函数的包装器,并删除以前由 NtGdiDdCreateSurfaceObject创建的内核模式 surface 对象。
GdiEntry5 定义为此函数的别名。
DdGetDC NtGdiDdGetDC 函数的包装器,并返回表示指示的 DirectDraw 图面的 Windows 图形设备接口(GDI)设备上下文(DC)。
GdiEntry7 定义为此函数的别名。
DdGetDxHandle DdGetDxHandle 返回内核模式Microsoft DirectX API 句柄,以在对控制 DirectX API 机制的内核模式入口点的后续调用中使用。
DdQueryDirectDrawObject NtGdiDdQueryDirectDrawObject 的包装器 函数,并查询以前为功能创建的内核模式表示形式。
GdiEntry2 定义为此函数的别名。
DdQueryDisplaySettingsUniqueness 返回在模式开关发生时递增的整数的当前值,例如,当有桌面交换机、快速用户开关或全屏Microsoft MS-DOS 框时。 应用程序可以重复调用此函数,并比较返回值的旧值和新值,以确定显示设置是否已更改。
GdiEntry13 定义为此函数的别名。
DdReenableDirectDrawObject NtGdiDdReenableDirectDrawObject 函数的包装器。 它在模式切换样式事件(例如 true 模式开关、全屏 MS-DOS 框的外观或更改显示驱动程序)后重新启用 DirectDraw 驱动程序实例。
GdiEntry10 定义为此函数的别名。
DdReleaseDC NtGdiDdReleaseDC 函数的包装器,并释放以前通过 DdGetDCGdiEntry7获取的 DC。
GdiEntry8 定义为此函数的别名。
DdResetVisrgn NtGdiDdResetVisrgn 函数的包装器,并针对桌面上窗口的剪辑区域启用及时的用户模式信息。
GdiEntry6 定义为此函数的别名。
DdSetGammaRamp DdSetGammaRamp 函数设置设备的伽玛渐变。
DdSwapTextureHandles 在 Microsoft DirectDraw 7.0 之前为设备驱动程序接口(DDI)开发,在 Microsoft Windows NT 系统上不执行任何作。 将忽略所有参数。
GdiEntry16 定义为此函数的别名。
DdUnattachSurface DdUnattachSurface 函数删除在两个内核模式图面对象之间使用 DdAttachSurface创建的附件。
NtGdiD3DContextCreate 创建上下文。
NtGdiD3DContextDestroy 删除指定的上下文。
NtGdiD3DContextDestroyAll 查询驱动程序管理的内存堆中的可用内存量。
NtGdiD3DDrawPrimitives2 呈现基元并返回更新的呈现状态。
NtGdiD3DGetDriverState 由 DirectDraw 和 Direct3D 运行时用于从驱动程序获取有关其当前状态的信息。
NtGdiD3DValidateTextureStageState 返回硬件可以执行当前状态中指定的混合作的传递数。
NtGdiDdAddAlphaBlt 未实现。
NtGdiDdAddAttachedSurface 将图面附加到另一个图面。
NtGdiDdAttachSurface 附加两个内核模式图面表示形式。
NtGdiDdBeginMoCompFrame 开始解码新帧。
NtGdiDdBlt 执行位块传输。
NtGdiDdCanCreateD3DBuffer 确定驱动程序是否可以创建指定说明的驱动程序级命令或顶点缓冲区。
NtGdiDdCanCreateSurface 指示驱动程序是否可以创建指定图面说明的图面。
NtGdiDdColorControl 控制覆盖面的亮度和亮度控件。
NtGdiDdCreateD3DBuffer 用于创建指定说明的驱动程序级命令或顶点缓冲区。
NtGdiDdCreateDirectDrawObject 创建 DirectDraw 对象的内核端表示形式。
NtGdiDdCreateMoComp 通知驱动程序软件解码器将开始使用具有指定 GUID 的运动补偿。
NtGdiDdCreateSurface 将图面附加到另一个图面。
NtGdiDdCreateSurfaceEx 从 DirectDraw 图面创建 Direct3D 图面,并将请求的句柄值关联到它。
NtGdiDdCreateSurfaceObject 创建一个内核模式图面对象,该对象表示由 puSurfaceLocal 引用的用户模式图面对象。
NtGdiDdDeleteDirectDrawObject 销毁以前创建的内核模式 DirectDraw 设备对象。
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject 删除以前创建的内核模式图面对象。
NtGdiDdDestroyD3DBuffer 销毁以前分配的内核模式 DirectDraw 图面对象,该对象是使用 DDSCAPS 结构设置为DDSCAPS_EXECUTEBUFFER的 dwCaps 成员创建的。
NtGdiDdDestroyMoComp 通知驱动程序此运动补偿对象不再使用。 驱动程序现在需要执行任何必要的清理。
NtGdiDdDestroySurface 销毁以前分配的内核模式 DirectDraw surface 对象。
NtGdiDdEndMoCompFrame 完成解码的帧。
NtGdiDdFlip 使与目标图面和当前图面关联的图面内存交换。
NtGdiDdFlipToGDISurface 当 DirectDraw 向 GDI 图面或从 GDI 图面翻转时通知驱动程序。
NtGdiDdGetAvailDriverMemory 查询所有视频内存堆中的可用内存量。
NtGdiDdGetBltStatus 查询指定图面的 blit 状态。
NtGdiDdGetDC 为指定的图面创建 DC。
NtGdiDdGetDriverInfo 查询驱动程序以获取驱动程序支持的其他 DirectDraw 和 Direct3D 功能。
NtGdiDdGetDxHandle 返回内核模式 DirectX API 句柄,用于对控制 DirectX API 机制的内核模式入口点的后续调用。
NtGdiDdGetFlipStatus 确定表面上最近请求的翻转是否已发生。
NtGdiDdGetInternalMoCompInfo 允许驱动程序报告它在内部分配显示内存以执行运动补偿。
NtGdiDdGetMoCompBuffInfo 允许驱动程序指定支持指定 GUID 所需的临时图面数,以及每个图面的大小、位置和格式。
NtGdiDdGetMoCompFormats 指示硬件可以解码数据的未压缩格式。
NtGdiDdGetMoCompGuids 检索驱动程序支持的 GUID 数。
NtGdiDdGetScanLine 返回当前物理扫描行的数目。
NtGdiDdLock 锁定图面内存的指定区域,并提供指向与图面关联的内存块的有效指针。
NtGdiDdLockD3D 用于锁定指定缓冲区内存区域,并提供与缓冲区关联的内存块的有效指针。
NtGdiDdQueryDirectDrawObject 查询以前创建的 DirectDraw 对象的内核模式表示形式,以获取其功能。
NtGdiDdQueryMoCompStatus 将最新呈现作的状态查询到指定的图面。
NtGdiDdReenableDirectDrawObject 在模式切换后重新启用 DirectDraw 内核模式设备对象。
NtGdiDdReleaseDC 释放以前为指示的内核模式 DirectDraw surface 对象创建的 DC。
NtGdiDdRenderMoComp 通过指定包含宏块的图面、宏块所在的每个图面的偏移量以及要呈现的宏块数据的大小,告诉驱动程序要呈现哪些宏块。
NtGdiDdResetVisrgn 用于使用户模式能够有效了解桌面上窗口的剪辑区域。 此剪辑可以从用户模式线程的角度异步更改。
NtGdiDdSetColorKey 设置指定图面的颜色键值。
NtGdiDdSetExclusiveMode 当 DirectDraw 应用程序切换到或从独占模式切换时通知驱动程序。
NtGdiDdSetGammaRamp 设置设备的伽马坡道。
NtGdiDdSetOverlayPosition 设置覆盖区的位置。
NtGdiDdUnattachSurface 删除在两个内核模式图面对象之间使用 NtGdiDdAttachSurface创建的附件。
NtGdiDdUnlock 释放在指定图面上保留的锁。
NtGdiDdUnlockD3D 用于释放在指定缓冲区内存区域中保留的锁。
NtGdiDdUpdateOverlay 重新定位或修改覆盖图面的视觉属性。
NtGdiDdWaitForVerticalBlank 返回设备的垂直空白状态。

 

命令和顶点缓冲区分配

显示 简介