AndroidHardwareBuffer.h (6393B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef MOZILLA_LAYERS_ANDROID_HARDWARE_BUFFER 8 #define MOZILLA_LAYERS_ANDROID_HARDWARE_BUFFER 9 10 #include <android/hardware_buffer.h> 11 #include <atomic> 12 #include <unordered_map> 13 14 #include "mozilla/layers/TextureClient.h" 15 #include "mozilla/gfx/Types.h" 16 #include "mozilla/gfx/2D.h" 17 #include "mozilla/Monitor.h" 18 #include "mozilla/RefPtr.h" 19 #include "mozilla/StaticPtr.h" 20 #include "mozilla/ThreadSafeWeakPtr.h" 21 #include "mozilla/UniquePtrExtensions.h" 22 23 namespace mozilla { 24 namespace layers { 25 26 /** 27 * AndroidHardwareBufferApi provides apis for managing AHardwareBuffer. 28 * The apis are supported since Android O(APIVersion 26). 29 */ 30 class AndroidHardwareBufferApi final { 31 public: 32 static void Init(); 33 static void Shutdown(); 34 35 static AndroidHardwareBufferApi* Get() { return sInstance; } 36 37 void Allocate(const AHardwareBuffer_Desc* aDesc, 38 AHardwareBuffer** aOutBuffer); 39 void Acquire(AHardwareBuffer* aBuffer); 40 void Release(AHardwareBuffer* aBuffer); 41 void Describe(const AHardwareBuffer* aBuffer, AHardwareBuffer_Desc* aOutDesc); 42 int Lock(AHardwareBuffer* aBuffer, uint64_t aUsage, int32_t aFence, 43 const ARect* aRect, void** aOutVirtualAddress); 44 int Unlock(AHardwareBuffer* aBuffer, int32_t* aFence); 45 int SendHandleToUnixSocket(const AHardwareBuffer* aBuffer, int aSocketFd); 46 int RecvHandleFromUnixSocket(int aSocketFd, AHardwareBuffer** aOutBuffer); 47 48 private: 49 AndroidHardwareBufferApi(); 50 bool Load(); 51 52 using _AHardwareBuffer_allocate = int (*)(const AHardwareBuffer_Desc* desc, 53 AHardwareBuffer** outBuffer); 54 using _AHardwareBuffer_acquire = void (*)(AHardwareBuffer* buffer); 55 using _AHardwareBuffer_release = void (*)(AHardwareBuffer* buffer); 56 using _AHardwareBuffer_describe = void (*)(const AHardwareBuffer* buffer, 57 AHardwareBuffer_Desc* outDesc); 58 using _AHardwareBuffer_lock = int (*)(AHardwareBuffer* buffer, uint64_t usage, 59 int32_t fence, const ARect* rect, 60 void** outVirtualAddress); 61 using _AHardwareBuffer_unlock = int (*)(AHardwareBuffer* buffer, 62 int32_t* fence); 63 using _AHardwareBuffer_sendHandleToUnixSocket = 64 int (*)(const AHardwareBuffer* buffer, int socketFd); 65 using _AHardwareBuffer_recvHandleFromUnixSocket = 66 int (*)(int socketFd, AHardwareBuffer** outBuffer); 67 68 _AHardwareBuffer_allocate mAHardwareBuffer_allocate = nullptr; 69 _AHardwareBuffer_acquire mAHardwareBuffer_acquire = nullptr; 70 _AHardwareBuffer_release mAHardwareBuffer_release = nullptr; 71 _AHardwareBuffer_describe mAHardwareBuffer_describe = nullptr; 72 _AHardwareBuffer_lock mAHardwareBuffer_lock = nullptr; 73 _AHardwareBuffer_unlock mAHardwareBuffer_unlock = nullptr; 74 _AHardwareBuffer_sendHandleToUnixSocket 75 mAHardwareBuffer_sendHandleToUnixSocket = nullptr; 76 _AHardwareBuffer_recvHandleFromUnixSocket 77 mAHardwareBuffer_recvHandleFromUnixSocket = nullptr; 78 79 static StaticAutoPtr<AndroidHardwareBufferApi> sInstance; 80 }; 81 82 /** 83 * AndroidHardwareBuffer is a wrapper of AHardwareBuffer. AHardwareBuffer wraps 84 * android GraphicBuffer. It is supported since Android O(APIVersion 26). 85 * The manager is mainly used for release fences delivery from 86 * host side to client side. 87 */ 88 class AndroidHardwareBuffer 89 : public SupportsThreadSafeWeakPtr<AndroidHardwareBuffer> { 90 public: 91 MOZ_DECLARE_REFCOUNTED_TYPENAME(AndroidHardwareBuffer) 92 93 static already_AddRefed<AndroidHardwareBuffer> Create( 94 gfx::IntSize aSize, gfx::SurfaceFormat aFormat); 95 96 virtual ~AndroidHardwareBuffer(); 97 98 int Lock(uint64_t aUsage, const ARect* aRect, void** aOutVirtualAddress); 99 int Unlock(); 100 101 AHardwareBuffer* GetNativeBuffer() const { return mNativeBuffer; } 102 103 void SetAcquireFence(UniqueFileHandle&& aFenceFd); 104 105 void SetReleaseFence(UniqueFileHandle&& aFenceFd); 106 107 UniqueFileHandle GetAndResetReleaseFence(); 108 109 UniqueFileHandle GetAndResetAcquireFence(); 110 111 UniqueFileHandle GetAcquireFence() const; 112 113 const gfx::IntSize mSize; 114 const uint32_t mStride; 115 const gfx::SurfaceFormat mFormat; 116 const uint64_t mId; 117 118 protected: 119 AndroidHardwareBuffer(AHardwareBuffer* aNativeBuffer, gfx::IntSize aSize, 120 uint32_t aStride, gfx::SurfaceFormat aFormat, 121 uint64_t aId); 122 123 void SetReleaseFence(UniqueFileHandle&& aFenceFd, 124 const MonitorAutoLock& aAutoLock); 125 126 AHardwareBuffer* mNativeBuffer; 127 128 // When true, AndroidHardwareBuffer is registered to 129 // AndroidHardwareBufferManager. 130 bool mIsRegistered; 131 132 // protected by AndroidHardwareBufferManager::mMonitor 133 134 // FileDescriptor of release fence. 135 // Release fence is a fence that is used for waiting until usage/composite of 136 // AHardwareBuffer is ended. The fence is delivered via ImageBridge. 137 UniqueFileHandle mReleaseFenceFd; 138 139 // FileDescriptor of acquire fence. 140 // Acquire fence is a fence that is used for waiting until rendering to 141 // its AHardwareBuffer is completed. 142 UniqueFileHandle mAcquireFenceFd; 143 144 static uint64_t GetNextId(); 145 146 friend class AndroidHardwareBufferManager; 147 }; 148 149 /** 150 * AndroidHardwareBufferManager manages AndroidHardwareBuffers that is 151 * allocated by client side. 152 * Host side only uses mMonitor for thread safety of AndroidHardwareBuffer. 153 */ 154 class AndroidHardwareBufferManager { 155 public: 156 static void Init(); 157 static void Shutdown(); 158 159 AndroidHardwareBufferManager(); 160 161 static AndroidHardwareBufferManager* Get() { return sInstance; } 162 163 void Register(RefPtr<AndroidHardwareBuffer> aBuffer); 164 165 void Unregister(AndroidHardwareBuffer* aBuffer); 166 167 already_AddRefed<AndroidHardwareBuffer> GetBuffer(uint64_t aBufferId); 168 169 Monitor& GetMonitor() { return mMonitor; } 170 171 private: 172 Monitor mMonitor MOZ_UNANNOTATED; 173 std::unordered_map<uint64_t, ThreadSafeWeakPtr<AndroidHardwareBuffer>> 174 mBuffers; 175 176 static StaticAutoPtr<AndroidHardwareBufferManager> sInstance; 177 }; 178 179 } // namespace layers 180 } // namespace mozilla 181 182 #endif