1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/layers/opengl/GrallocTextureClient.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,149 @@ 1.4 +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 +// * This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef MOZILLA_GFX_GRALLOCTEXTURECLIENT_H 1.10 +#define MOZILLA_GFX_GRALLOCTEXTURECLIENT_H 1.11 +#ifdef MOZ_WIDGET_GONK 1.12 + 1.13 +#include "mozilla/layers/TextureClient.h" 1.14 +#include "ISurfaceAllocator.h" // For IsSurfaceDescriptorValid 1.15 +#include "mozilla/layers/FenceUtils.h" // for FenceHandle 1.16 +#include "mozilla/layers/ShadowLayerUtilsGralloc.h" 1.17 +#include <ui/GraphicBuffer.h> 1.18 + 1.19 + 1.20 +namespace android { 1.21 +class MediaBuffer; 1.22 +}; 1.23 + 1.24 +namespace mozilla { 1.25 +namespace layers { 1.26 + 1.27 +/** 1.28 + * A TextureClient implementation based on android::GraphicBuffer (also referred to 1.29 + * as "gralloc"). 1.30 + * 1.31 + * Gralloc lets us map texture data in memory (accessible through pointers) 1.32 + * and also use it directly as an OpenGL texture without the cost of texture 1.33 + * uploads. 1.34 + * Gralloc buffers can also be shared accros processes. 1.35 + * 1.36 + * More info about Gralloc here: https://wiki.mozilla.org/Platform/GFX/Gralloc 1.37 + * 1.38 + * This is only used in Firefox OS 1.39 + */ 1.40 +class GrallocTextureClientOGL : public BufferTextureClient 1.41 +{ 1.42 +public: 1.43 + GrallocTextureClientOGL(GrallocBufferActor* aActor, 1.44 + gfx::IntSize aSize, 1.45 + gfx::BackendType aMoz2dBackend, 1.46 + TextureFlags aFlags = TEXTURE_FLAGS_DEFAULT); 1.47 + GrallocTextureClientOGL(ISurfaceAllocator* aAllocator, 1.48 + gfx::SurfaceFormat aFormat, 1.49 + gfx::BackendType aMoz2dBackend, 1.50 + TextureFlags aFlags = TEXTURE_FLAGS_DEFAULT); 1.51 + 1.52 + ~GrallocTextureClientOGL(); 1.53 + 1.54 + virtual bool Lock(OpenMode aMode) MOZ_OVERRIDE; 1.55 + 1.56 + virtual void Unlock() MOZ_OVERRIDE; 1.57 + 1.58 + virtual bool ImplementsLocking() const MOZ_OVERRIDE { return true; } 1.59 + 1.60 + virtual bool HasInternalBuffer() const MOZ_OVERRIDE { return false; } 1.61 + 1.62 + virtual bool IsAllocated() const MOZ_OVERRIDE; 1.63 + 1.64 + virtual bool ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) MOZ_OVERRIDE; 1.65 + 1.66 + virtual TextureClientData* DropTextureData() MOZ_OVERRIDE; 1.67 + 1.68 + virtual void SetReleaseFenceHandle(FenceHandle aReleaseFenceHandle) MOZ_OVERRIDE; 1.69 + 1.70 + virtual void WaitReleaseFence() MOZ_OVERRIDE; 1.71 + 1.72 + void InitWith(GrallocBufferActor* aActor, gfx::IntSize aSize); 1.73 + 1.74 + void SetTextureFlags(TextureFlags aFlags) { AddFlags(aFlags); } 1.75 + 1.76 + gfx::IntSize GetSize() const MOZ_OVERRIDE { return mSize; } 1.77 + 1.78 + android::sp<android::GraphicBuffer> GetGraphicBuffer() 1.79 + { 1.80 + return mGraphicBuffer; 1.81 + } 1.82 + 1.83 + android::PixelFormat GetPixelFormat() 1.84 + { 1.85 + return mGraphicBuffer->getPixelFormat(); 1.86 + } 1.87 + 1.88 + virtual uint8_t* GetBuffer() const MOZ_OVERRIDE; 1.89 + 1.90 + virtual TemporaryRef<gfx::DrawTarget> GetAsDrawTarget() MOZ_OVERRIDE; 1.91 + 1.92 + virtual bool AllocateForSurface(gfx::IntSize aSize, 1.93 + TextureAllocationFlags aFlags = ALLOC_DEFAULT) MOZ_OVERRIDE; 1.94 + 1.95 + virtual bool AllocateForYCbCr(gfx::IntSize aYSize, 1.96 + gfx::IntSize aCbCrSize, 1.97 + StereoMode aStereoMode) MOZ_OVERRIDE; 1.98 + 1.99 + bool AllocateForGLRendering(gfx::IntSize aSize); 1.100 + 1.101 + bool AllocateGralloc(gfx::IntSize aYSize, uint32_t aAndroidFormat, uint32_t aUsage); 1.102 + 1.103 + virtual bool Allocate(uint32_t aSize) MOZ_OVERRIDE; 1.104 + 1.105 + virtual size_t GetBufferSize() const MOZ_OVERRIDE; 1.106 + 1.107 + /** 1.108 + * Hold android::MediaBuffer. 1.109 + * MediaBuffer needs to be add refed to keep MediaBuffer alive 1.110 + * during TextureClient is in use. 1.111 + */ 1.112 + void SetMediaBuffer(android::MediaBuffer* aMediaBuffer) 1.113 + { 1.114 + mMediaBuffer = aMediaBuffer; 1.115 + } 1.116 + 1.117 + android::MediaBuffer* GetMediaBuffer() 1.118 + { 1.119 + return mMediaBuffer; 1.120 + } 1.121 + 1.122 +protected: 1.123 + /** 1.124 + * Unfortunately, until bug 879681 is fixed we need to use a GrallocBufferActor. 1.125 + */ 1.126 + GrallocBufferActor* mGrallocActor; 1.127 + 1.128 + android::sp<android::GraphicBuffer> mGraphicBuffer; 1.129 + 1.130 + /** 1.131 + * Points to a mapped gralloc buffer between calls to lock and unlock. 1.132 + * Should be null outside of the lock-unlock pair. 1.133 + */ 1.134 + uint8_t* mMappedBuffer; 1.135 + 1.136 + RefPtr<gfx::DrawTarget> mDrawTarget; 1.137 + 1.138 + /** 1.139 + * android::GraphicBuffer has a size information. But there are cases 1.140 + * that GraphicBuffer's size and actual video's size are different. 1.141 + * Extra size member is necessary. See Bug 850566. 1.142 + */ 1.143 + gfx::IntSize mSize; 1.144 + 1.145 + android::MediaBuffer* mMediaBuffer; 1.146 +}; 1.147 + 1.148 +} // namespace layers 1.149 +} // namespace mozilla 1.150 + 1.151 +#endif // MOZ_WIDGET_GONK 1.152 +#endif