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 结构的 pCommandBufferCommandBufferSize 成员中返回的值,确定命令缓冲区的基址和大小,以便用于下一次提交。

对于使用有保证的 DMA 缓冲区协定模式 (的设备,有关此模式的详细信息,请参阅 使用保证协定 DMA 缓冲区模型) ,显示微型端口驱动程序可用于在下次提交时转换命令缓冲区的 DMA 缓冲区的大小与命令缓冲区本身的大小相同。 对于此类设备,OpenGL ICD 还应从 D3DKMT_RENDERAllocationListSize 成员中返回的值确定分配列表的大小,该分配列表将在下一次提交时命令缓冲区转换期间可供显示微型端口驱动程序使用。

对于不使用有保证的 DMA 缓冲区协定的设备,OpenGL ICD 可以使用 CommandBufferSizeAllocationListSize 成员中返回的信息来确定下一个可用于转换的 DMA 缓冲区和分配列表的大小。 但是,在内存不足的情况下,提供给显示微型端口驱动程序的实际 DMA 缓冲区和分配列表可能小于所需的大小。

如果 OpenGL ICD 检测到大部分命令缓冲区刷新是因为驱动程序在命令缓冲区或分配列表中空间不足,则驱动程序可以请求调整它们的大小。 若要调整命令缓冲区的大小,驱动程序在 D3DKMT_RENDER 的 Flags 成员中设置 ResizeCommandBuffer 位字段标志,并将请求的大小放在 D3DKMT_RENDER 的 CommandBufferSize 成员中。 同样,若要调整分配列表的大小,驱动程序会在 D3DKMT_RENDER 的 Flags 成员中设置 ResizeAllocationList 位字段标志,并将请求的元素数放在 D3DKMT_RENDER 的 AllocationListSize 成员中。

注意

即使驱动程序可以请求调整命令缓冲区和分配列表的大小,视频内存管理器可能无法遵守。 因此,如果对 D3DKMTRender 的调用成功,驱动程序应验证 pCommandBufferCommandBufferSizeAllocationListSize 成员中返回的值。
但是,如果调用 D3DKMTRender 失败,驱动程序将确定命令缓冲区和/或分配列表未调整大小。 因此,驱动程序不应处理 pCommandBufferCommandBufferSizeAllocationListSize 成员中返回的值,因为它们无效。

示例

下面的代码示例演示 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

另请参阅

D3DKMTGetDeviceState

D3DKMT_RENDER