IDXGISurface1 правила безопасности потоков / синхронизации для GetDC / ReleaseDC?

Каковы правила безопасности потоков IDXGISurface1 GetDC/ReleaseDC для текстур, созданных с D3D11_RESOURCE_MISC_GDI_COMPATIBLE?

Могу ли я взаимодействовать с ID3D11Device а также ID3D11DeviceContext между GetDC а также ReleaseDC в другом потоке, без гонок данных или блокировок из-за неявной синхронизации? Или я для того, чтобы на холостом ходу графический процессор вынужден создавать отдельный D3D11Device для потока, выполняющего рендеринг GDI и затем возвращающего его в «основную»D3D11Device скопировав в D3D11_RESOURCE_MISC_SHARED_KEYED_MUTEX?

то есть является ли следующее действительным?

thread 1:

D3D11Device::CreateTexture2D // Create texture 1

IDXGISurface1::GetDC // Get DC for texture 1

... // Draw to texture1 using GDI

IDXGISurtface1::ReleaseDC // Release DC for texture1

thread 2:

// Is this valid if thread 1 is drawing using GDI?

D3D11DeviceContext::OMSetRenderTargets

D3D11DeviceContext::Draw // Draw texture2.

7

Решение

Следующие два пункта от MSDN Похоже, что этот поток не только небезопасен, но и снижает возможности устройства, в то время как HDC является выдающимся.

  • Вы должны освободить устройство (они относятся к HDC) и вызвать метод IDXGISurface1 :: ReleaseDC, прежде чем вводить какие-либо новые команды Direct3D.

  • Этот метод завершается ошибкой, если этот метод уже создал выдающийся DC.

Получение HDC от DXGISurface по своей природе включает в себя родительский D3D11 DC поверхности. Многопоточный доступ к D3D11 DC также не поддерживается. Из этого MSDN страница: если несколько потоков должны обращаться к одному ID3D11DeviceContext, они должны использовать некоторый механизм синхронизации, например критические секции, для синхронизации доступа к этому ID3D11DeviceContext.

Я бы попытался подготовить чертеж GDI в отдельном потоке, как вы сказали, но визуализировать его в буфер системной памяти. Затем просто скопируйте содержимое на поверхность DXGI.

Также обратите внимание, что большинство из этих тем касаются поведения непосредственного контекста, D3D11 Отложенный контекст может иметь другое поведение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]