Функция 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 |