Функция 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 openGL ICD должен определить базовый адрес и размер буфера команд, который он должен использовать для следующей отправки из значений, возвращаемых в элементах pCommandBuffer и CommandBufferSizeструктуры D3DKMT_RENDER , на которую указывает параметр pData .

Для устройства, использующего гарантированный режим контракта буфера DMA (дополнительные сведения об этом режиме см. в разделе Использование модели буфера DMA с гарантированным контрактом), размер буфера DMA, доступный драйверу мини-порта дисплея для преобразования буфера команд при следующей отправке, совпадает с размером самого буфера команд. Для такого устройства OpenGL ICD также должен определять размер списка выделения, который будет доступен драйверу мини-порта для отображения во время преобразования буфера команд при следующей отправке из значения, возвращаемого в элементе AllocationListSizeD3DKMT_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 для отрисовки трехмерных примитивов.

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)
Библиотека Gdi32.lib
DLL Gdi32.dll

См. также раздел

D3DKMTGetDeviceState

D3DKMT_RENDER