Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: ui/gl/gl_angle_util_win.cc

Issue 2646243002: Use IDCompositionSurface to implement DirectCompositionSurfaceWin. (Closed)
Patch Set: better Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/gl/gl_angle_util_win.cc
diff --git a/ui/gl/gl_angle_util_win.cc b/ui/gl/gl_angle_util_win.cc
index 4a2b37c42523017bbca07be64ef8d7a69f541e90..58b697dafe53228bc22e7c60c5362dd75b244873 100644
--- a/ui/gl/gl_angle_util_win.cc
+++ b/ui/gl/gl_angle_util_win.cc
@@ -82,4 +82,54 @@ base::win::ScopedComPtr<IDirect3DDevice9> QueryD3D9DeviceObjectFromANGLE() {
return d3d9_device;
}
+base::win::ScopedComPtr<IDCompositionDevice2> QueryDirectCompositionDevice(
+ base::win::ScopedComPtr<ID3D11Device> d3d11_device) {
+ // Each D3D11 device will have a DirectComposition device stored in its
+ // private data under this GUID.
+ // {CF81D85A-8D30-4769-8509-B9D73898D870}
+ static const GUID kDirectCompositionGUID = {
+ 0xcf81d85a,
+ 0x8d30,
+ 0x4769,
+ {0x85, 0x9, 0xb9, 0xd7, 0x38, 0x98, 0xd8, 0x70}};
+
+ base::win::ScopedComPtr<IDCompositionDevice2> dcomp_device;
+ if (!d3d11_device)
+ return dcomp_device;
+
+ UINT data_size = sizeof(dcomp_device.get());
+ HRESULT hr = d3d11_device->GetPrivateData(kDirectCompositionGUID, &data_size,
+ dcomp_device.ReceiveVoid());
+ if (SUCCEEDED(hr) && dcomp_device)
+ return dcomp_device;
+
+ // Allocate a new DirectComposition device if none currently exists.
+ HMODULE dcomp_module = ::GetModuleHandle(L"dcomp.dll");
+ if (!dcomp_module)
+ return dcomp_device;
+
+ typedef HRESULT(WINAPI * PFN_DCOMPOSITION_CREATE_DEVICE2)(
+ IUnknown * renderingDevice, REFIID iid, void** dcompositionDevice);
+ PFN_DCOMPOSITION_CREATE_DEVICE2 create_device_function =
+ reinterpret_cast<PFN_DCOMPOSITION_CREATE_DEVICE2>(
+ ::GetProcAddress(dcomp_module, "DCompositionCreateDevice2"));
+ if (!create_device_function)
+ return dcomp_device;
+
+ base::win::ScopedComPtr<IDXGIDevice> dxgi_device;
+ d3d11_device.QueryInterface(dxgi_device.Receive());
+ base::win::ScopedComPtr<IDCompositionDesktopDevice> desktop_device;
+ hr = create_device_function(dxgi_device.get(),
+ IID_PPV_ARGS(desktop_device.Receive()));
+ if (FAILED(hr))
+ return dcomp_device;
+
+ hr = desktop_device.QueryInterface(dcomp_device.Receive());
+ CHECK(SUCCEEDED(hr));
+ d3d11_device->SetPrivateDataInterface(kDirectCompositionGUID,
+ dcomp_device.get());
+
+ return dcomp_device;
+}
+
} // namespace gl

Powered by Google App Engine
This is Rietveld 408576698