EglManager.h revision c96955d9bb997b51be5fa929b5a67349d0459c3a
13b20251a355c88193c439f928a84ae69483fb488John Reck/*
23b20251a355c88193c439f928a84ae69483fb488John Reck * Copyright (C) 2014 The Android Open Source Project
33b20251a355c88193c439f928a84ae69483fb488John Reck *
43b20251a355c88193c439f928a84ae69483fb488John Reck * Licensed under the Apache License, Version 2.0 (the "License");
53b20251a355c88193c439f928a84ae69483fb488John Reck * you may not use this file except in compliance with the License.
63b20251a355c88193c439f928a84ae69483fb488John Reck * You may obtain a copy of the License at
73b20251a355c88193c439f928a84ae69483fb488John Reck *
83b20251a355c88193c439f928a84ae69483fb488John Reck *      http://www.apache.org/licenses/LICENSE-2.0
93b20251a355c88193c439f928a84ae69483fb488John Reck *
103b20251a355c88193c439f928a84ae69483fb488John Reck * Unless required by applicable law or agreed to in writing, software
113b20251a355c88193c439f928a84ae69483fb488John Reck * distributed under the License is distributed on an "AS IS" BASIS,
123b20251a355c88193c439f928a84ae69483fb488John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133b20251a355c88193c439f928a84ae69483fb488John Reck * See the License for the specific language governing permissions and
143b20251a355c88193c439f928a84ae69483fb488John Reck * limitations under the License.
153b20251a355c88193c439f928a84ae69483fb488John Reck */
163b20251a355c88193c439f928a84ae69483fb488John Reck#ifndef EGLMANAGER_H
173b20251a355c88193c439f928a84ae69483fb488John Reck#define EGLMANAGER_H
183b20251a355c88193c439f928a84ae69483fb488John Reck
193b20251a355c88193c439f928a84ae69483fb488John Reck#include <cutils/compiler.h>
203b20251a355c88193c439f928a84ae69483fb488John Reck#include <EGL/egl.h>
21d04794a9a3f9edc8b7ca336175d66eb81a8f55faJohn Reck#include <SkRect.h>
223b20251a355c88193c439f928a84ae69483fb488John Reck#include <ui/GraphicBuffer.h>
233b20251a355c88193c439f928a84ae69483fb488John Reck#include <utils/StrongPointer.h>
243b20251a355c88193c439f928a84ae69483fb488John Reck
253b20251a355c88193c439f928a84ae69483fb488John Recknamespace android {
263b20251a355c88193c439f928a84ae69483fb488John Recknamespace uirenderer {
273b20251a355c88193c439f928a84ae69483fb488John Recknamespace renderthread {
283b20251a355c88193c439f928a84ae69483fb488John Reck
293b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderThread;
30149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reckclass EglManager;
31149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck
32149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reckclass Frame {
33149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reckpublic:
34149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint width() const { return mWidth; }
35149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint height() const { return mHeight; }
36149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck
37149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    // See: https://www.khronos.org/registry/egl/extensions/EXT/EGL_EXT_buffer_age.txt
38149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    // for what this means
39149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint bufferAge() const { return mBufferAge; }
40149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck
41149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reckprivate:
42149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    friend class EglManager;
43149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck
44149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLSurface mSurface;
45149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint mWidth;
46149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint mHeight;
47149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint mBufferAge;
48149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck
49149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    // Maps from 0,0 in top-left to 0,0 in bottom-left
50149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    // If out is not an EGLint[4] you're going to have a bad time
51149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    void map(const SkRect& in, EGLint* out) const;
52149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck};
533b20251a355c88193c439f928a84ae69483fb488John Reck
543b20251a355c88193c439f928a84ae69483fb488John Reck// This class contains the shared global EGL objects, such as EGLDisplay
553b20251a355c88193c439f928a84ae69483fb488John Reck// and EGLConfig, which are re-used by CanvasContext
563b20251a355c88193c439f928a84ae69483fb488John Reckclass EglManager {
573b20251a355c88193c439f928a84ae69483fb488John Reckpublic:
583b20251a355c88193c439f928a84ae69483fb488John Reck    // Returns true on success, false on failure
593b20251a355c88193c439f928a84ae69483fb488John Reck    void initialize();
603b20251a355c88193c439f928a84ae69483fb488John Reck
613b20251a355c88193c439f928a84ae69483fb488John Reck    bool hasEglContext();
623b20251a355c88193c439f928a84ae69483fb488John Reck
633b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface createSurface(EGLNativeWindowType window);
643b20251a355c88193c439f928a84ae69483fb488John Reck    void destroySurface(EGLSurface surface);
653b20251a355c88193c439f928a84ae69483fb488John Reck
663b20251a355c88193c439f928a84ae69483fb488John Reck    void destroy();
673b20251a355c88193c439f928a84ae69483fb488John Reck
683b20251a355c88193c439f928a84ae69483fb488John Reck    bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; }
693b20251a355c88193c439f928a84ae69483fb488John Reck    // Returns true if the current surface changed, false if it was already current
70f2dcc2aecb94e726096256c47b913ed0a57ae7e2John Reck    bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr);
71149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    Frame beginFrame(EGLSurface surface);
72149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    void damageFrame(const Frame& frame, const SkRect& dirty);
73c96955d9bb997b51be5fa929b5a67349d0459c3aJohn Reck    // If this returns true it is mandatory that swapBuffers is called
74c96955d9bb997b51be5fa929b5a67349d0459c3aJohn Reck    // if damageFrame is called without subsequent calls to damageFrame().
75c96955d9bb997b51be5fa929b5a67349d0459c3aJohn Reck    // See EGL_KHR_partial_update for more information
76c96955d9bb997b51be5fa929b5a67349d0459c3aJohn Reck    bool damageRequiresSwap();
77149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    bool swapBuffers(const Frame& frame, const SkRect& screenDirty);
783b20251a355c88193c439f928a84ae69483fb488John Reck
791125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    // Returns true iff the surface is now preserving buffers.
801125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    bool setPreserveBuffer(EGLSurface surface, bool preserve);
813b20251a355c88193c439f928a84ae69483fb488John Reck
823b20251a355c88193c439f928a84ae69483fb488John Reck    void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
833b20251a355c88193c439f928a84ae69483fb488John Reck
845515637540bedd8fc9a1a6e46a4b512dd45520a5John Reck    void fence();
855515637540bedd8fc9a1a6e46a4b512dd45520a5John Reck
863b20251a355c88193c439f928a84ae69483fb488John Reckprivate:
873b20251a355c88193c439f928a84ae69483fb488John Reck    friend class RenderThread;
883b20251a355c88193c439f928a84ae69483fb488John Reck
893b20251a355c88193c439f928a84ae69483fb488John Reck    EglManager(RenderThread& thread);
903b20251a355c88193c439f928a84ae69483fb488John Reck    // EglContext is never destroyed, method is purposely not implemented
913b20251a355c88193c439f928a84ae69483fb488John Reck    ~EglManager();
923b20251a355c88193c439f928a84ae69483fb488John Reck
93149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    void initExtensions();
94d7db4d767246b41d44995acb93d03d220b53c748John Reck    void createPBufferSurface();
95149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    void loadConfig();
963b20251a355c88193c439f928a84ae69483fb488John Reck    void createContext();
973b20251a355c88193c439f928a84ae69483fb488John Reck    void initAtlas();
98149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint queryBufferAge(EGLSurface surface);
9913d1b4ab10fbee5e81a2ba1ac59cfae1e51d3ef0Season Li
1003b20251a355c88193c439f928a84ae69483fb488John Reck    RenderThread& mRenderThread;
1013b20251a355c88193c439f928a84ae69483fb488John Reck
1023b20251a355c88193c439f928a84ae69483fb488John Reck    EGLDisplay mEglDisplay;
1033b20251a355c88193c439f928a84ae69483fb488John Reck    EGLConfig mEglConfig;
1043b20251a355c88193c439f928a84ae69483fb488John Reck    EGLContext mEglContext;
1053b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface mPBufferSurface;
1063b20251a355c88193c439f928a84ae69483fb488John Reck
1073b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface mCurrentSurface;
1083b20251a355c88193c439f928a84ae69483fb488John Reck
1093b20251a355c88193c439f928a84ae69483fb488John Reck    sp<GraphicBuffer> mAtlasBuffer;
1103b20251a355c88193c439f928a84ae69483fb488John Reck    int64_t* mAtlasMap;
1113b20251a355c88193c439f928a84ae69483fb488John Reck    size_t mAtlasMapSize;
11213d1b4ab10fbee5e81a2ba1ac59cfae1e51d3ef0Season Li
113149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    enum class SwapBehavior {
114149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck        Discard,
115149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck        Preserved,
116149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck        BufferAge,
117149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    };
118149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    SwapBehavior mSwapBehavior = SwapBehavior::Discard;
1193b20251a355c88193c439f928a84ae69483fb488John Reck};
1203b20251a355c88193c439f928a84ae69483fb488John Reck
1213b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace renderthread */
1223b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace uirenderer */
1233b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace android */
1243b20251a355c88193c439f928a84ae69483fb488John Reck
1253b20251a355c88193c439f928a84ae69483fb488John Reck#endif /* EGLMANAGER_H */
126