функция обратного вызова DXGKDDI_PRESENT (d3dkmddi.h)
Функция DxgkDdiPresent копирует содержимое из исходных выделений на основную поверхность (а иногда и на выделение памяти вне экрана).
Синтаксис
DXGKDDI_PRESENT DxgkddiPresent;
NTSTATUS DxgkddiPresent(
[in] IN_CONST_HANDLE hContext,
[in/out] INOUT_PDXGKARG_PRESENT pPresent
)
{...}
Параметры
[in] hContext
Дескриптор контекста устройства для сведений о копировании. Функция DxgkDdiCreateContext драйвера miniport для отображения ранее возвращала этот дескриптор в элементе hContextструктуры DXGKARG_CREATECONTEXT , на которую указывает параметр pCreateContextобъекта DxgkDdiCreateContext .
Если драйвер не поддерживает создание контекста, подсистема ядра графики Microsoft DirectX заменяет дескриптор контекста дескриптором для устройства. Функция DxgkDdiCreateDevice драйвера дисплея miniport ранее возвращала дескриптор устройства в элементе hDeviceструктуры DXGKARG_CREATEDEVICE , на которую указывает параметр pCreateDeviceобъекта DxgkDdiCreateDevice .
[in/out] pPresent
Указатель на структуру DXGKARG_PRESENT , содержащую сведения об операции копирования.
Возвращаемое значение
DxgkDdiPresent возвращает одно из следующих значений:
Код возврата | Описание |
---|---|
STATUS_SUCCESS | DxgkDdiPresent успешно скопировал содержимое. |
STATUS_NO_MEMORY или STATUS_INSUFFICIENT_RESOURCES | DxgkDdiPresent не удалось выделить память, необходимую для ее завершения. |
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER | Текущий буфер прямого доступа к памяти (DMA) исчерпан. |
STATUS_GRAPHICS_CANNOTCOLORCONVERT | Драйвер мини-порта дисплея обнаружил передачу битового блока (bitblt) для преобразования цвета, которое устройство не может выполнить. Среда выполнения Microsoft Direct3D не позволяет продолжить работу приложения, и приложение получает сбой при копировании содержимого. |
STATUS_PRIVILEGED_INSTRUCTION | DxgkDdiPresent обнаружил непривилегированные инструкции (т. е. инструкции, которые обращаются к памяти за пределами привилегий текущего процесса центрального процессора [ЦП]). |
STATUS_ILLEGAL_INSTRUCTION | DxgkDdiPresent обнаружил инструкции, которые не поддерживаются графическим оборудованием. |
STATUS_INVALID_HANDLE | DxgkDdiPresent обнаружил недопустимый дескриптор в буфере команд. |
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | Драйвер мини-порта дисплея обнаружил ошибку в потоке DMA. Если драйвер возвращает этот код ошибки, устройство графического контекста помещается в потерянное состояние. |
Комментарии
Подсистема ядра графики DirectX вызывает функцию DxgkDdiPresent драйвера мини-порта дисплея для копирования содержимого из исходных выделений, как правило, на основную поверхность. (Эта функция также может копировать содержимое при выделении памяти системы вне экрана.) Так как основная поверхность определена слабо, DxgkDdiPresent можно реализовать в следующих сценариях:
- В зависимости от положения окна функция DxgkDdiPresent должна выполняться в разных источниках, которые могут находиться на одном адаптере или в разных адаптерах.
- Основной объект находится на удаленном мониторе и получает доступ через клиент служб терминалов или Microsoft NetMeeting.
- Недавно произошло переключение режима, и основной формат отличается от исходного, поэтому требуется преобразование цвета. Кроме того, операция DxgkDdiPresent может быть обрезана из-за обрезки окон и упорядочивания.
Драйвер мини-порта дисплея не обязан учитывать особенности предыдущих сценариев, если драйвер поддерживает следующие абстракции:
- В операции копирования из источника видеопамячи в основное место назначения видео или системной памяти, копии из источника памяти системы вне экрана в основное назначение, копии из и в основной или копии из основного источника в место назначения внеэкранной системной памяти источник задается элементом hDeviceSpecificAllocation элемента массива pAllocationList[DXGK_PRESENT_SOURCE_INDEX] структуры DXGKARG_PRESENT , что pPresent параметр DxgkDdiPresent указывает на . Назначение, являющееся текущим основным элементом устройства или выделением памяти вне экрана системы, определяется элементом hDeviceSpecificAllocation элемента массива pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] DXGKARG_PRESENT. Если назначение равно источнику (то есть destination == source), операция копирования представляет собой передачу битовых блоков с экрана на экран (bitblt). Таким образом, графическая подсистема задает для источника и назначения следующие значения:
- destination != NULL (то есть destination == nonNULL)
- source != NULL (то есть source == nonNULL)
- При перемещении видеопамяти с текущего выделения на другое выделение источник может быть указан операционной системой и задан в элементе hDeviceSpecificAllocation элемента массива pAllocationList[DXGK_PRESENT_SOURCE_INDEX] DXGKARG_PRESENT. Графическая подсистема задает для источника и назначения следующие значения:
- destination == NULL
- source != NULL (то есть source == nonNULL)
Примечание Перевернуть без операции можно из того же исходного выделения, что и отсканированное выделение. Флип без операции используется для вставки в очередь ожидания вертикального пробела в потоке отрисовки. Драйвер мини-порта дисплея должен вставить аппаратную команду flip, как если бы она переворачивалась к другому выделению. - В операции заливки цвета на основную поверхность выделение источника не требуется, а назначение является основным дескриптором выделения, который задается элементом hDeviceSpecificAllocation элемента массива pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] DXGKARG_PRESENT. Элемент Color DXGKARG_PRESENT обычно имеет формат D3DDDIFMT_A8R8G8B8 из типа перечисления D3DDDIFORMAT . Однако если основным форматом является палетизированный RGB, цвет содержит индекс палитры. Таким образом, графическая подсистема задает для источника и назначения следующие значения:
- destination != NULL (то есть destination == nonNULL)
- source == NULL
Затем графическая подсистема получает новый буфер DMA и снова вызывает функцию DxgkDdiPresent драйвера с тем же списком структур RECT, что и предыдущий вызов DxgkDdiPresent . Драйвер должен использовать элемент MultipassOffsetструктуры DXGKARG_PRESENT , на которую указывает pPresent , для записи хода выполнения списка RECT в предыдущем вызове DxgkDdiPresent , чтобы драйвер мог продолжить работу с того места, где он остановился с новым буфером DMA. Когда функция DxgkDdiPresent драйвера завершает список структур RECT, она возвращает STATUS_SUCCESS.
Помимо создания буфера DMA, драйвер мини-порта дисплея должен создать список расположений исправлений, указывающий различные смещения в буфере DMA, которые необходимо исправить позже, когда физические адреса для выделения будут известны. Иногда диспетчер видеопамять предоставляет драйверу предварительно исправленные сведения (т. е. последние известные физические адреса источника и назначения) в списке выделения.
Когда диспетчер видеопамяти предоставляет эти сведения, драйвер должен создать буфер DMA, определив, что эти физические адреса являются конечными адресами, которые будет предоставлять подсистема графического ядра DirectX. Графическая подсистема может не вызывать функцию DxgkDdiPatch в буфере DMA, чтобы исправить ее позже. Поэтому драйвер должен использовать сведения о предварительном исправлении для правильного создания буфера DMA. Предварительно исправленные сведения предоставляются для элемента N , если элемент SegmentIdN-гоэлемента массива pAllocationListDXGKARG_PRESENT не равен нулю.
Основное выделение источника указывается в функции DxgkDdiCommitVidPn . Если из заданного источника (режим клонирования) исходит несколько путей, драйвер мини-порта дисплея должен убедиться, что выходные данные правильно поворачиваются в соответствии с режимом поворота пути для различных целевых объектов. Все параметры, предоставляемые DxgkDdiPresent , не зависят от поворота. Исходный и целевой прямоугольники могут быть весь экран по мере его восприятия клиентами (например, 768 x 1024).
DxgkDdiPresent должен быть доступным для страниц.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista |
Целевая платформа | Персональный компьютер |
Верхняя часть | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |
См. также раздел
DXGKARG_PRESENT