Bug 648484, part 6: Add code to share D3D10 textures across processes. r=Bas
authorChris Jones <jones.chris.g@gmail.com>
Tue, 09 Aug 2011 12:38:26 -0700
changeset 74136 5a136975b5bcfbeeb76e4d8d11b484bc8a853b1b
parent 74135 9f8e7494989a229aa24582a27a2a33db2c2fb07e
child 74137 ea0cb7ad5364693a48bababa19a8dd163273b2fc
push id2
push userbsmedberg@mozilla.com
push dateFri, 19 Aug 2011 14:38:13 +0000
reviewersBas
bugs648484
milestone8.0a1
Bug 648484, part 6: Add code to share D3D10 textures across processes. r=Bas
gfx/layers/Makefile.in
gfx/layers/ipc/PLayers.ipdl
gfx/layers/ipc/ShadowLayerUtils.h
gfx/layers/ipc/ShadowLayerUtilsD3D10.cpp
gfx/layers/ipc/ShadowLayerUtilsD3D10.h
gfx/layers/ipc/ShadowLayers.cpp
--- a/gfx/layers/Makefile.in
+++ b/gfx/layers/Makefile.in
@@ -109,23 +109,24 @@ CPPSRCS += \
 endif
 ifdef MOZ_ENABLE_D3D10_LAYER
 EXPORTS += \
         LayerManagerD3D10.h \
         ReadbackManagerD3D10.h \
         $(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
 
 EXPORTS_NAMESPACES = IPC mozilla/layers
 EXPORTS_IPC = ShadowLayerUtils.h
 EXPORTS_mozilla/layers =\
         ShadowLayers.h \
@@ -148,16 +149,21 @@ endif #}
 
 # Enable GLES2.0 under maemo
 ifdef MOZ_X11
 ifdef MOZ_PLATFORM_MAEMO
 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
 
 CXXFLAGS += $(MOZ_CAIRO_CFLAGS) $(TK_CFLAGS)
 
 LayerManagerOGLShaders.h: LayerManagerOGLShaders.txt genshaders.py $(GLOBAL_DEPS)
 	$(PYTHON) $(srcdir)/opengl/genshaders.py $< $@
--- a/gfx/layers/ipc/PLayers.ipdl
+++ b/gfx/layers/ipc/PLayers.ipdl
@@ -49,16 +49,17 @@ using gfxRGBA;
 using nsIntPoint;
 using nsIntRect;
 using nsIntRegion;
 using nsIntSize;
 using mozilla::GraphicsFilterType;
 using mozilla::layers::FrameMetrics;
 using mozilla::layers::SurfaceDescriptorX11;
 using mozilla::null_t;
+using mozilla::WindowsHandle;
 
 /**
  * The layers protocol is spoken between thread contexts that manage
  * layer (sub)trees.  The protocol comprises atomically publishing
  * layer subtrees to a "shadow" thread context (which grafts the
  * subtree into its own tree), and atomically updating a published
  * subtree.  ("Atomic" in this sense is wrt painting.)
  */
@@ -67,23 +68,24 @@ namespace mozilla {
 namespace layers {
 
 // Create a shadow layer for |layer|
 struct OpCreateThebesLayer     { PLayer layer; };
 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;
 };
 
 struct YUVImage {
   Shmem Ydata;
   Shmem Udata;
   Shmem Vdata;
   nsIntRect picture;
@@ -96,16 +98,20 @@ union SharedImage {
 
 struct ThebesBuffer {
   SurfaceDescriptor buffer;
   nsIntRect rect;
   nsIntPoint rotation; 
 };
 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;
   nsIntRegion frontValidRegion;
 };
 struct OpDestroyThebesFrontBuffer { PLayer layer; };
 
 struct OpCreateCanvasBuffer {
--- a/gfx/layers/ipc/ShadowLayerUtils.h
+++ b/gfx/layers/ipc/ShadowLayerUtils.h
@@ -39,18 +39,22 @@
  * ***** END LICENSE BLOCK ***** */
 
 #ifndef IPC_ShadowLayerUtils_h
 #define IPC_ShadowLayerUtils_h
 
 #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 {
   bool operator==(const SurfaceDescriptorX11&) const { return false; }
 };
 } }
 #endif
 
new file mode 100644
--- /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 <jones.chris.g@gmail.com>
+ *
+ * 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 <d3d10_1.h>
+#include <dxgi.h>
+
+#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<gfxASurface>
+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<HANDLE*>(&aDescr->handle()));
+  return !!SUCCEEDED(hr);
+}
+
+already_AddRefed<ID3D10Texture2D>
+OpenForeign(ID3D10Device* aDevice, const SurfaceDescriptorD3D10& aDescr)
+{
+  HRESULT hr;
+  ID3D10Texture2D* tex = nsnull;
+  hr = aDevice->OpenSharedResource(reinterpret_cast<HANDLE>(aDescr.handle()),
+                                   __uuidof(ID3D10Texture2D),
+                                   (void**)&tex);
+  if (!SUCCEEDED(hr) || !tex)
+    return nsnull;
+
+  // XXX FIXME TODO do we need this???
+  return nsRefPtr<ID3D10Texture2D>(tex).forget();
+}
+
+} // namespace layers
+} // namespace mozilla
new file mode 100644
--- /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 <jones.chris.g@gmail.com>
+ *
+ * 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<ID3D10Texture2D>
+OpenForeign(ID3D10Device* aDevice, const SurfaceDescriptorD3D10& aDescr);
+
+} // namespace layers
+} // namespace mozilla
+
+#endif  // mozilla_layers_ShadowLayerUtilsD3D10_h
--- a/gfx/layers/ipc/ShadowLayers.cpp
+++ b/gfx/layers/ipc/ShadowLayers.cpp
@@ -44,16 +44,17 @@
 #include "gfxSharedImageSurface.h"
 
 #include "mozilla/ipc/SharedMemorySysV.h"
 #include "mozilla/layers/PLayerChild.h"
 #include "mozilla/layers/PLayersChild.h"
 #include "mozilla/layers/PLayersParent.h"
 #include "ShadowLayers.h"
 #include "ShadowLayerChild.h"
+#include "ShadowLayerUtils.h"
 
 using namespace mozilla::ipc;
 
 namespace mozilla {
 namespace layers {
 
 typedef nsTArray<SurfaceDescriptor> BufferArray; 
 typedef std::vector<Edit> EditVector;