tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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