Bug 570294, part d: IPC protocol for Layers. r=jrmuizel sr=vlad
authorChris Jones <jones.chris.g@gmail.com>
Wed, 21 Jul 2010 16:17:33 -0500
changeset 48137 e6299aaa482e4231d8c6ce214efe04b8cdff2440
parent 48136 f3ee7f068902cfcd619766029fc92e6736ea82b4
child 48138 8912027ef25c8e3eae8dff8a359bd44c02e8eed5
push idunknown
push userunknown
push dateunknown
reviewersjrmuizel, vlad
bugs570294
milestone2.0b3pre
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 570294, part d: IPC protocol for Layers. r=jrmuizel sr=vlad
gfx/layers/ipc/PLayer.ipdl
gfx/layers/ipc/PLayers.ipdl
gfx/layers/ipc/ipdl.mk
ipc/ipdl/Makefile.in
new file mode 100644
--- /dev/null
+++ b/gfx/layers/ipc/PLayer.ipdl
@@ -0,0 +1,72 @@
+/* -*- 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) 2010
+ * 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 protocol PLayers;
+
+namespace mozilla {
+namespace layers {
+
+/**
+ * PLayer represents a layer shared across thread contexts.
+ */
+
+sync protocol PLayer {
+    manager PLayers;
+
+    /**
+     * OWNERSHIP MODEL
+     *
+     * Roughly speaking, the child side "actually owns" a Layer.  This
+     * is because the parent side is the "shadow"; when the child
+     * releases a Layer, the parent's shadow is no longer meaningful.
+     *
+     * To implement this model, the concrete PLayerParent keeps a
+     * strong ref to its Layer, so the Layer's lifetime is bound to
+     * the PLayerParent's.  Then, when the Layer's refcount hits 0 on
+     * the child side, we send __delete__() from the child to parent.
+     * The parent then releases its Layer, which results in the Layer
+     * being deleted "soon" (usually immediately).
+     */
+parent:
+    __delete__();
+};
+
+} // layers
+} // mozilla
new file mode 100644
--- /dev/null
+++ b/gfx/layers/ipc/PLayers.ipdl
@@ -0,0 +1,216 @@
+/* -*- 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) 2010
+ * 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 protocol PCompositor;
+include protocol PLayer;
+
+using gfx3DMatrix;
+using gfxRGBA;
+using nsIntPoint;
+using nsIntRect;
+using nsIntRegion;
+using nsIntSize;
+using mozilla::GraphicsFilterType;
+using mozilla::null_t;
+
+/**
+ * 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.)
+ */
+
+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 OpCreateThebesBuffer {
+  PLayer layer;
+  nsIntRect bufferRect;
+  Shmem initialFront;
+};
+
+struct OpCreateCanvasBuffer {
+  PLayer layer;
+  nsIntSize size;
+  Shmem initialFront;
+};
+
+struct OpCreateImageBuffer {
+  PLayer layer;
+  nsIntSize size;
+  Shmem initialFront;
+};
+
+// Change a layer's attributes
+struct CommonLayerAttributes {
+  nsIntRegion visibleRegion;
+  gfx3DMatrix transform;
+  bool isOpaqueContent;
+  float opacity;
+  bool useClipRect;
+  nsIntRect clipRect;
+};
+
+struct ThebesLayerAttributes   { nsIntRegion validRegion; };
+struct ColorLayerAttributes    { gfxRGBA color; };
+struct CanvasLayerAttributes   { GraphicsFilterType filter; };
+struct ImageLayerAttributes    { GraphicsFilterType filter; };
+
+union SpecificLayerAttributes {
+  null_t;
+  ThebesLayerAttributes;
+  ColorLayerAttributes;
+  CanvasLayerAttributes;
+  ImageLayerAttributes;
+};
+
+struct LayerAttributes {
+  CommonLayerAttributes common;
+  SpecificLayerAttributes specific;
+};
+
+struct OpSetLayerAttributes {
+  PLayer layer;
+  LayerAttributes attrs;
+};
+
+
+// Monkey with the tree structure
+struct OpSetRoot      { PLayer root; };
+struct OpInsertAfter  { PLayer container; PLayer childLayer; PLayer after; };
+struct OpAppendChild  { PLayer container; PLayer childLayer; };
+struct OpRemoveChild  { PLayer container; PLayer childLayer; };
+
+
+// Paint (buffer update)
+struct ThebesBuffer {
+  Shmem buffer;
+  nsIntRect rect;
+  nsIntPoint rotation; 
+};
+struct OpPaintThebesBuffer {
+  PLayer layer;
+  ThebesBuffer newFrontBuffer;
+};
+
+struct OpPaintCanvas  {
+  PLayer layer;
+  nsIntRect updated;
+  Shmem newFrontBuffer;
+};
+
+struct OpPaintImage  {
+  PLayer layer;
+  Shmem newFrontBuffer;
+};
+
+
+// A unit of a changeset; a set of these comprise a changeset
+union Edit {
+  OpCreateThebesLayer;
+  OpCreateContainerLayer;
+  OpCreateImageLayer;
+  OpCreateColorLayer;
+  OpCreateCanvasLayer;
+  OpCreateCanvasBuffer;
+  OpCreateThebesBuffer;
+  OpCreateImageBuffer;
+
+  OpSetLayerAttributes;
+
+  OpSetRoot;
+  OpInsertAfter;
+  OpAppendChild;
+  OpRemoveChild;
+
+  OpPaintThebesBuffer;
+  OpPaintCanvas;
+  OpPaintImage;
+};
+
+
+// Replies to operations
+struct OpBufferSwap   { PLayer layer; Shmem newBackBuffer; };
+
+/*
+ * XXX: if we choose *not* to do a new-front-to-new-back fill in the
+ * parent process, then we'll need to send back the old buffer
+ * attributes so that it can be filled anew.
+ *
+struct OpThebesBufferSwap {
+  PLayer layer;
+  ThebesBuffer newBackBuffer;
+};
+*/
+
+// Unit of a "changeset reply".  This is a weird abstraction, probably
+// only to be used for buffer swapping.
+union EditReply {
+  OpBufferSwap;
+//  OpThebesBufferSwap;
+};
+
+
+sync protocol PLayers {
+  //manager PCompositor /*or PContent or PMedia or PPlugin*/;
+  manages PLayer;
+
+parent:
+  async PLayer();
+
+  sync Update(Edit[] cset)
+    returns (EditReply[] reply);
+
+  async __delete__();
+};
+
+} // namespace layers
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/gfx/layers/ipc/ipdl.mk
@@ -0,0 +1,4 @@
+IPDLSRCS = \
+  PLayer.ipdl \
+  PLayers.ipdl \
+  $(NULL)
--- a/ipc/ipdl/Makefile.in
+++ b/ipc/ipdl/Makefile.in
@@ -52,23 +52,24 @@ EXPORT_LIBRARY = 1
 
 ##-----------------------------------------------------------------------------
 ## When you add IPDL files to a source directory, list the directory here.
 ##
 IPDLDIRS =  \
   dom/src/geolocation \
   dom/plugins  \
   dom/ipc  \
+  gfx/layers/ipc \
+  ipc/ipdl/test/cxx  \
+  ipc/testshell  \
+  js/ipc  \
+  js/jetpack \
   netwerk/ipc  \
   netwerk/protocol/http  \
   netwerk/cookie  \
-  js/jetpack \
-  ipc/ipdl/test/cxx  \
-  ipc/testshell  \
-  js/ipc  \
   $(NULL)
 ##-----------------------------------------------------------------------------
 
 ifdef MOZ_IPDL_TESTS
 DIRS += test
 endif
 
 vpath %.ipdl $(topsrcdir)