Каковы правила безопасности потоков 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.
Следующие два пункта от MSDN Похоже, что этот поток не только небезопасен, но и снижает возможности устройства, в то время как HDC является выдающимся.
Вы должны освободить устройство (они относятся к HDC) и вызвать метод IDXGISurface1 :: ReleaseDC, прежде чем вводить какие-либо новые команды Direct3D.
Этот метод завершается ошибкой, если этот метод уже создал выдающийся DC.
Получение HDC от DXGISurface по своей природе включает в себя родительский D3D11 DC поверхности. Многопоточный доступ к D3D11 DC также не поддерживается. Из этого MSDN страница: если несколько потоков должны обращаться к одному ID3D11DeviceContext, они должны использовать некоторый механизм синхронизации, например критические секции, для синхронизации доступа к этому ID3D11DeviceContext.
Я бы попытался подготовить чертеж GDI в отдельном потоке, как вы сказали, но визуализировать его в буфер системной памяти. Затем просто скопируйте содержимое на поверхность DXGI.
Также обратите внимание, что большинство из этих тем касаются поведения непосредственного контекста, D3D11 Отложенный контекст может иметь другое поведение.
Других решений пока нет …