структура DXGI_DDI_BASE_FUNCTIONS (dxgiddi.h)
Структура DXGI_DDI_BASE_FUNCTIONS содержит функции, которые драйвер отображения пользовательского режима может реализовать для выполнения низкоуровневых задач, таких как отображение отрисованных кадров на выходе, управление гаммой и управление полноэкранным переходом.
Синтаксис
typedef struct DXGI_DDI_BASE_FUNCTIONS {
HRESULT()(DXGI_DDI_ARG_PRESENT *) * pfnPresent;
HRESULT()(DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS *) * pfnGetGammaCaps;
HRESULT()(DXGI_DDI_ARG_SETDISPLAYMODE *) * pfnSetDisplayMode;
HRESULT()(DXGI_DDI_ARG_SETRESOURCEPRIORITY *) * pfnSetResourcePriority;
HRESULT()(DXGI_DDI_ARG_QUERYRESOURCERESIDENCY *) * pfnQueryResourceResidency;
HRESULT()(DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES *) * pfnRotateResourceIdentities;
HRESULT()(DXGI_DDI_ARG_BLT *) * pfnBlt;
} DXGI_DDI_BASE_FUNCTIONS;
Члены
pfnPresent
Указатель на функцию PresentDXGI , которая уведомляет драйвер отображения пользовательского режима о том, что приложение завершило отрисовку, и запрашивает отображение драйвера на целевую поверхность.
Элемент hDeviceструктуры DXGI_DDI_ARG_PRESENT , на которую указывает параметр pPresentData , является тем же дескриптором, что и функция CreateDevice(D3D10) драйвера, переданная обратно в среду выполнения в элементе hDrvDeviceструктуры D3D10DDIARG_CREATEDEVICE . Поэтому средства записи драйверов должны тщательно определять тип этого дескриптора. Кроме того, драйверы могут предоставлять различные реализации функции PresentDXGI в зависимости от того, какая реализация DDI обработала вызов CreateDevice(D3D10). Среда выполнения никогда не будет смешивать дескрипторы драйверов в реализациях DDI. Аналогичным образом элементы hSurfaceToPresent и hDstResourceDXGI_DDI_ARG_PRESENT также являются дескрипторами ресурсов, определяемыми драйвером, которые драйвер возвращал в среду выполнения при предыдущих вызовах функции CreateResource(D3D10) драйвера.
Элемент pDXGIContextDXGI_DDI_ARG_PRESENT является непрозрачным механизмом связи. Среда выполнения передает этот контекст DXGI драйверу. Драйвер должен скопировать этот контекст DXGI без изменений в элемент pDXGIContextструктуры DXGIDDICB_PRESENT , когда драйвер вызывает функцию pfnPresentCbDXGI .
Драйвер должен отправить все частично созданные данные отрисовки (буферы команд) с помощью функции pfnRenderCb . После этого драйвер должен преобразовать параметры дескриптора ресурса в дескриптор ядра и использовать эти дескрипторы ядра в вызове pfnPresentCbDXGI.
Примечание
Когда функция PresentDXGI драйвера копирует содержимое в формате sRGB из исходной поверхности на конечную поверхность, не связанную с sRGB, драйвер должен скопировать содержимое sRGB без изменений (то есть драйвер не должен выполнять sRGB в линейное преобразование).
pPresentData
[in] Указатель на структуру DXGI_DDI_ARG_PRESENT , описывающую способ отображения в области назначения.
pfnGetGammaCaps
Функция GetGammaCapsDXGI извлекает гамма-возможности.
pGammaData
[in] Указатель на DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS структуру, содержащую гамма-возможности.
pfnSetDisplayMode
Указатель на функцию SetDisplayModeDXGI драйвера.
pfnSetResourcePriority
Функция SetResourcePriorityDXGI задает приоритет вытеснения из памяти для ресурса.
Среда выполнения Microsoft Direct3D вызывает SetResourcePriorityDXGI , чтобы задать уровень приоритета для ресурса. Драйвер отображения пользовательского режима должен преобразовать дескриптор ресурса, предоставленный в элементе hResource структуры DXGI_DDI_ARG_SETRESOURCEPRIORITY, на которую указывает pPriorityData , в дескриптор выделения. После того как драйвер выполняет это преобразование, драйвер должен передать результирующий дескриптор в вызове функции pfnSetPriorityCb .
pPriorityData
[in] Указатель на структуру DXGI_DDI_ARG_SETRESOURCEPRIORITY , описывающую уровень приоритета, на который устанавливается ресурс.
pfnQueryResourceResidency
Эта функция определяет место расположения заданного списка ресурсов.
Среда выполнения Microsoft Direct3D вызывает функцию QueryResourceResidencyDXGI драйвера отображения пользовательского режима для приложений, чтобы определить, будет ли операционная система существенно зависать во время рисования, если система должна сделать ресурсы доступными для GPU. Сведения, возвращаемые из QueryResourceResidencyDXGI , являются приближенными к месту расположения ресурсов, так как ресурсы могут быть понижены до того, как приложения используют ресурсы.
QueryResourceResidencyDXGI должен вызывать функцию pfnQueryResidencyCb . pfnQueryResidencyCb возвращает состояние расположения ресурса в элементах массива, заданного членом pResidencyStatusструктуры D3DDDICB_QUERYRESIDENCY . Если pfnQueryResidencyCb возвращает D3DDDI_RESIDENCYSTATUS_NOTRESIDENT для любого запроса, QueryResourceResidencyDXGI должен возвращать S_NOT_RESIDENT. Если pfnQueryResidencyCb возвращает D3DDDI_RESIDENCYSTATUS_RESIDENTINSHAREDMEMORY для любого запроса и не возвращает D3DDDI_RESIDENCYSTATUS_NOTRESIDENT для любого запроса, QueryResourceResidencyDXGI должен возвращать S_RESIDENT_IN_SHARED_MEMORY. QueryResourceResidencyDXGI должен возвращать S_OK, только если все вызовы pfnQueryResidencyCb для всех запросов возвращают D3DDDI_RESIDENCYSTATUS_RESIDENTINGPUMEMORY.
Для каждого ресурса, запрашиваемого средой выполнения посредством вызова QueryResourceResidencyDXGI, драйвер отображения пользовательского режима должен определить, какие выделения, принадлежащие ресурсу, будут запрашиваться с помощью вызова pfnQueryResidencyCb. Для ресурса, которому принадлежит одно выделение, определение является простым — драйвер будет запрашивать это выделение. Однако если ресурс владеет несколькими выделениями, определение будет сложнее. Драйвер должен определить, какие выделения приложение, скорее всего, будет использовать для отрисовки, а драйвер должен запрашивать только эти выделения. Например, если ресурсу принадлежит выделение, используемое для отрисовки, и временное выделение, которое обрабатывает операцию блокировки, драйвер должен запрашивать только место расположения первого выделения, так как приложение, скорее всего, не будет использовать второе выделение для отрисовки.
Примечание
Так как среда выполнения не поддерживает запросы к месту расположения ресурсов системной памяти, среда выполнения всегда будет завершать запросы от приложений о состоянии расположения ресурсов системной памяти и никогда не будет вызывать функцию QueryResourceResidencyDXGI драйвера отображения пользовательского режима для этих ресурсов системной памяти.
pResidencyData
[in] Указатель на структуру DXGI_DDI_ARG_QUERYRESOURCERESIDENCY , описывающую список ресурсов, в котором проверяется место расположения.
pfnRotateResourceIdentities
Поворачивает список ресурсов.
Функция RotateResourceIdentitiesDXGI должна обмениваться удостоверениями массива ресурсов, передаваемых в элементе pResourcesструктуры DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES , на которую указывает параметр pRotateData . Например, если массив ресурсов ссылается на ресурсы X, Y и Z, при увеличении порядка индекса массива , RotateResourceIdentitiesDXGI должен повернуть эти дескрипторы, чтобы ссылаться на Y, Z и X, при увеличении порядка индекса массива. В частности, драйвер отображения пользовательского режима должен менять дескриптор ядра соответствующих ресурсов. Однако драйвер не должен переключать соответствующие дескрипторы среды выполнения (RT). Среда выполнения вызывает Метод RotateResourceIdentitiesDXGI для поворота буферов обратно во время презентации. Поэтому вызов Метода RotateResourceIdentitiesDXGI выполняется редко. Среда выполнения может указать флаг D3D10_DDI_BIND_PRESENT в элементе BindFlags структуры D3D10DDIARG_CREATERESOURCE , когда среда выполнения вызывает функцию CreateResource(D3D10) драйвера, чтобы указать, что ресурс может участвовать в операции ротации.
Драйвер отображения пользовательского режима также должен обрабатывать другие аспекты обмена удостоверениями. Например, в Direct3D версии 10 представления могут ссылаться на ресурсы; и в таких представлениях могут быть внедрены адреса ресурсов. Поэтому драйвер должен повторно создать такие представления. Кроме того, драйвер может потребоваться для повторного приложения текущих привязанных представлений.
Начиная с Windows 8 драйвер должен поддерживать вращение буферов обратной стереосистемы.
pRotateData
[in] Указатель на структуру DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES , описывающую список ресурсов для поворота.
pfnBlt
Копирует содержимое исходной поверхности в целевую область и может поворачивать содержимое.
Среда выполнения Direct3D может задать элемент Flagsструктуры DXGI_DDI_ARG_BLT , на которую указывает параметр pBltData , таким образом, чтобы функция BltDXGI выполняла операцию передачи битовых блоков (bitblt), которая разрешает ресурсы с несколькими выборками, выполняет преобразование цветового формата и выполняет растяжение или сжатие всех одновременно. Однако среда выполнения Direct3D никогда не устанавливает для элемента FlagsDXGI_DDI_ARG_BLT значение 0 (т. е. флаги не заданы) вместе со значением DXGI_DDI_MODE_ROTATION_IDENTITY , заданным в элементе RotateDXGI_DDI_ARG_BLT (т. е. для указания отсутствия поворота) для выполнения операции копирования непосредственной памяти. Вместо этого, если оба ресурса не являются несколькими выборки, среда выполнения Direct3D вызывает функцию ResourceCopy или ResourceCopyRegion драйвера для выполнения операции копирования непосредственной памяти.
Качество растяжения или сжатия, выполняемого драйвером отображения в пользовательском режиме, должно быть таким же, как и растяжение или сжатие, выполняемое билинейным фильтром.
Среда выполнения Direct3D будет вызывать функцию BltDXGI драйвера нечасто. То есть среда выполнения должна вызывать BltDXGI не более одного или двух раз на кадр, так как среда выполнения использует BltDXGI в основном для поддержки презентации.
Когда среда выполнения вызывает BltDXGI для презентации, среда выполнения устанавливает флаг битового поля Present в элементе FlagsDXGI_DDI_ARG_BLT. Среда выполнения устанавливает флаг битового поля Present , чтобы сообщить драйверу о том, что существуют дополнительные требования к bitblt и что может потребоваться дополнительная синхронизация (например, среде выполнения может потребоваться выполнить дополнительную синхронизацию в конфигурациях компьютеров, содержащих два графических адаптера, каждый из которых обрабатывает отдельные части дисплея). Если установлен флаг Битовое поле Present , драйвер должен выполнить операцию копирования из задних буферов приложения в общую поверхность DWM. Так как синхронизация для этого типа операции копирования является неточным, разрыв артефактов должен быть наихудшим типом артефактов, с которыми сталкиваются пользователи. Для этого типа операций копирования драйвер не должен использовать многопрохожий подход, сначала разрешая в области назначения, а затем преобразуя результаты на месте, так как возможные артефакты будут гораздо хуже.
Если драйвер поддерживает возврат DXGI_DDI_ERR_UNSUPPORTED во время создания основной поверхности (то есть возвращает DXGI_DDI_ERR_UNSUPPORTED из вызова функции CreateResource(D3D10) с флагом D3D10_DDI_BIND_PRESENT , установленным в элементе BindFlagsD3D10DDIARG_CREATERESOURCE вместе с элементом pPrimaryDescD3D10DDIARG_CREATERESOURCE Для параметра задано значение, отличное от NULL), драйвер также должен поддерживать поворот во время операции копирования. Если драйвер никогда не возвращает DXGI_DDI_ERR_UNSUPPORTED из вызова функции CreateResource(D3D10), среда выполнения никогда не передает значение DXGI_DDI_MODE_ROTATION_ROTATE90, DXGI_DDI_MODE_ROTATION_ROTATE180 или DXGI_DDI_MODE_ROTATION_ROTATE270 в элемент RotateDXGI_DDI_ARG_BLT. Поэтому в этой ситуации функция BltDXGI драйвера не требуется для поддержки поворота.
Среда выполнения задает значение в элементе RotateDXGI_DDI_ARG_BLT , чтобы указать количество градусов для поворота содержимого источника против часовой стрелки, прежде чем драйвер скопирует содержимое в место назначения. Поворот задается с шагом 90 градусов.
Примечание
Когда функция BltDXGI драйвера копирует содержимое в формате sRGB из исходной поверхности на конечную поверхность, не связанную с sRGB, драйвер должен скопировать содержимое sRGB без изменений (то есть драйвер не должен выполнять sRGB в линейное преобразование).
Ограничения источника
Функция BltDXGI всегда использует для выполнения операции bitblt весь исходный подресурс (по сравнению с частью прямоугольной области). Кроме того, источник является D3D10DDIRESOURCE_TEXTURE2D представлением (указывается в элементе ResourceDimensionD3D10DDIARG_CREATERESOURCE при создании источника в вызове функции CreateResource(D3D10) драйвера отображения пользовательского режима). Когда среда выполнения задает битовое поле Resolve в элементе FlagsDXGI_DDI_ARG_BLT, источником является ресурс с несколькими выборками. Исходный ресурс ограничен ресурсом, в котором флаг D3D10_DDI_BIND_PRESENT установлен в элементе BindFlagsD3D10DDIARG_CREATERESOURCE. Формат источника (указанный в элементе FormatD3D10DDIARG_CREATERESOURCE) ограничен форматами режима отображения, заданными следующими значениями из перечисления DXGI_FORMAT :
- DXGI_FORMAT_B5G6R5_UNORM
- DXGI_FORMAT_B5G5R5A1_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM (см. примечание ниже).
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
Примечание
Если драйвер поддерживает исходный формат DXGI_FORMAT_B8G8R8A8_UNORM, применяются следующие ограничения:
- Когда драйвер выполняет операцию bitblt из формата с плавающей запятой в целочисленный формат, например BGRA8888, он должен неявно кодировать гамма в результатах.
- И наоборот, когда драйвер выполняет операцию bitblt из целочисленного формата в формат с плавающей запятой, он должен неявно удалить гамма-кодировку из результатов.
Ограничения назначения
Назначение также является D3D10DDIRESOURCE_TEXTURE2D представлением. Формат назначения также ограничен форматами режима отображения. Целевой ресурс ограничен ресурсом, который привязан как целевой объект отрисовки (D3D10_DDI_BIND_RENDER_TARGET задан в элементе BindFlagsD3D10DDIARG_CREATERESOURCE или D3D11DDIARG_CREATERESOURCE).
Создание обратного стерео буфера
Начиная с Windows 8, если драйвер должен создать обратный буфер стереосистемы, он должен задать элементы структуры D3D10DDIARG_CREATERESOURCE или D3D11DDIARG_CREATERESOURCE соответственно, на которые указывает параметр pCreateResource функций CreateResource(D3D10) или CreateResource(D3D11) следующим образом:
- Задайте для элемента ArraySize значение 2.
- Задайте значение флага D3D10_DDI_BIND_PRESENT в элементе BindFlags .
Кроме того, для поддержки стереопрезентации функция BltDXGI должна разрешать любые значения для элементов DstSubresource и SrcSubresourceструктуры DXGI_DDI_ARG_BLT , которые находятся в диапазоне исходных и целевых ресурсов.
pBltData
[in] Указатель на структуру DXGI_DDI_ARG_BLT , описывающую параметры передачи битовых блоков (bitblt).
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista |
Верхняя часть | dxgiddi.h (включая D3d10umddi.h) |