Метод ID3D11Device::OpenSharedResource (d3d11.h)

Предоставьте устройству доступ к общему ресурсу, созданному на другом устройстве.

Синтаксис

HRESULT OpenSharedResource(
  [in]            HANDLE hResource,
  [in]            REFIID ReturnedInterface,
  [out, optional] void   **ppResource
);

Параметры

[in] hResource

Тип: HANDLE

Дескриптор ресурса. См. примечания.

[in] ReturnedInterface

Тип: REFIID

Глобальный уникальный идентификатор (GUID) для интерфейса ресурса. См. примечания.

[out, optional] ppResource

Тип: void**

Адрес указателя на ресурс, к который мы получаем доступ.

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

Тип: HRESULT

Этот метод возвращает один из следующих кодов возврата Direct3D 11.

Комментарии

Идентификатор REFIID или GUID интерфейса ресурса можно получить с помощью макроса __uuidof(). Например, __uuidof(ID3D11Buffer) получит GUID интерфейса к ресурсу буфера.

Уникальный дескриптор ресурса получается по-разному в зависимости от типа устройства, которое изначально создало ресурс.

Для совместного использования ресурса между двумя устройствами Direct3D 11 ресурс должен быть создан с флагом D3D11_RESOURCE_MISC_SHARED , если он был создан с помощью интерфейса ID3D11Device. Если он был создан с помощью интерфейса устройства DXGI, ресурс всегда является общим.

Идентификатор REFIID или GUID интерфейса ресурса можно получить с помощью макроса __uuidof(). Например, __uuidof(ID3D11Buffer) получит GUID интерфейса к ресурсу буфера.

При совместном использовании ресурса между двумя устройствами Direct3D 10/11 уникальный дескриптор ресурса можно получить, запросив к ресурсу интерфейс IDXGIResource и вызвав Метод GetSharedHandle.


IDXGIResource* pOtherResource(NULL);
hr = pOtherDeviceResource->QueryInterface( __uuidof(IDXGIResource), (void**)&pOtherResource );
HANDLE sharedHandle;
pOtherResource->GetSharedHandle(&sharedHandle);
      

Единственными ресурсами, которые можно совместно использовать, являются двухd-текстуры без mipmapped.

Для совместного использования ресурса между устройством Direct3D 9 и устройством Direct3D 11 текстура должна быть создана с помощью аргумента pSharedHandlecreateTexture.
Затем общий дескриптор Direct3D 9 передается в OpenSharedResource в аргументе hResource .

В следующем коде показаны задействованные вызовы методов.


sharedHandle = NULL; // must be set to NULL to create, can use a valid handle here to open in D3D9 
pDevice9->CreateTexture(..., pTex2D_9, &sharedHandle); 
... 
pDevice11->OpenSharedResource(sharedHandle, __uuidof(ID3D11Resource), (void**)(&tempResource11)); 
tempResource11->QueryInterface(__uuidof(ID3D11Texture2D), (void**)(&pTex2D_11)); 
tempResource11->Release(); 
// now use pTex2D_11 with pDevice11   
      

К текстурам, совместно используемым из D3D9 в D3D11, действуют следующие ограничения.

  • Текстуры должны быть двухd
  • Допускается только 1 MIP-уровень
  • Использование текстуры должно быть по умолчанию
  • Текстура должна быть только для записи
  • Текстуры MSAA не разрешены
  • Флаги привязки должны иметь SHADER_RESOURCE и RENDER_TARGET
  • Разрешены только форматы R10G10B10A2_UNORM, R16G16B16A16_FLOAT и R8G8B8A8_UNORM
Если общая текстура обновляется на одном устройстве, необходимо вызвать ID3D11DeviceContext::Flush на этом устройстве.

Требования

   
Целевая платформа Windows
Header d3d11.h
Библиотека D3D11.lib

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

ID3D11Device