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


Функция 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 обнаружили непривилегированные инструкции (то есть инструкции, которые получают доступ к памяти за пределами привилегий текущего процесса ЦП).

Эта функция также может возвращать другие значения NTSTATUS.

Замечания

Буфер команд обычно содержит множество графических команд.

Если D3DKMTRender возвращает STATUS_GRAPHICS_ALLOCATION_INVALID, openGL ICD должен повторно открыть или повторно создать основной дескриптор, замените все ссылки в буфере команд на предыдущий дескриптор новым дескриптором, а затем вызовите D3DKMTRender повторно, чтобы повторно отправить буфер.

После вызова D3DKMTRender, ICD OpenGL должен определить базовый адрес и размер буфера команд, который он должен использовать для следующей отправки из значений, возвращаемых в pCommandBuffer и CommandBufferSize членов структуры D3DKMT_RENDER, на которую указывает параметр pData.

Для устройства, использующего режим контракта буфера DMA (дополнительные сведения об этом режиме, см. использование модели буфера DMA гарантированного контракта DMA), размер буфера DMA, который доступен драйверу минипорта для преобразования буфера команд при следующей отправке, совпадает с размером самого буфера команд. Для такого устройства openGL ICD также должен определить размер списка выделения, который будет доступен драйверу мини-порта отображения во время перевода буфера команд в следующей отправке из значения, возвращаемого в AllocationListSize члена D3DKMT_RENDER.

Для устройств, которые не используют гарантированный контракт буфера DMA, openGL ICD может использовать сведения, возвращаемые в CommandBufferSize и AllocationListSize членов, чтобы определить размер следующего буфера DMA и списка выделения, который будет доступен для перевода. Однако в условиях низкой памяти фактический буфер DMA и список выделения, предоставляемый драйверу мини-порта отображения, может быть меньше, чем требуется.

Если OpenGL ICD обнаруживает, что большая часть буфера команд истекает из-за того, что драйвер выходит из пространства в буфере команд или списке выделения, драйвер может запросить их изменения. Чтобы изменить размер буфера команд, драйвер задает флаг ResizeCommandBuffer битового поля в элементе Flags D3DKMT_RENDER и помещает запрошенный размер в элемент CommandBufferSize члена D3DKMT_RENDER. Аналогичным образом, чтобы изменить размер списка выделения, драйвер задает флаг ResizeAllocationList битовое поле в элементе Flags члена D3DKMT_RENDER и помещает запрошенное количество элементов в элемент AllocationListSize элемента D3DKMT_RENDER.

Заметка

Несмотря на то, что драйвер может запросить изменение размера буфера команд и списка выделения, диспетчер памяти видео может не соответствовать. Таким образом, если вызов D3DKMTRender выполнен, драйвер должен проверить значения, возвращаемые в pCommandBuffer, CommandBufferSizeи членов AllocationListSize.
Однако если вызов D3DKMTRender завершается ошибкой, драйвер определяет, что буфер команды, список выделения или оба не были изменены. Таким образом, драйвер не должен обрабатывать значения, возвращаемые в pCommandBuffer, CommandBufferSizeи членов allocationListSize, так как они являются недопустимыми.

Примеры

В следующем примере кода показано, как openGL ICD может использовать D3DKMTRender для отрисовки примитивов 3-D.

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 (include D3dkmthk.h)
библиотеки Gdi32.lib
DLL Gdi32.dll

См. также

D3DKMTGetDeviceState

D3DKMT_RENDER