From d501a4a6346147d63a3896d2c364dcd4b67052c9 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Wed, 6 Jul 2011 13:29:27 -0400 Subject: [PATCH] Bug 648484, part 6: Add code to share D3D10 textures across processes. r=Bas --- gfx/layers/Makefile.in | 14 ++- gfx/layers/ipc/PLayers.ipdl | 16 ++- gfx/layers/ipc/ShadowLayerUtils.h | 6 +- gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp | 128 +++++++++++++++++++++++ gfx/layers/ipc/ShadowLayerUtilsD3D10.h | 67 ++++++++++++ gfx/layers/ipc/ShadowLayers.cpp | 1 + 6 files changed, 222 insertions(+), 10 deletions(-) create mode 100644 gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp create mode 100644 gfx/layers/ipc/ShadowLayerUtilsD3D10.h diff --git a/gfx/layers/Makefile.in b/gfx/layers/Makefile.in index 8d73b9adf5a5..fd8ce59f885c 100644 --- a/gfx/layers/Makefile.in +++ b/gfx/layers/Makefile.in @@ -114,13 +114,14 @@ EXPORTS += \ $(NULL) CPPSRCS += \ - LayerManagerD3D10.cpp \ - ThebesLayerD3D10.cpp \ + CanvasLayerD3D10.cpp \ + ColorLayerD3D10.cpp \ ContainerLayerD3D10.cpp \ ImageLayerD3D10.cpp \ - ColorLayerD3D10.cpp \ - CanvasLayerD3D10.cpp \ + LayerManagerD3D10.cpp \ ReadbackManagerD3D10.cpp \ + ShadowLayerUtilsD3D10.cpp \ + ThebesLayerD3D10.cpp \ $(NULL) endif endif @@ -153,6 +154,11 @@ DEFINES += -DUSE_GLES2 endif endif +ifdef MOZ_ENABLE_D3D10_LAYER +EXPORTS_mozilla/layers += ShadowLayerUtilsD3D10.h +DEFINES += -DMOZ_ENABLE_D3D10_LAYER +endif + include $(topsrcdir)/config/rules.mk include $(topsrcdir)/ipc/chromium/chromium-config.mk diff --git a/gfx/layers/ipc/PLayers.ipdl b/gfx/layers/ipc/PLayers.ipdl index b1e8562c06f0..24545f74e3f3 100644 --- a/gfx/layers/ipc/PLayers.ipdl +++ b/gfx/layers/ipc/PLayers.ipdl @@ -53,8 +53,9 @@ using nsIntSize; using mozilla::GraphicsFilterType; using mozilla::layers::FrameMetrics; using mozilla::layers::SurfaceDescriptorX11; -using mozilla::null_t; using mozilla::LayersBackend; +using mozilla::null_t; +using mozilla::WindowsHandle; /** * The layers protocol is spoken between thread contexts that manage @@ -73,13 +74,14 @@ struct OpCreateContainerLayer { PLayer layer; }; struct OpCreateImageLayer { PLayer layer; }; struct OpCreateColorLayer { PLayer layer; }; struct OpCreateCanvasLayer { PLayer layer; }; - -// For the "buffer creation" operations, we send an initial front -// buffer that only contains (transparent) black pixels just so that -// we can swap it back after the first OpPaint without a special case. + +struct SurfaceDescriptorD3D10 { + WindowsHandle handle; +}; union SurfaceDescriptor { Shmem; + SurfaceDescriptorD3D10; SurfaceDescriptorX11; }; @@ -102,6 +104,10 @@ struct ThebesBuffer { }; union OptionalThebesBuffer { ThebesBuffer; null_t; }; +// For the "buffer creation" operations, we send an initial front +// buffer that only contains (transparent) black pixels just so that +// we can swap it back after the first OpPaint without a special case. + struct OpCreateThebesBuffer { PLayer layer; OptionalThebesBuffer initialFront; diff --git a/gfx/layers/ipc/ShadowLayerUtils.h b/gfx/layers/ipc/ShadowLayerUtils.h index baf2eb8f4c21..1146fcf46827 100644 --- a/gfx/layers/ipc/ShadowLayerUtils.h +++ b/gfx/layers/ipc/ShadowLayerUtils.h @@ -44,8 +44,12 @@ #include "IPC/IPCMessageUtils.h" #include "Layers.h" +#if defined(MOZ_ENABLE_D3D10_LAYER) +# include "mozilla/layers/ShadowLayerUtilsD3D10.h" +#endif + #if defined(MOZ_X11) -# include "mozilla/layers/ShadowLayerUtilsX11.h" +# include "mozilla/layers/ShadowLayerUtilsX11.h" #else namespace mozilla { namespace layers { struct SurfaceDescriptorX11 { diff --git a/gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp b/gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp new file mode 100644 index 000000000000..e23e9731a14c --- /dev/null +++ b/gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp @@ -0,0 +1,128 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: sw=2 ts=8 et : + */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Code. + * + * The Initial Developer of the Original Code is + * The Mozilla Foundation + * Portions created by the Initial Developer are Copyrigght (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Chris Jones + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include + +#include "mozilla/layers/PLayers.h" +#include "ShadowLayers.h" + +namespace mozilla { +namespace layers { + +// Platform-specific shadow-layers interfaces. See ShadowLayers.h. +// D3D10 doesn't need all these yet. +PRBool +ShadowLayerForwarder::PlatformAllocDoubleBuffer(const gfxIntSize&, + gfxASurface::gfxContentType, + SurfaceDescriptor*, + SurfaceDescriptor*) +{ + return PR_FALSE; +} + +PRBool +ShadowLayerForwarder::PlatformAllocBuffer(const gfxIntSize&, + gfxASurface::gfxContentType, + SurfaceDescriptor*) +{ + return PR_FALSE; +} + +/*static*/ already_AddRefed +ShadowLayerForwarder::PlatformOpenDescriptor(const SurfaceDescriptor&) +{ + return nsnull; +} + +PRBool +ShadowLayerForwarder::PlatformDestroySharedSurface(SurfaceDescriptor*) +{ + return PR_FALSE; +} + +/*static*/ void +ShadowLayerForwarder::PlatformSyncBeforeUpdate() +{ +} + +PRBool +ShadowLayerManager::PlatformDestroySharedSurface(SurfaceDescriptor*) +{ + return PR_FALSE; +} + +/*static*/ void +ShadowLayerManager::PlatformSyncBeforeReplyUpdate() +{ +} + +bool +GetDescriptor(ID3D10Texture2D* aTexture, SurfaceDescriptorD3D10* aDescr) +{ + NS_ABORT_IF_FALSE(aTexture && aDescr, "Params must be nonnull"); + + HRESULT hr; + IDXGIResource* dr = nsnull; + hr = aTexture->QueryInterface(__uuidof(IDXGIResource), (void**)&dr); + if (!SUCCEEDED(hr) || !dr) + return false; + + hr = dr->GetSharedHandle(reinterpret_cast(&aDescr->handle())); + return !!SUCCEEDED(hr); +} + +already_AddRefed +OpenForeign(ID3D10Device* aDevice, const SurfaceDescriptorD3D10& aDescr) +{ + HRESULT hr; + ID3D10Texture2D* tex = nsnull; + hr = aDevice->OpenSharedResource(reinterpret_cast(aDescr.handle()), + __uuidof(ID3D10Texture2D), + (void**)&tex); + if (!SUCCEEDED(hr) || !tex) + return nsnull; + + // XXX FIXME TODO do we need this??? + return nsRefPtr(tex).forget(); +} + +} // namespace layers +} // namespace mozilla diff --git a/gfx/layers/ipc/ShadowLayerUtilsD3D10.h b/gfx/layers/ipc/ShadowLayerUtilsD3D10.h new file mode 100644 index 000000000000..882273edaace --- /dev/null +++ b/gfx/layers/ipc/ShadowLayerUtilsD3D10.h @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: sw=2 ts=8 et : + */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Code. + * + * The Initial Developer of the Original Code is + * The Mozilla Foundation + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Chris Jones + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef mozilla_layers_ShadowLayerUtilsD3D10_h +#define mozilla_layers_ShadowLayerUtilsD3D10_h + +#define MOZ_HAVE_PLATFORM_SPECIFIC_LAYER_BUFFERS + +struct ID3D10Device; +struct ID3D10Texture2D; + +namespace mozilla { +namespace layers { + +class SurfaceDescriptorD3D10; + +/** + * Write into |aDescr| a cross-process descriptor of |aTexture|, if + * possible. Return true iff |aDescr| was successfully set. + */ +bool +GetDescriptor(ID3D10Texture2D* aTexture, SurfaceDescriptorD3D10* aDescr); + +already_AddRefed +OpenForeign(ID3D10Device* aDevice, const SurfaceDescriptorD3D10& aDescr); + +} // namespace layers +} // namespace mozilla + +#endif // mozilla_layers_ShadowLayerUtilsD3D10_h diff --git a/gfx/layers/ipc/ShadowLayers.cpp b/gfx/layers/ipc/ShadowLayers.cpp index 63a172956beb..a7769e0b12fe 100644 --- a/gfx/layers/ipc/ShadowLayers.cpp +++ b/gfx/layers/ipc/ShadowLayers.cpp @@ -49,6 +49,7 @@ #include "mozilla/layers/PLayersParent.h" #include "ShadowLayers.h" #include "ShadowLayerChild.h" +#include "ShadowLayerUtils.h" using namespace mozilla::ipc;