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


функция обратного вызова PFND3DDDI_CREATERESOURCE2 (d3dumddi.h)

Создает ресурс. Реализовано с помощью драйверов windows Display Driver Model (WDDM) 1.2 и более поздних версий в пользовательском режиме.

Синтаксис

PFND3DDDI_CREATERESOURCE2 Pfnd3dddiCreateresource2;

HRESULT Pfnd3dddiCreateresource2(
  [in] HANDLE hDevice,
       D3DDDIARG_CREATERESOURCE2 *unnamedParam2
)
{...}

Параметры

[in] hDevice

Дескриптор устройства отображения (графический контекст), который используется для создания ресурса.

unnamedParam2

pResource2 [вход, выход]

Указатель на структуру D3DDDIARG_CREATERESOURCE2 , описывающую созданный ресурс.

Возвращаемое значение

Возвращает S_OK или соответствующий результат ошибки. Драйверы WDDM 1.3 и более поздних версий Direct3D уровня 9 должны возвращать следующий код ошибки:

Код возврата Описание
E_INVALIDARG D3DDDIARG_CREATERESOURCE2 . Flagsmember имеет значение флага CaptureBuffer, а ресурс превышает то, что может поддерживать драйвер.

Комментарии

Вызов CreateResource2 может содержать список поверхностей. Элемент SurfCountструктуры D3DDDIARG_CREATERESOURCE2 , заданной параметром pResource2 , указывает количество создаваемых поверхностей, включая уровни MIP-карты. Например, ресурс текстуры MIP-карты 256x9 содержит список из девяти поверхностей, где член SurfCount и количество уровней MIP-карты имеют значение 9. Для схемы куба, содержащей девять уровней MIP-карты, должно быть задано 9 уровней карты MIP, а для SurfCount — 54. Для цепочки буферов с тремя поверхностями surfCount должно быть задано значение 3, а для количества уровней MIP-карты — значение 0. Обратите внимание, что количество уровней MIP-карты всегда меньше или равно значению в SurfCount.

В ответ на вызов CreateResource2 драйвер отображения пользовательского режима может вызвать функцию pfnAllocateCb для создания одного или нескольких выделений памяти. Драйвер отображения пользовательского режима должен определить, должен ли он создавать несколько выделений для каждой поверхности, одно выделение для всех поверхностей или одно выделение для каждой поверхности. Дополнительные сведения о выделении ресурсов см. в разделе Управление видеопамятью и планирование GPU.

Примечание Функция CreateResource2 драйвера не требуется для вызова pfnAllocateCb перед возвратом. Вместо этого драйвер может отложить создание выделения.
 
Примечание Ресурс можно совместно использовать, только если все выделения для ресурса выполняются атомарным образом в одном вызове pfnAllocateCb.
 
Элемент hResource в структуре D3DDDIARG_CREATERESOURCE2 — это дескриптор, который используется для идентификации ресурса. Драйвер отображения пользовательского режима должен хранить значение hResource , переданное в вызове CreateResource2 , и перезаписывать его другим значением, которое среда выполнения Microsoft Direct3D может использовать при возврате вызова CreateResource2 . Другими словами, в вызовах среды выполнения драйвер отображения пользовательского режима использует значение hResource , переданное в CreateResource2; В вызовах драйвера отображения пользовательского режима (например, в вызовах функций SetTexture или SetStreamSource ) среда выполнения использует значение hResource , возвращенное из CreateResource2. Обратите внимание, что у каждой поверхности нет явного дескриптора; Если на поверхность необходимо ссылаться по отдельности (например, при вызове функции Blt ), на нее ссылается дескриптор и индекс. Индекс идентифицирует поверхность в пределах ресурса. Индекс совпадает с индексом поверхности в массиве, который содержится в элементе pSurfListD3DDDIARG_CREATERESOURCE2.

