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 74134 5a136975b5bcfbeeb76e4d8d11b484bc8a853b1b
parent 74133 9f8e7494989a229aa24582a27a2a33db2c2fb07e
child 74135 ea0cb7ad5364693a48bababa19a8dd163273b2fc
push id20955
push usereakhgari@mozilla.com
push dateWed, 10 Aug 2011 14:22:13 +0000
treeherdermozilla-central@93328efd3d77 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersBas
bugs648484
milestone8.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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;