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