Ресурсы могут совместно использоваться несколькими устройствами (hDevice) и процессами. Среда выполнения указывает, что ресурс является общим, установив флаг битового поля SharedResource в элементе FlagsD3DDDIARG_CREATERESOURCE2. Если этот флаг битового поля установлен, драйвер отображения пользовательского режима должен соответствовать следующим ограничениям на общие ресурсы:

  • Драйвер отображения пользовательского режима может вызывать функции pfnAllocateCb и pfnDeallocateCb ровно один раз.
  • Драйвер отображения пользовательского режима не может создавать дополнительные выделения для ресурса после первоначального создания ресурса и также может уничтожить выделение ресурсов только в момент уничтожения самого ресурса.
  • Когда функция DestroyResource драйвера пользовательского отображения вызывается для общего ресурса, который был создан или открыт с помощью вызова функции CreateResource2 или OpenResource драйвера, драйвер должен задать элементу hResource структуры D3DDDICB_DEALLOCATE значение, отличное от NULL, а член NumAllocationsD3DDDICB_DEALLOCATE равным нулю в вызове функции pfnDeallocateCb , чтобы уничтожить или закрыть ресурс. То есть выделения, связанные с общим ресурсом, не могут быть уничтожены или закрыты по отдельности; ресурс должен быть уничтожен или закрыт атомарным образом в одном вызове pfnDeallocateCb.
  • Количество выделений должно быть согласованным для типа ресурса (то есть другой процесс, создающий тот же тип ресурса, должен генерировать такое же количество и тип выделений). Кроме того, переименование не допускается для этих ресурсов.
Флаги битовых полей, указанные в структуре D3DDDI_RESOURCEFLAGS2 , передаются в элементе FlagsD3DDDIARG_CREATERESOURCE2.
Примечание Ресурс можно создать без указания флагов. Поверхности, связанные с таким ресурсом, потенциально могут быть заблокированы и могут быть источником или назначением в операции передачи битового блока (bitblt). Однако такие поверхности не могут быть использованы ни для чего другого.
 
Примечание Простые поверхности отличаются от текстур или автономных целевых объектов отрисовки отсутствием флага Текстура или Основное битовое поле. Например, наличие флага основного битового поля указывает на автономный целевой объект отрисовки, а отсутствие этого флага указывает на целевой объект отрисовки, который является задним буфером.
 
Примечание Чтобы изменения среды выполнения не нарушали работу существующих драйверов, драйверы не должны использовать следующие зарезервированные элементы структуры D3DDDIARG_CREATERESOURCE2 в вызовах функции CreateResource2 , чтобы повлиять на поведение драйверов:
  • Неопределенные биты элемента Flags зарезервированы .
  • Если флаг основного битового поля не задан в разделе Флаги, элементы RefreshRate и Output зарезервированы.
  • Если флаг битового поля RenderTarget, DecodeRenderTarget или VideoProcessRenderTarget не установлен в разделе Флаги, то элементы MultisampleType и MultisampleQuality зарезервированы.
  • Если флаг битового поля VertexBuffer не задан в разделе Флаги, элемент Fvf резервируется.
  • Если флаги битовых полей Texture, CubeMap и Volume не заданы в разделе Флаги, то элемент MipLevels резервируется.
 
Дополнительные сведения о создании и уничтожении ресурсов см. в разделе Обработка создания и уничтожения ресурсов.

Для ресурса системной памяти драйвер мини-порта дисплея может выбрать оболочку выделения вокруг системной памяти, если системная память правильно выровнена для прямого доступа к графическому процессору (GPU). Драйвер мини-порта дисплея создает оболочку для выделения системной памяти, устанавливая флаг ExistingSysMem в элементе Flags структуры DXGK_ALLOCATIONINFO при создании выделения с помощью функции DxgkDdiCreateAllocation . Если драйвер мини-порта дисплея не может упаковать выделение памяти системы или происходит сбой оболочки, драйвер по-прежнему должен успешно создать ресурс и использовать ЦП для доступа к ресурсу.

Если среда выполнения запрашивает создание буфера вершин или индексов и драйвер отображения пользовательского режима не может создать буфер по причинам, кроме нехватки памяти (например, из-за отсутствия аппаратной поддержки), драйвер должен завершиться сбоем с D3DERR_NOTAVAILABLE.

Требования

Требование Значение
Минимальная версия клиента Windows 8
Минимальная версия сервера Windows Server 2012
Целевая платформа Персональный компьютер
Верхняя часть d3dumddi.h (включая D3dumddi.h)

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

Blt

D3DDDIARG_CREATERESOURCE2

D3DDDI_RESOURCEFLAGS2

DXGK_ALLOCATIONINFO

DxgkDdiCreateAllocation

SetStreamSource

SetTexture

pfnAllocateCb

pfnDeallocateCb