EglManager.h revision 149173d28c0843aba86b0810ce75b34be6a0d08f
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);
73149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    bool swapBuffers(const Frame& frame, const SkRect& screenDirty);
743b20251a355c88193c439f928a84ae69483fb488John Reck
751125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    // Returns true iff the surface is now preserving buffers.
761125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    bool setPreserveBuffer(EGLSurface surface, bool preserve);
773b20251a355c88193c439f928a84ae69483fb488John Reck
783b20251a355c88193c439f928a84ae69483fb488John Reck    void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
793b20251a355c88193c439f928a84ae69483fb488John Reck
805515637540bedd8fc9a1a6e46a4b512dd45520a5John Reck    void fence();
815515637540bedd8fc9a1a6e46a4b512dd45520a5John Reck
823b20251a355c88193c439f928a84ae69483fb488John Reckprivate:
833b20251a355c88193c439f928a84ae69483fb488John Reck    friend class RenderThread;
843b20251a355c88193c439f928a84ae69483fb488John Reck
853b20251a355c88193c439f928a84ae69483fb488John Reck    EglManager(RenderThread& thread);
863b20251a355c88193c439f928a84ae69483fb488John Reck    // EglContext is never destroyed, method is purposely not implemented
873b20251a355c88193c439f928a84ae69483fb488John Reck    ~EglManager();
883b20251a355c88193c439f928a84ae69483fb488John Reck
89149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    void initExtensions();
90d7db4d767246b41d44995acb93d03d220b53c748John Reck    void createPBufferSurface();
91149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    void loadConfig();
923b20251a355c88193c439f928a84ae69483fb488John Reck    void createContext();
933b20251a355c88193c439f928a84ae69483fb488John Reck    void initAtlas();
94149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    EGLint queryBufferAge(EGLSurface surface);
9513d1b4ab10fbee5e81a2ba1ac59cfae1e51d3ef0Season Li
963b20251a355c88193c439f928a84ae69483fb488John Reck    RenderThread& mRenderThread;
973b20251a355c88193c439f928a84ae69483fb488John Reck
983b20251a355c88193c439f928a84ae69483fb488John Reck    EGLDisplay mEglDisplay;
993b20251a355c88193c439f928a84ae69483fb488John Reck    EGLConfig mEglConfig;
1003b20251a355c88193c439f928a84ae69483fb488John Reck    EGLContext mEglContext;
1013b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface mPBufferSurface;
1023b20251a355c88193c439f928a84ae69483fb488John Reck
1033b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface mCurrentSurface;
1043b20251a355c88193c439f928a84ae69483fb488John Reck
1053b20251a355c88193c439f928a84ae69483fb488John Reck    sp<GraphicBuffer> mAtlasBuffer;
1063b20251a355c88193c439f928a84ae69483fb488John Reck    int64_t* mAtlasMap;
1073b20251a355c88193c439f928a84ae69483fb488John Reck    size_t mAtlasMapSize;
10813d1b4ab10fbee5e81a2ba1ac59cfae1e51d3ef0Season Li
109149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    enum class SwapBehavior {
110149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck        Discard,
111149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck        Preserved,
112149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck        BufferAge,
113149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    };
114149173d28c0843aba86b0810ce75b34be6a0d08fJohn Reck    SwapBehavior mSwapBehavior = SwapBehavior::Discard;
1153b20251a355c88193c439f928a84ae69483fb488John Reck};
1163b20251a355c88193c439f928a84ae69483fb488John Reck
1173b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace renderthread */
1183b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace uirenderer */
1193b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace android */
1203b20251a355c88193c439f928a84ae69483fb488John Reck
1213b20251a355c88193c439f928a84ae69483fb488John Reck#endif /* EGLMANAGER_H */
122