gfx/layers/opengl/GrallocTextureClient.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2 //  * This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef MOZILLA_GFX_GRALLOCTEXTURECLIENT_H
     7 #define MOZILLA_GFX_GRALLOCTEXTURECLIENT_H
     8 #ifdef MOZ_WIDGET_GONK
    10 #include "mozilla/layers/TextureClient.h"
    11 #include "ISurfaceAllocator.h" // For IsSurfaceDescriptorValid
    12 #include "mozilla/layers/FenceUtils.h" // for FenceHandle
    13 #include "mozilla/layers/ShadowLayerUtilsGralloc.h"
    14 #include <ui/GraphicBuffer.h>
    17 namespace android {
    18 class MediaBuffer;
    19 };
    21 namespace mozilla {
    22 namespace layers {
    24 /**
    25  * A TextureClient implementation based on android::GraphicBuffer (also referred to
    26  * as "gralloc").
    27  *
    28  * Gralloc lets us map texture data in memory (accessible through pointers)
    29  * and also use it directly as an OpenGL texture without the cost of texture
    30  * uploads.
    31  * Gralloc buffers can also be shared accros processes.
    32  *
    33  * More info about Gralloc here: https://wiki.mozilla.org/Platform/GFX/Gralloc
    34  *
    35  * This is only used in Firefox OS
    36  */
    37 class GrallocTextureClientOGL : public BufferTextureClient
    38 {
    39 public:
    40   GrallocTextureClientOGL(GrallocBufferActor* aActor,
    41                           gfx::IntSize aSize,
    42                           gfx::BackendType aMoz2dBackend,
    43                           TextureFlags aFlags = TEXTURE_FLAGS_DEFAULT);
    44   GrallocTextureClientOGL(ISurfaceAllocator* aAllocator,
    45                           gfx::SurfaceFormat aFormat,
    46                           gfx::BackendType aMoz2dBackend,
    47                           TextureFlags aFlags = TEXTURE_FLAGS_DEFAULT);
    49   ~GrallocTextureClientOGL();
    51   virtual bool Lock(OpenMode aMode) MOZ_OVERRIDE;
    53   virtual void Unlock() MOZ_OVERRIDE;
    55   virtual bool ImplementsLocking() const MOZ_OVERRIDE { return true; }
    57   virtual bool HasInternalBuffer() const MOZ_OVERRIDE { return false; }
    59   virtual bool IsAllocated() const MOZ_OVERRIDE;
    61   virtual bool ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) MOZ_OVERRIDE;
    63   virtual TextureClientData* DropTextureData() MOZ_OVERRIDE;
    65   virtual void SetReleaseFenceHandle(FenceHandle aReleaseFenceHandle) MOZ_OVERRIDE;
    67   virtual void WaitReleaseFence() MOZ_OVERRIDE;
    69   void InitWith(GrallocBufferActor* aActor, gfx::IntSize aSize);
    71   void SetTextureFlags(TextureFlags aFlags) { AddFlags(aFlags); }
    73   gfx::IntSize GetSize() const MOZ_OVERRIDE { return mSize; }
    75   android::sp<android::GraphicBuffer> GetGraphicBuffer()
    76   {
    77     return mGraphicBuffer;
    78   }
    80   android::PixelFormat GetPixelFormat()
    81   {
    82     return mGraphicBuffer->getPixelFormat();
    83   }
    85   virtual uint8_t* GetBuffer() const MOZ_OVERRIDE;
    87   virtual TemporaryRef<gfx::DrawTarget> GetAsDrawTarget() MOZ_OVERRIDE;
    89   virtual bool AllocateForSurface(gfx::IntSize aSize,
    90                                   TextureAllocationFlags aFlags = ALLOC_DEFAULT) MOZ_OVERRIDE;
    92   virtual bool AllocateForYCbCr(gfx::IntSize aYSize,
    93                                 gfx::IntSize aCbCrSize,
    94                                 StereoMode aStereoMode) MOZ_OVERRIDE;
    96   bool AllocateForGLRendering(gfx::IntSize aSize);
    98   bool AllocateGralloc(gfx::IntSize aYSize, uint32_t aAndroidFormat, uint32_t aUsage);
   100   virtual bool Allocate(uint32_t aSize) MOZ_OVERRIDE;
   102   virtual size_t GetBufferSize() const MOZ_OVERRIDE;
   104   /**
   105    * Hold android::MediaBuffer.
   106    * MediaBuffer needs to be add refed to keep MediaBuffer alive
   107    * during TextureClient is in use.
   108    */
   109   void SetMediaBuffer(android::MediaBuffer* aMediaBuffer)
   110   {
   111     mMediaBuffer = aMediaBuffer;
   112   }
   114   android::MediaBuffer* GetMediaBuffer()
   115   {
   116     return mMediaBuffer;
   117   }
   119 protected:
   120   /**
   121    * Unfortunately, until bug 879681 is fixed we need to use a GrallocBufferActor.
   122    */
   123   GrallocBufferActor* mGrallocActor;
   125   android::sp<android::GraphicBuffer> mGraphicBuffer;
   127   /**
   128    * Points to a mapped gralloc buffer between calls to lock and unlock.
   129    * Should be null outside of the lock-unlock pair.
   130    */
   131   uint8_t* mMappedBuffer;
   133   RefPtr<gfx::DrawTarget> mDrawTarget;
   135   /**
   136    * android::GraphicBuffer has a size information. But there are cases
   137    * that GraphicBuffer's size and actual video's size are different.
   138    * Extra size member is necessary. See Bug 850566.
   139    */
   140   gfx::IntSize mSize;
   142   android::MediaBuffer* mMediaBuffer;
   143 };
   145 } // namespace layers
   146 } // namespace mozilla
   148 #endif // MOZ_WIDGET_GONK
   149 #endif

mercurial