Не удается создать Direct2D DXGI Surface - PullRequest
1 голос
/ 20 декабря 2010

Я вызываю этот метод:

http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx

Сбой вызова с E_NOINTERFACE. Документация особенно бесполезна в отношении того, почему это может произойти. Я включил все средства отладки DirectX 11, и это лучшее, что я получил. Я знаю, что у меня есть действительный IDXGISurface1* (также пробовал IDXGISurface), и другие параметры установлены правильно. Любые идеи о том, почему этот звонок может не сработать?

Edit:

У меня также возникают проблемы при создании устройств D3D11. Если я передаю nullptr в качестве аргумента IDXGIAdapter * в D3D11CreateDeviceAndSwapChain, он работает нормально, но если я сам перечисляю адаптеры и передаю указатель (единственный возвращенный), он завершается неудачно с неверным аргументом. В документации MSDN прямо сказано, что если передан nullptr, то система использует первый возврат из EnumAdapters1. Я использую систему DX11.

Ответы [ 2 ]

6 голосов
/ 31 января 2012

Direct2D работает только при создании устройства Direct3D 10.1, но он может обмениваться поверхностями с Direct3D 11. Все, что вам нужно, это создать оба устройства и визуализировать весь ваш контент Direct2D в текстуру, разделить между ними. Я использую эту технику в своих собственных приложениях, чтобы использовать Direct2D с Direct3D 11. Это влечет за собой небольшие затраты, но оно мало и постоянно на кадр.

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

  1. Создайте устройство Direct3D 11, как обычно.
  2. Создайте текстуру с параметром D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX, чтобы разрешить доступ к интерфейсу ID3D11KeyedMutex.
  3. Используйте GetSharedHandle , чтобы получить указатель на текстуру, которая может использоваться несколькими устройствами.
  4. Создайте устройство Direct3D 10.1, убедившись, что оно создано на том же адаптере.
  5. Используйте функцию OpenSharedResource на устройстве Direct3D 10.1, чтобы получить версию текстуры для Direct3D 10.1.
  6. Получите доступ к интерфейсу D3D10 KeyedMutex для текстуры.
  7. Используйте версию текстуры Direct3D 10.1 для создания RenderTarget с использованием Direct2D.
  8. Если вы хотите выполнить рендеринг с D2D, используйте мьютекс с ключами, чтобы заблокировать текстуру для устройства D3D10. Затем приобретите его в D3D11 и визуализируйте текстуру, как вы, вероятно, уже пытались это сделать.

Это не тривиально, но работает хорошо, и именно так они и хотели, чтобы вы взаимодействовали между ними. Похоже, что Windows 8 представит полную совместимость с D3D11, поэтому она будет такой же простой, как вы ожидаете.

2 голосов
/ 20 декабря 2010

Direct2D использует устройства D3D10, а не устройства D3D11. Устройство D3D11, вероятно, сообщается об отсутствии интерфейса этим E_NOINTERFACE.

...