Управление созданием и уничтожением ресурсов

Чтобы включить подсистему ядра графики Microsoft DirectX для правильного отслеживания времени существования ресурсов и предотвращения утечки памяти в операционной системе, драйвер отображения в пользовательском режиме должен правильно создавать и уничтожать ресурсы.

Среда выполнения Microsoft Direct3D вызывает следующие функции драйвера пользовательского режима для создания соответствующих ресурсов.

  • CreateResource создает новый разделяемый или неразделенный ресурс.

  • OpenResource открывает представление для существующего общего ресурса.

В обоих вызовах среда выполнения Direct3D передает уникальный дескриптор ресурса среды выполнения пользовательского режима, который драйвер отображения пользовательского режима использует для обратного вызова в среду выполнения. При успешном возвращении CreateResource или OpenResource драйвер отображения пользовательского режима возвращает уникальный дескриптор пользовательского режима, представляющий ресурс. Этот дескриптор — это дескриптор ресурса драйвера в пользовательском режиме. Среда выполнения использует дескриптор ресурса драйвера пользовательского режима в последующих вызовах драйвера.

Между дескриптором ресурса среды выполнения в пользовательском режиме и дескриптором ресурса драйвера в пользовательском режиме существует однозначное соответствие. Среда выполнения Direct3D и драйвер отображения в пользовательском режиме обмениваются дескрипторами ресурсов среды выполнения и драйвера через участники hResource структур D3DDDIARG_CREATERESOURCE и D3DDDIARG_OPENRESOURCE.

Когда драйвер отображения в пользовательском режиме вызывает функцию pfnAllocateCb среды выполнения Direct3D для создания выделений для ресурса пользовательского режима, драйвер должен указать дескриптор ресурса среды выполнения в режиме пользователя в элементе hResource структуры D3DDDICB_ALLOCATE , на которую указывает параметр pData . Среда выполнения Direct3D генерирует уникальный дескриптор режима ядра для ресурса и передает его обратно в драйвер отображения пользовательского режима в элементе hKMResource D3DDDICB_ALLOCATE. Драйвер отображения в пользовательском режиме может вставить дескриптор ресурса режима ядра в поток команд, чтобы драйвер минипорта мог использовать его позже.

Заметка Хотя дескриптора ресурсов в пользовательском режиме всегда уникальны для каждого создания ресурсов в пользовательском режиме, дескриптора ресурсов в режиме ядра не всегда уникальны. Когда среда выполнения Direct3D вызывает функцию OpenResource пользовательского драйвера для открытия представления к существующему общему ресурсу, среда выполнения передает дескриптор режима ядра ресурса в элементе hKMResource структуры D3DDDIARG_OPENRESOURCE, на которую указывает параметр pResource. Среда выполнения ранее создала этот дескриптор режима ядра после того, как вызвала функцию "CreateResource" дисплей-драйвера в пользовательском режиме.

Чтобы уничтожить ресурс пользовательского режима, созданный с помощью CreateResource или OpenResource, среда выполнения Direct3D передает дескриптор ресурса драйвера в пользовательском режиме в параметре hResource при вызове функции DestroyResource драйвера дисплея в пользовательском режиме. Чтобы освободить дескриптор ресурсов в режиме ядра и все выделенные ресурсы, связанные с дескриптором пользовательского режима, драйвер отображения пользовательского режима передает дескриптор ресурсов среды выполнения пользовательского режима в элементе hResource структуры D3DDDICB_DEALLOCATE, на который указывает параметр pData при вызове функции pfnDeallocateCb.

Рассмотрим следующие элементы, когда драйвер отображения в пользовательском режиме создает и уничтожает ресурсы:

  • Для выделений, создаваемых драйвером отображения пользовательского режима в ответ на общие ресурсы (т.е. в ответ на вызовы CreateResource с установленным флагом SharedResource в члене Flags структуры D3DDDIARG_CREATERESOURCE), драйвер должен назначить ненулевое значение члену hResource структуры D3DDDICB_ALLOCATE.

  • Для выделений, создаваемых драйвером отображения в пользовательском режиме в ответ на необщие ресурсы, драйверу не требуется назначать значение, отличное от NULL элементу hResource D3DDDICB_ALLOCATE. Если драйвер назначает NULL для hResource, выделения связаны с устройством, а не с конкретным ресурсом (и с дескриптором ресурса в режиме ядра). Однако если выделения действительно связаны с ресурсом, драйвер должен связать выделения с этим ресурсом. Заметка Дескриптор ресурса в режиме ядра создается только в том случае, если драйвер отображения в пользовательском режиме устанавливает член hResource из D3DDDICB_ALLOCATE на дескриптор ресурса среды выполнения пользовательского режима, который драйвер получил из члена hResource структуры D3DDDIARG_CREATERESOURCE при вызове CreateResource.

  • При вызове DestroyResource для уничтожения ресурса, не являющегося общим ресурсом пользовательского режима, драйвер отображения пользовательского режима может вызывать pfnDeallocateCb с элементом hResourceD3DDDICB_DEALLOCATE, установленным в NULL, только если драйвер никогда не связывал с ним выделения. Если драйвер пользовательского режима отображения связал выделенные ресурсы с ресурсом, он должен вызвать pfnDeallocateCb, установив элемент hResource структуры D3DDDICB_DEALLOCATE в значение, отличное от NULL; в противном случае произойдет утечка памяти.