xref: /aosp_15_r20/frameworks/base/libs/hwui/DeferredLayerUpdater.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #pragma once
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include <EGL/egl.h>
20*d57664e9SAndroid Build Coastguard Worker #include <EGL/eglext.h>
21*d57664e9SAndroid Build Coastguard Worker #include <SkBlendMode.h>
22*d57664e9SAndroid Build Coastguard Worker #include <SkColorFilter.h>
23*d57664e9SAndroid Build Coastguard Worker #include <SkImage.h>
24*d57664e9SAndroid Build Coastguard Worker #include <SkMatrix.h>
25*d57664e9SAndroid Build Coastguard Worker #include <android/hardware_buffer.h>
26*d57664e9SAndroid Build Coastguard Worker #include <android/surface_texture.h>
27*d57664e9SAndroid Build Coastguard Worker #include <cutils/compiler.h>
28*d57664e9SAndroid Build Coastguard Worker #include <utils/Errors.h>
29*d57664e9SAndroid Build Coastguard Worker #include <utils/Timers.h>
30*d57664e9SAndroid Build Coastguard Worker 
31*d57664e9SAndroid Build Coastguard Worker #include <chrono>
32*d57664e9SAndroid Build Coastguard Worker #include <map>
33*d57664e9SAndroid Build Coastguard Worker #include <memory>
34*d57664e9SAndroid Build Coastguard Worker 
35*d57664e9SAndroid Build Coastguard Worker #include "Layer.h"
36*d57664e9SAndroid Build Coastguard Worker #include "Rect.h"
37*d57664e9SAndroid Build Coastguard Worker #include "renderstate/RenderState.h"
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker namespace android {
40*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
41*d57664e9SAndroid Build Coastguard Worker 
42*d57664e9SAndroid Build Coastguard Worker class AutoBackendTextureRelease;
43*d57664e9SAndroid Build Coastguard Worker class RenderState;
44*d57664e9SAndroid Build Coastguard Worker 
45*d57664e9SAndroid Build Coastguard Worker typedef std::unique_ptr<ASurfaceTexture, decltype(&ASurfaceTexture_release)> AutoTextureRelease;
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker // Container to hold the properties a layer should be set to at the start
48*d57664e9SAndroid Build Coastguard Worker // of a render pass
49*d57664e9SAndroid Build Coastguard Worker class DeferredLayerUpdater : public VirtualLightRefBase, public IGpuContextCallback {
50*d57664e9SAndroid Build Coastguard Worker public:
51*d57664e9SAndroid Build Coastguard Worker     // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
52*d57664e9SAndroid Build Coastguard Worker     // and will not call incrementRef on it as a result.
53*d57664e9SAndroid Build Coastguard Worker     explicit DeferredLayerUpdater(RenderState& renderState);
54*d57664e9SAndroid Build Coastguard Worker 
55*d57664e9SAndroid Build Coastguard Worker     ~DeferredLayerUpdater();
56*d57664e9SAndroid Build Coastguard Worker 
setSize(int width,int height)57*d57664e9SAndroid Build Coastguard Worker     bool setSize(int width, int height) {
58*d57664e9SAndroid Build Coastguard Worker         if (mWidth != width || mHeight != height) {
59*d57664e9SAndroid Build Coastguard Worker             mWidth = width;
60*d57664e9SAndroid Build Coastguard Worker             mHeight = height;
61*d57664e9SAndroid Build Coastguard Worker             return true;
62*d57664e9SAndroid Build Coastguard Worker         }
63*d57664e9SAndroid Build Coastguard Worker         return false;
64*d57664e9SAndroid Build Coastguard Worker     }
65*d57664e9SAndroid Build Coastguard Worker 
getWidth()66*d57664e9SAndroid Build Coastguard Worker     int getWidth() { return mWidth; }
getHeight()67*d57664e9SAndroid Build Coastguard Worker     int getHeight() { return mHeight; }
68*d57664e9SAndroid Build Coastguard Worker 
setBlend(bool blend)69*d57664e9SAndroid Build Coastguard Worker     bool setBlend(bool blend) {
70*d57664e9SAndroid Build Coastguard Worker         if (blend != mBlend) {
71*d57664e9SAndroid Build Coastguard Worker             mBlend = blend;
72*d57664e9SAndroid Build Coastguard Worker             return true;
73*d57664e9SAndroid Build Coastguard Worker         }
74*d57664e9SAndroid Build Coastguard Worker         return false;
75*d57664e9SAndroid Build Coastguard Worker     }
76*d57664e9SAndroid Build Coastguard Worker 
77*d57664e9SAndroid Build Coastguard Worker     void setSurfaceTexture(AutoTextureRelease&& consumer);
78*d57664e9SAndroid Build Coastguard Worker 
updateTexImage()79*d57664e9SAndroid Build Coastguard Worker     void updateTexImage() { mUpdateTexImage = true; }
80*d57664e9SAndroid Build Coastguard Worker 
setTransform(const SkMatrix * matrix)81*d57664e9SAndroid Build Coastguard Worker     void setTransform(const SkMatrix* matrix) {
82*d57664e9SAndroid Build Coastguard Worker         delete mTransform;
83*d57664e9SAndroid Build Coastguard Worker         mTransform = matrix ? new SkMatrix(*matrix) : nullptr;
84*d57664e9SAndroid Build Coastguard Worker     }
85*d57664e9SAndroid Build Coastguard Worker 
getTransform()86*d57664e9SAndroid Build Coastguard Worker     SkMatrix* getTransform() { return mTransform; }
87*d57664e9SAndroid Build Coastguard Worker 
88*d57664e9SAndroid Build Coastguard Worker     void setPaint(const SkPaint* paint);
89*d57664e9SAndroid Build Coastguard Worker 
90*d57664e9SAndroid Build Coastguard Worker     void apply();
91*d57664e9SAndroid Build Coastguard Worker 
backingLayer()92*d57664e9SAndroid Build Coastguard Worker     Layer* backingLayer() { return mLayer; }
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker     void detachSurfaceTexture();
95*d57664e9SAndroid Build Coastguard Worker 
96*d57664e9SAndroid Build Coastguard Worker     void updateLayer(bool forceFilter, const sk_sp<SkImage>& layerImage, const uint32_t transform,
97*d57664e9SAndroid Build Coastguard Worker                      SkRect currentCrop, float maxLuminanceNits = -1.f);
98*d57664e9SAndroid Build Coastguard Worker 
99*d57664e9SAndroid Build Coastguard Worker     void destroyLayer();
100*d57664e9SAndroid Build Coastguard Worker 
101*d57664e9SAndroid Build Coastguard Worker protected:
102*d57664e9SAndroid Build Coastguard Worker     void onContextDestroyed() override;
103*d57664e9SAndroid Build Coastguard Worker 
104*d57664e9SAndroid Build Coastguard Worker private:
105*d57664e9SAndroid Build Coastguard Worker     /**
106*d57664e9SAndroid Build Coastguard Worker      * ImageSlot contains the information and object references that
107*d57664e9SAndroid Build Coastguard Worker      * DeferredLayerUpdater maintains about a slot. Slot id comes from
108*d57664e9SAndroid Build Coastguard Worker      * ASurfaceTexture_dequeueBuffer. Usually there are at most 3 slots active at a time.
109*d57664e9SAndroid Build Coastguard Worker      */
110*d57664e9SAndroid Build Coastguard Worker     class ImageSlot {
111*d57664e9SAndroid Build Coastguard Worker     public:
~ImageSlot()112*d57664e9SAndroid Build Coastguard Worker         ~ImageSlot() {}
113*d57664e9SAndroid Build Coastguard Worker 
114*d57664e9SAndroid Build Coastguard Worker         sk_sp<SkImage> createIfNeeded(AHardwareBuffer* buffer, android_dataspace dataspace,
115*d57664e9SAndroid Build Coastguard Worker                                       bool forceCreate, GrDirectContext* context);
116*d57664e9SAndroid Build Coastguard Worker 
117*d57664e9SAndroid Build Coastguard Worker         void releaseQueueOwnership(GrDirectContext* context);
118*d57664e9SAndroid Build Coastguard Worker 
119*d57664e9SAndroid Build Coastguard Worker         void clear(GrDirectContext* context);
120*d57664e9SAndroid Build Coastguard Worker 
121*d57664e9SAndroid Build Coastguard Worker     private:
122*d57664e9SAndroid Build Coastguard Worker 
123*d57664e9SAndroid Build Coastguard Worker         // the dataspace associated with the current image
124*d57664e9SAndroid Build Coastguard Worker         android_dataspace mDataspace = HAL_DATASPACE_UNKNOWN;
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker         AHardwareBuffer* mBuffer = nullptr;
127*d57664e9SAndroid Build Coastguard Worker 
128*d57664e9SAndroid Build Coastguard Worker         /**
129*d57664e9SAndroid Build Coastguard Worker          * mTextureRelease may outlive DeferredLayerUpdater, if the last ref is held by an SkImage.
130*d57664e9SAndroid Build Coastguard Worker          * DeferredLayerUpdater holds one ref to mTextureRelease, which is decremented by "clear".
131*d57664e9SAndroid Build Coastguard Worker          */
132*d57664e9SAndroid Build Coastguard Worker         AutoBackendTextureRelease* mTextureRelease = nullptr;
133*d57664e9SAndroid Build Coastguard Worker     };
134*d57664e9SAndroid Build Coastguard Worker 
135*d57664e9SAndroid Build Coastguard Worker     static status_t createReleaseFence(bool useFenceSync, EGLSyncKHR* eglFence, EGLDisplay* display,
136*d57664e9SAndroid Build Coastguard Worker                                        int* releaseFence, void* handle);
137*d57664e9SAndroid Build Coastguard Worker     static status_t fenceWait(int fence, void* handle);
138*d57664e9SAndroid Build Coastguard Worker 
139*d57664e9SAndroid Build Coastguard Worker     /**
140*d57664e9SAndroid Build Coastguard Worker      * DeferredLayerUpdater stores the SkImages that have been allocated by the BufferQueue
141*d57664e9SAndroid Build Coastguard Worker      * for each buffer slot.
142*d57664e9SAndroid Build Coastguard Worker      */
143*d57664e9SAndroid Build Coastguard Worker     std::map<int, ImageSlot> mImageSlots;
144*d57664e9SAndroid Build Coastguard Worker 
145*d57664e9SAndroid Build Coastguard Worker     RenderState& mRenderState;
146*d57664e9SAndroid Build Coastguard Worker 
147*d57664e9SAndroid Build Coastguard Worker     // Generic properties
148*d57664e9SAndroid Build Coastguard Worker     int mWidth = 0;
149*d57664e9SAndroid Build Coastguard Worker     int mHeight = 0;
150*d57664e9SAndroid Build Coastguard Worker     bool mBlend = false;
151*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkColorFilter> mColorFilter;
152*d57664e9SAndroid Build Coastguard Worker     int mAlpha = 255;
153*d57664e9SAndroid Build Coastguard Worker     SkBlendMode mMode = SkBlendMode::kSrcOver;
154*d57664e9SAndroid Build Coastguard Worker     AutoTextureRelease mSurfaceTexture;
155*d57664e9SAndroid Build Coastguard Worker     SkMatrix* mTransform;
156*d57664e9SAndroid Build Coastguard Worker     bool mGLContextAttached;
157*d57664e9SAndroid Build Coastguard Worker     bool mUpdateTexImage;
158*d57664e9SAndroid Build Coastguard Worker     int mCurrentSlot = -1;
159*d57664e9SAndroid Build Coastguard Worker     android_dataspace mDataspace = HAL_DATASPACE_UNKNOWN;
160*d57664e9SAndroid Build Coastguard Worker     std::chrono::steady_clock::time_point mFirstTimeForDataspace =
161*d57664e9SAndroid Build Coastguard Worker             std::chrono::steady_clock::time_point::min();
162*d57664e9SAndroid Build Coastguard Worker 
163*d57664e9SAndroid Build Coastguard Worker     Layer* mLayer;
164*d57664e9SAndroid Build Coastguard Worker };
165*d57664e9SAndroid Build Coastguard Worker 
166*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */
167*d57664e9SAndroid Build Coastguard Worker } /* namespace android */
168