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
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)