Обработка создания и уничтожения ресурсов
Чтобы подсистема ядра графики Microsoft DirectX правильно отслеживала время существования ресурсов и предотвращала утечку памяти в операционной системе, драйвер отображения пользовательского режима должен правильно создавать и уничтожать ресурсы.
Среда выполнения Microsoft Direct3D вызывает следующие функции драйвера отображения в пользовательском режиме для создания ресурсов в пользовательском режиме.
CreateResource создает новый общий или не общий ресурс.
OpenResource открывает представление существующего общего ресурса.
В обоих вызовах среда выполнения Direct3D передает уникальный дескриптор ресурса среды выполнения пользовательского режима , который драйвер отображения пользовательского режима использует для обратного вызова в среду выполнения. Если createResource или OpenResource успешно возвращается, драйвер отображения пользовательского режима возвращает уникальный дескриптор пользовательского режима, представляющий ресурс. Этот дескриптор является дескриптором ресурса драйвера пользовательского режима. Среда выполнения использует дескриптор ресурса драйвера пользовательского режима в последующих вызовах драйвера.
Между дескриптором ресурса среды выполнения в пользовательском режиме и дескриптором ресурса драйвера в пользовательском режиме существует соответствие. Среда выполнения Direct3D и драйвер отображения пользовательского режима обмениваются дескрипторами ресурсов среды выполнения и драйвера в пользовательском режиме через элементы hResourceD3DDDIARG_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 , установленным в элементе FlagsD3DDDIARG_CREATERESOURCE), драйвер должен назначить значение, отличное от NULL , элементу hResourceD3DDDICB_ALLOCATE.
Для выделений, создаваемых драйвером отображения пользовательского режима в ответ на ресурсы, не являющиеся общими, драйверу не требуется присваивать значение, отличное от NULL , члену hResource D3DDDICB_ALLOCATE. Если драйвер присваивает hResourceзначение NULL, выделения связаны с устройством, а не конкретным ресурсом (и дескриптором ресурсов в режиме ядра). Однако если выделения действительно связаны с ресурсом, драйвер должен связать их с этим ресурсом. Примечание Дескриптор ресурса режима ядра создается только в том случае, если драйвер отображения пользовательского режима задает элемент hResource D3DDDICB_ALLOCATE дескриптор ресурса среды выполнения пользователя, полученный драйвером от элемента hResourceструктуры D3DDDIARG_CREATERESOURCE в вызове CreateResource.
При вызове DestroyResource для уничтожения ресурса, не являющегося общим, драйвер отображения пользовательского режима может вызывать pfnDeallocateCb с элементом hResourceD3DDDICB_DEALLOCATE иметь значение NULL , только если драйвер никогда не связывал выделения с ресурсом. Если драйвер отображения пользовательского режима связан с выделением ресурса, драйвер должен вызвать pfnDeallocateCb с элементом hResource D3DDDICB_DEALLOCATE иметь значение, отличное от NULL ; в противном случае произойдет утечка памяти.