Browse Source

libobs-d3d11: Reset handle and re-lock if texture rebuilt

If a texture has to be rebuilt due to a driver reset and is a keyed
mutex shared texture, make sure to reacquire the shared handle and
acquire the lock.
jp9000 6 years ago
parent
commit
2f3cb1804e
1 changed files with 18 additions and 0 deletions
  1. 18 0
      libobs-d3d11/d3d11-rebuild.cpp

+ 18 - 0
libobs-d3d11/d3d11-rebuild.cpp

@@ -89,6 +89,15 @@ void gs_texture_2d::Rebuild(ID3D11Device *dev)
 		if (FAILED(hr))
 			throw HRError("Failed to create GDI surface", hr);
 	}
+
+	acquired = false;
+
+	if ((td.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0) {
+		ComQIPtr<IDXGIResource> dxgi_res(texture);
+		if (dxgi_res)
+			GetSharedHandle(dxgi_res);
+		device_texture_acquire_sync(this, 0, INFINITE);
+	}
 }
 
 void gs_texture_2d::RebuildNV12_Y(ID3D11Device *dev)
@@ -108,6 +117,15 @@ void gs_texture_2d::RebuildNV12_Y(ID3D11Device *dev)
 		InitRenderTargets();
 
 	tex_uv->RebuildNV12_UV(dev);
+
+	acquired = false;
+
+	if ((td.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0) {
+		ComQIPtr<IDXGIResource> dxgi_res(texture);
+		if (dxgi_res)
+			GetSharedHandle(dxgi_res);
+		device_texture_acquire_sync(this, 0, INFINITE);
+	}
 }
 
 void gs_texture_2d::RebuildNV12_UV(ID3D11Device *dev)