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