diff -r 000000000000 -r 6474c204b198 gfx/thebes/gfxReusableSurfaceWrapper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/thebes/gfxReusableSurfaceWrapper.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,89 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef GFXCOWSURFACEWRAPPER +#define GFXCOWSURFACEWRAPPER + +#include "gfxImageSurface.h" +#include "nsISupportsImpl.h" +#include "nsAutoPtr.h" + + +/** + * Provides an interface to implement a cross thread/process wrapper for a + * gfxImageSurface that has copy-on-write semantics. + * + * Only the owner thread can write to the surface and acquire + * read locks. Destroying a gfxReusableSurfaceWrapper releases + * a read lock. + * + * OMTC Usage: + * 1) Content creates a writable copy of this surface + * wrapper which will be optimized to the same wrapper if there + * are no readers. + * 2) The surface is sent from content to the compositor once + * or potentially many times, each increasing a read lock. + * 3) When the compositor receives the surface, it adopts the + * read lock. + * 4) Once the compositor has processed the surface and uploaded + * the content, it then releases the read lock by dereferencing + * its wrapper. + */ +class gfxReusableSurfaceWrapper { + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(gfxReusableSurfaceWrapper) +public: + + /** + * Returns a read-only pointer to the image data. + */ + virtual const unsigned char* GetReadOnlyData() const = 0; + + /** + * Returns the image surface format. + */ + virtual gfxImageFormat Format() = 0; + + /** + * Returns a writable copy of the image. + * If necessary this will copy the wrapper. If there are no contention + * the same wrapper will be returned. A ReadLock must be held when + * calling this function, and calling it will give up this lock. + */ + virtual gfxReusableSurfaceWrapper* GetWritable(gfxImageSurface** aSurface) = 0; + + /** + * A read only lock count is recorded, any attempts to + * call GetWritable() while this count is greater than one will + * create a new surface/wrapper pair. + * + * When a surface's read count falls to zero, its memory will be + * deallocated. It is the responsibility of the user to make sure + * that all locks are matched with an equal number of unlocks. + */ + virtual void ReadLock() = 0; + virtual void ReadUnlock() = 0; + + /** + * Types for each implementation of gfxReusableSurfaceWrapper. + */ + enum Type { + TYPE_SHARED_IMAGE, + TYPE_IMAGE, + + TYPE_MAX + }; + + /** + * Returns a unique ID for each implementation of gfxReusableSurfaceWrapper. + */ + virtual Type GetType() = 0; + +protected: + // Protected destructor, to discourage deletion outside of Release(): + virtual ~gfxReusableSurfaceWrapper() {} + + NS_DECL_OWNINGTHREAD +}; + +#endif // GFXCOWSURFACEWRAPPER