Запрос и использование памяти Surface
Драйвер отображения пользовательского режима получает вызовы своей функции CreateResource , когда среде выполнения Microsoft Direct3D требуется создать список поверхностей. Среда выполнения Direct3D задает дескриптор ресурса для списка поверхностей, которые драйвер отображения пользовательского режима использует для обратного вызова в среду выполнения. Драйвер отображения пользовательского режима создает объект ресурса для представления списка поверхностей, создает уникальный дескриптор для этого объекта и возвращает дескриптор обратно в среду выполнения Direct3D. Среда выполнения использует этот уникальный дескриптор в последующих вызовах драйвера для идентификации списка поверхностей. Среда выполнения определяет определенную поверхность, указывая индекс поверхности в массиве, содержамом в элементе pSurfListструктуры D3DDDIARG_CREATERESOURCE .
Так как драйвер отображения пользовательского режима получает определенный драйвером дескриптор ресурса в вызовах, ссылающихся на ресурс, драйверу не требуется выполнять дорогостоящий поиск дескриптора, чтобы найти определенный драйвером объект ресурса. Аналогичным образом, чтобы среда выполнения также не требовалась для выполнения подстановки дескрипторов, драйвер отображения пользовательского режима использует дескриптор ресурса, определенный средой выполнения Direct3D, когда драйвер отображения пользовательского режима вызывает обратно в среду выполнения.
Драйвер отображения пользовательского режима вызывает функцию pfnAllocateCb для выделения памяти для поверхностей. В вызове pfnAllocateCb драйвер дисплея пользовательского режима может передавать частные данные для списка поверхностей и для каждой отдельной поверхности в элементах pPrivateDriverDataD3DDDICB_ALLOCATE и D3DDDI_ALLOCATIONINFO структур соответственно. Однако драйвер отображения пользовательского режима не может получать личные данные от членов pPrivateDriverData . Драйвер отображения пользовательского режима может выделить память для этих личных данных и освободить память после возврата вызова pfnAllocateCb или использовать память стека для передачи этих частных данных. Функция pfnAllocateCb возвращает драйверу отображения пользовательского режима дескриптор каждого выделения для каждой выделенной поверхности.
Примечание Драйвер отображения пользовательского режима должен вызывать функцию pfnAllocateCb один раз для каждой общей поверхности для каждого устройства. Например, если устройство 1 создает общую поверхность, которая также используется устройствами 2, 3 и 4, устройства 2, 3 и 4 также должны вызывать pfnAllocateCb один раз для общей поверхности, чтобы получить маркер выделения.
Драйвер отображения в пользовательском режиме должен отслеживать каждую поверхность до каждого маркера выделения, как правило, путем обслуживания таблицы маркеров между поверхностными устройствами. Драйвер отображения пользовательского режима должен хранить каждый дескриптор выделения в объекте ресурса, определяемом драйвером.
Когда среда выполнения Direct3D выполняет операцию на ранее выделенной поверхности (например, при вызове функции Blt драйвера дисплея пользовательского режима), драйвер отображения пользовательского режима получает дескриптор к ресурсу, возможно, с индексом surface. Драйвер отображения пользовательского режима использует этот дескриптор ресурса для получения объекта ресурса, определенного драйвером. Драйвер получает дескриптора выделения, хранящиеся в объекте ресурса, и собирает их в буфере команд. Драйвер дисплея пользовательского режима использует маркеры выделения, соответствующие поверхностям, при вызове функции pfnRenderCb для отправки буфера команд в драйвер минипорта дисплея. Драйвер мини-порта дисплея может вызвать функцию DxgkCbGetHandleData , чтобы определить, к каким выделениям поверхностей относится драйвер дисплея в пользовательском режиме.