• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <android-base/unique_fd.h>
20 #include <system/window.h>
21 #include <apex/window.h>
22 #include <utils/Errors.h>
23 #include <utils/Macros.h>
24 #ifdef __ANDROID__
25 #include <utils/NdkUtils.h>
26 #endif
27 #include <utils/StrongPointer.h>
28 
29 #include <memory>
30 #include <mutex>
31 
32 namespace android::uirenderer::renderthread {
33 
34 class ReliableSurface {
35     PREVENT_COPY_AND_ASSIGN(ReliableSurface);
36 
37 public:
38     ReliableSurface(ANativeWindow* window);
39     ~ReliableSurface();
40 
41     // Performs initialization that is not safe to do in the constructor.
42     // For instance, registering ANativeWindow interceptors with ReliableSurface
43     // passed as the data pointer is not safe.
44     void init();
45 
getNativeWindow()46     ANativeWindow* getNativeWindow() { return mWindow; }
47 
48     int reserveNext();
49 
getAndClearError()50     int getAndClearError() {
51         int ret = mBufferQueueState;
52         mBufferQueueState = OK;
53         return ret;
54     }
55 
didSetExtraBuffers()56     bool didSetExtraBuffers() const {
57         std::lock_guard _lock{mMutex};
58         return mDidSetExtraBuffers;
59     }
60 
61 private:
62     ANativeWindow* mWindow;
63 
64     mutable std::mutex mMutex;
65 
66     uint64_t mUsage = AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
67 #ifdef __ANDROID__
68     AHardwareBuffer_Format mFormat = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
69     UniqueAHardwareBuffer mScratchBuffer;
70     ANativeWindowBuffer* mReservedBuffer = nullptr;
71 #endif
72     base::unique_fd mReservedFenceFd;
73     bool mHasDequeuedBuffer = false;
74     int mBufferQueueState = OK;
75     size_t mExpectedBufferCount = 0;
76     bool mDidSetExtraBuffers = false;
77 
78     bool isFallbackBuffer(const ANativeWindowBuffer* windowBuffer) const;
79     ANativeWindowBuffer* acquireFallbackBuffer(int error);
80     void clearReservedBuffer();
81 
82     // ANativeWindow hooks. When an ANativeWindow_* method is called on the
83     // underlying ANativeWindow, these methods will intercept the original call.
84     // For example, an EGL driver would call into these hooks instead of the
85     // original methods.
86     static int hook_cancelBuffer(ANativeWindow* window, ANativeWindow_cancelBufferFn cancelBuffer,
87                                  void* data, ANativeWindowBuffer* buffer, int fenceFd);
88     static int hook_dequeueBuffer(ANativeWindow* window,
89                                   ANativeWindow_dequeueBufferFn dequeueBuffer, void* data,
90                                   ANativeWindowBuffer** buffer, int* fenceFd);
91     static int hook_queueBuffer(ANativeWindow* window, ANativeWindow_queueBufferFn queueBuffer,
92                                 void* data, ANativeWindowBuffer* buffer, int fenceFd);
93 
94     static int hook_perform(ANativeWindow* window, ANativeWindow_performFn perform, void* data,
95                             int operation, va_list args);
96     static int hook_query(const ANativeWindow* window, ANativeWindow_queryFn query, void* data,
97             int what, int* value);
98 };
99 
100 };  // namespace android::uirenderer::renderthread
101