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


Запрос и использование памяти Surface

Драйвер отображения пользовательского режима получает вызовы функции CreateResource , когда среда выполнения Microsoft Direct3D требует создания списка поверхностей. Среда выполнения Direct3D указывает дескриптор ресурсов для списка поверхностей, используемых драйвером отображения пользовательского режима для обратного вызова в среду выполнения. Драйвер отображения пользовательского режима создает объект ресурса для представления списка поверхностей, создает уникальный дескриптор для этого объекта и возвращает дескриптор обратно в среду выполнения Direct3D. Среда выполнения использует этот уникальный дескриптор в последующих вызовах драйвера для идентификации списка поверхностей. Среда выполнения определяет определенную поверхность путем указания индекса поверхности в массиве, содержащегося в элементе pSurfList структуры D3DDDIARG_CREATERESOURCE .

Поскольку драйвер отображения в пользовательском режиме получает определяемый драйвером дескриптор ресурса в вызовах, ссылающихся на ресурс, драйверу не требуется выполнять дорогостоящие операции поиска, чтобы найти ресурс, определенный драйвером. Аналогичным образом, чтобы среда выполнения также не требовалась для поиска дескриптора, драйвер отображения в пользовательском режиме использует дескриптор ресурсов, определяемый средой выполнения Direct3D, когда драйвер отображения в пользовательском режиме вызывается обратно в среду выполнения.

Драйвер отображения в пользовательском режиме вызывает функцию pfnAllocateCb , чтобы выделить память для поверхностей. В вызове pfnAllocateCb драйвер отображения в пользовательском режиме может передавать частные данные как для списка поверхностей, так и для каждой отдельной поверхности, через члены pPrivateDriverData структур D3DDDICB_ALLOCATE и D3DDDI_ALLOCATIONINFO соответственно. Однако драйвер отображения в пользовательском режиме не может получать частные данные от членов pPrivateDriverData . Драйвер отображения в пользовательском режиме может выделить память для этих частных данных и может освободить память после возврата вызова pfnAllocateCb или использовать память стека для передачи этих частных данных. Функция pfnAllocateCb возвращает драйверу отображения пользовательского режима идентификатор для каждого выделения каждой выделенной поверхности.

Заметка Драйвер отображения в пользовательском режиме должен вызывать функцию pfnAllocateCb один раз для каждой общей поверхности для каждого устройства. Например, если устройство 1 создает общую поверхность, которая также используется устройствами 2, 3 и 4, то устройства 2, 3 и 4 также должны вызывать pfnAllocateCb один раз для общей поверхности, чтобы получить дескриптор выделения.

Драйвер отображения в пользовательском режиме должен отслеживать соответствие каждой поверхности каждому дескриптору выделения, обычно поддерживая таблицу сопоставления поверхностей и дескрипторов выделения. Драйвер отображения в пользовательском режиме должен хранить каждый дескриптор выделения в объекте ресурса, определяемом драйвером.

Когда среда выполнения Direct3D выполняет операцию на ранее выделенной поверхности (например, при вызове функции Blt драйвера отображения в пользовательском режиме), драйвер отображения пользовательского режима получает дескриптор к ресурсу, возможно, с индексом поверхности. Драйвер отображения пользовательского режима использует этот дескриптор ресурсов для получения объекта ресурса, определенного драйвером. Драйвер получает дескрипторы распределения, которые хранятся в объекте ресурса, и собирает их в командном буфере. Драйвер отображения в пользовательском режиме использует дескрипторы выделения, соответствующие поверхностям, при вызове функции pfnRenderCb для отправки буфера команд в драйвер минипорта отображения. Драйвер мини-порта дисплея может вызывать функцию DxgkCbGetHandleData , чтобы определить, к каким поверхностям относится драйвер отображения в пользовательском режиме.