• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef ANDROID_DVR_NATIVE_BUFFER_H_
2 #define ANDROID_DVR_NATIVE_BUFFER_H_
3 
4 #include <EGL/egl.h>
5 #include <EGL/eglext.h>
6 #include <log/log.h>
7 #include <ui/ANativeObjectBase.h>
8 #include <utils/RefBase.h>
9 #include <nativebase/nativebase.h>
10 
11 #include <private/dvr/buffer_hub_client.h>
12 
13 namespace android {
14 namespace dvr {
15 
16 // ANativeWindowBuffer is the abstraction Android HALs and frameworks use to
17 // pass around hardware graphics buffers. The following classes implement this
18 // abstraction with different DVR backing buffers, all of which provide
19 // different semantics on top of ion/gralloc buffers.
20 
21 // An implementation of ANativeWindowBuffer backed by an IonBuffer.
22 class NativeBuffer
23     : public android::ANativeObjectBase<ANativeWindowBuffer, NativeBuffer,
24                                         android::LightRefBase<NativeBuffer>> {
25  public:
26   static constexpr int kEmptyFence = -1;
27 
NativeBuffer(const std::shared_ptr<IonBuffer> & buffer)28   explicit NativeBuffer(const std::shared_ptr<IonBuffer>& buffer)
29       : BASE(), buffer_(buffer), fence_(kEmptyFence) {
30     ANativeWindowBuffer::width = buffer->width();
31     ANativeWindowBuffer::height = buffer->height();
32     ANativeWindowBuffer::stride = buffer->stride();
33     ANativeWindowBuffer::format = buffer->format();
34     ANativeWindowBuffer::usage = buffer->usage();
35     handle = buffer_->handle();
36   }
37 
~NativeBuffer()38   virtual ~NativeBuffer() {}
39 
buffer()40   std::shared_ptr<IonBuffer> buffer() { return buffer_; }
fence()41   int fence() const { return fence_.Get(); }
42 
SetFence(int fence)43   void SetFence(int fence) { fence_.Reset(fence); }
44 
45  private:
46   friend class android::LightRefBase<NativeBuffer>;
47 
48   std::shared_ptr<IonBuffer> buffer_;
49   pdx::LocalHandle fence_;
50 
51   NativeBuffer(const NativeBuffer&) = delete;
52   void operator=(NativeBuffer&) = delete;
53 };
54 
55 class NativeBufferProducer : public android::ANativeObjectBase<
56                                  ANativeWindowBuffer, NativeBufferProducer,
57                                  android::LightRefBase<NativeBufferProducer>> {
58  public:
59   static constexpr int kEmptyFence = -1;
60 
NativeBufferProducer(const std::shared_ptr<BufferProducer> & buffer,EGLDisplay display,uint32_t surface_buffer_index)61   NativeBufferProducer(const std::shared_ptr<BufferProducer>& buffer,
62                        EGLDisplay display, uint32_t surface_buffer_index)
63       : BASE(),
64         buffer_(buffer),
65         surface_buffer_index_(surface_buffer_index),
66         display_(display) {
67     ANativeWindowBuffer::width = buffer_->width();
68     ANativeWindowBuffer::height = buffer_->height();
69     ANativeWindowBuffer::stride = buffer_->stride();
70     ANativeWindowBuffer::format = buffer_->format();
71     ANativeWindowBuffer::usage = buffer_->usage();
72     ANativeWindowBuffer::handle = buffer_->native_handle();
73     if (display_) {
74       image_khr_ =
75           eglCreateImageKHR(display_, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
76                             static_cast<ANativeWindowBuffer*>(this), nullptr);
77     } else {
78       image_khr_ = EGL_NO_IMAGE_KHR;
79     }
80   }
81 
NativeBufferProducer(const std::shared_ptr<BufferProducer> & buffer)82   explicit NativeBufferProducer(const std::shared_ptr<BufferProducer>& buffer)
83       : NativeBufferProducer(buffer, nullptr, 0) {}
84 
~NativeBufferProducer()85   virtual ~NativeBufferProducer() {
86     if (image_khr_ != EGL_NO_IMAGE_KHR)
87       eglDestroyImageKHR(display_, image_khr_);
88   }
89 
image_khr()90   EGLImageKHR image_khr() const { return image_khr_; }
buffer()91   std::shared_ptr<BufferProducer> buffer() const { return buffer_; }
release_fence()92   int release_fence() const { return release_fence_.Get(); }
surface_buffer_index()93   uint32_t surface_buffer_index() const { return surface_buffer_index_; }
94 
95   // Return the release fence, passing ownership to the caller.
ClaimReleaseFence()96   pdx::LocalHandle ClaimReleaseFence() { return std::move(release_fence_); }
97 
98   // Post the buffer consumer, closing the acquire and release fences.
Post(int acquire_fence,uint64_t sequence)99   int Post(int acquire_fence, uint64_t sequence) {
100     release_fence_.Close();
101     return buffer_->Post(pdx::LocalHandle(acquire_fence), sequence);
102   }
103 
104   // Gain the buffer producer, closing the previous release fence if valid.
Gain()105   int Gain() { return buffer_->Gain(&release_fence_); }
106 
107   // Asynchronously gain the buffer, closing the previous release fence.
GainAsync()108   int GainAsync() {
109     release_fence_.Close();
110     return buffer_->GainAsync();
111   }
112 
113  private:
114   friend class android::LightRefBase<NativeBufferProducer>;
115 
116   std::shared_ptr<BufferProducer> buffer_;
117   pdx::LocalHandle release_fence_;
118   EGLImageKHR image_khr_;
119   uint32_t surface_buffer_index_;
120   EGLDisplay display_;
121 
122   NativeBufferProducer(const NativeBufferProducer&) = delete;
123   void operator=(NativeBufferProducer&) = delete;
124 };
125 
126 // NativeBufferConsumer is an implementation of ANativeWindowBuffer backed by a
127 // BufferConsumer.
128 class NativeBufferConsumer : public android::ANativeObjectBase<
129                                  ANativeWindowBuffer, NativeBufferConsumer,
130                                  android::LightRefBase<NativeBufferConsumer>> {
131  public:
132   static constexpr int kEmptyFence = -1;
133 
NativeBufferConsumer(const std::shared_ptr<BufferConsumer> & buffer)134   explicit NativeBufferConsumer(const std::shared_ptr<BufferConsumer>& buffer)
135       : BASE(), buffer_(buffer), acquire_fence_(kEmptyFence), sequence_(0) {
136     ANativeWindowBuffer::width = buffer_->width();
137     ANativeWindowBuffer::height = buffer_->height();
138     ANativeWindowBuffer::stride = buffer_->stride();
139     ANativeWindowBuffer::format = buffer_->format();
140     ANativeWindowBuffer::usage = buffer_->usage();
141     handle = buffer_->native_handle();
142   }
143 
~NativeBufferConsumer()144   virtual ~NativeBufferConsumer() {}
145 
buffer()146   std::shared_ptr<BufferConsumer> buffer() const { return buffer_; }
acquire_fence()147   int acquire_fence() const { return acquire_fence_.Get(); }
sequence()148   uint64_t sequence() const { return sequence_; }
149 
150   // Return the acquire fence, passing ownership to the caller.
ClaimAcquireFence()151   pdx::LocalHandle ClaimAcquireFence() { return std::move(acquire_fence_); }
152 
153   // Acquire the underlying buffer consumer, closing the previous acquire fence
154   // if valid.
Acquire()155   int Acquire() { return buffer_->Acquire(&acquire_fence_, &sequence_); }
156 
157   // Release the buffer consumer, closing the acquire and release fences if
158   // valid.
Release(int release_fence)159   int Release(int release_fence) {
160     acquire_fence_.Close();
161     sequence_ = 0;
162     return buffer_->Release(pdx::LocalHandle(release_fence));
163   }
164 
165  private:
166   friend class android::LightRefBase<NativeBufferConsumer>;
167 
168   std::shared_ptr<BufferConsumer> buffer_;
169   pdx::LocalHandle acquire_fence_;
170   uint64_t sequence_;
171 
172   NativeBufferConsumer(const NativeBufferConsumer&) = delete;
173   void operator=(NativeBufferConsumer&) = delete;
174 };
175 
176 }  // namespace dvr
177 }  // namespace android
178 
179 #endif  // ANDROID_DVR_NATIVE_BUFFER_H_
180