D3DKMTRender 函数 (d3dkmthk.h)
D3DKMTRender 函数将当前命令缓冲区提交到 Microsoft DirectX 图形内核子系统 (Dxgkrnl.sys) 。
语法
NTSTATUS D3DKMTRender(
D3DKMT_RENDER *unnamedParam1
);
参数
unnamedParam1
pData [in, out]
指向 D3DKMT_RENDER 结构的指针,该结构描述用于将当前命令缓冲区提交到图形内核子系统的参数。
返回值
D3DKMTRender 返回以下值之一:
返回代码 | 说明 |
---|---|
STATUS_SUCCESS | 已成功提交命令缓冲区。 |
STATUS_DEVICE_REMOVED | 图形适配器已停止或显示上下文已重置。 |
STATUS_INVALID_PARAMETER | 参数已验证,确定为不正确。 |
STATUS_NO_MEMORY | 由于内存不足,D3DKMTRender 无法完成。 |
STATUS_INVALID_HANDLE | OpenGL ICD 在命令缓冲区中检测到无效句柄。 |
STATUS_PRIVILEGED_INSTRUCTION | D3DKMTRender 检测到非特权指令 (,即访问超出当前 CPU 进程权限的内存的指令) 。 |
此函数还可能返回其他 NTSTATUS 值。
注解
命令缓冲区通常包含许多图形命令。
如果 D3DKMTRender 返回 STATUS_GRAPHICS_ALLOCATION_INVALID,则 OpenGL ICD 应重新打开或重新创建主句柄,将命令缓冲区中对上一句柄的所有引用替换为新句柄,然后再次调用 D3DKMTRender 以重新提交缓冲区。
调用 D3DKMTRender 后,OpenGL ICD 应根据 pData 参数指向的 D3DKMT_RENDER 结构的 pCommandBuffer 和 CommandBufferSize 成员中返回的值,确定命令缓冲区的基址和大小,以便用于下一次提交。
对于使用有保证的 DMA 缓冲区协定模式 (的设备,有关此模式的详细信息,请参阅 使用保证协定 DMA 缓冲区模型) ,显示微型端口驱动程序可用于在下次提交时转换命令缓冲区的 DMA 缓冲区的大小与命令缓冲区本身的大小相同。 对于此类设备,OpenGL ICD 还应从 D3DKMT_RENDER 的 AllocationListSize 成员中返回的值确定分配列表的大小,该分配列表将在下一次提交时命令缓冲区转换期间可供显示微型端口驱动程序使用。
对于不使用有保证的 DMA 缓冲区协定的设备,OpenGL ICD 可以使用 CommandBufferSize 和 AllocationListSize 成员中返回的信息来确定下一个可用于转换的 DMA 缓冲区和分配列表的大小。 但是,在内存不足的情况下,提供给显示微型端口驱动程序的实际 DMA 缓冲区和分配列表可能小于所需的大小。
如果 OpenGL ICD 检测到大部分命令缓冲区刷新是因为驱动程序在命令缓冲区或分配列表中空间不足,则驱动程序可以请求调整它们的大小。 若要调整命令缓冲区的大小,驱动程序在 D3DKMT_RENDER 的 Flags 成员中设置 ResizeCommandBuffer 位字段标志,并将请求的大小放在 D3DKMT_RENDER 的 CommandBufferSize 成员中。 同样,若要调整分配列表的大小,驱动程序会在 D3DKMT_RENDER 的 Flags 成员中设置 ResizeAllocationList 位字段标志,并将请求的元素数放在 D3DKMT_RENDER 的 AllocationListSize 成员中。
注意
即使驱动程序可以请求调整命令缓冲区和分配列表的大小,视频内存管理器可能无法遵守。 因此,如果对 D3DKMTRender 的调用成功,驱动程序应验证 pCommandBuffer、 CommandBufferSize 和 AllocationListSize 成员中返回的值。
但是,如果调用 D3DKMTRender 失败,驱动程序将确定命令缓冲区和/或分配列表未调整大小。 因此,驱动程序不应处理 pCommandBuffer、 CommandBufferSize 和 AllocationListSize 成员中返回的值,因为它们无效。
示例
下面的代码示例演示 OpenGL ICD 如何使用 D3DKMTRender 呈现三维基元。
HRESULT Render(D3DKMT_HANDLE hDevice, UINT CommandOffset, UINT CommandLength)
{
D3DKMT_RENDER RenderData;
memset(&RenderData, 0, sizeof(RenderData));
RenderData.hDevice = hDevice;
RenderData.CommandOffset = CommandOffset;
RenderData.CommandLength = CommandLength;
if (NT_SUCCESS((*pfnKTRender)(&RenderData))) {
return S_OK;
}
return E_FAIL;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista |
目标平台 | 通用 |
标头 | d3dkmthk.h (包括 D3dkmthk.h) |
Library | Gdi32.lib |
DLL | Gdi32.dll |