EglManager.h revision 1125d1fa92ab9f3b8315bbfb72e038b62dfd454b
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>
213b20251a355c88193c439f928a84ae69483fb488John Reck#include <ui/GraphicBuffer.h>
223b20251a355c88193c439f928a84ae69483fb488John Reck#include <utils/StrongPointer.h>
233b20251a355c88193c439f928a84ae69483fb488John Reck
243b20251a355c88193c439f928a84ae69483fb488John Recknamespace android {
253b20251a355c88193c439f928a84ae69483fb488John Recknamespace uirenderer {
263b20251a355c88193c439f928a84ae69483fb488John Recknamespace renderthread {
273b20251a355c88193c439f928a84ae69483fb488John Reck
283b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderThread;
293b20251a355c88193c439f928a84ae69483fb488John Reck
303b20251a355c88193c439f928a84ae69483fb488John Reck// This class contains the shared global EGL objects, such as EGLDisplay
313b20251a355c88193c439f928a84ae69483fb488John Reck// and EGLConfig, which are re-used by CanvasContext
323b20251a355c88193c439f928a84ae69483fb488John Reckclass EglManager {
333b20251a355c88193c439f928a84ae69483fb488John Reckpublic:
343b20251a355c88193c439f928a84ae69483fb488John Reck    // Returns true on success, false on failure
353b20251a355c88193c439f928a84ae69483fb488John Reck    void initialize();
363b20251a355c88193c439f928a84ae69483fb488John Reck
373b20251a355c88193c439f928a84ae69483fb488John Reck    bool hasEglContext();
383b20251a355c88193c439f928a84ae69483fb488John Reck    void requireGlContext();
393b20251a355c88193c439f928a84ae69483fb488John Reck
403b20251a355c88193c439f928a84ae69483fb488John Reck    void usePBufferSurface();
413b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface createSurface(EGLNativeWindowType window);
423b20251a355c88193c439f928a84ae69483fb488John Reck    void destroySurface(EGLSurface surface);
433b20251a355c88193c439f928a84ae69483fb488John Reck
443b20251a355c88193c439f928a84ae69483fb488John Reck    void destroy();
453b20251a355c88193c439f928a84ae69483fb488John Reck
463b20251a355c88193c439f928a84ae69483fb488John Reck    bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; }
473b20251a355c88193c439f928a84ae69483fb488John Reck    // Returns true if the current surface changed, false if it was already current
483b20251a355c88193c439f928a84ae69483fb488John Reck    bool makeCurrent(EGLSurface surface);
493b20251a355c88193c439f928a84ae69483fb488John Reck    void beginFrame(EGLSurface surface, EGLint* width, EGLint* height);
502cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5eaJohn Reck    bool swapBuffers(EGLSurface surface);
513b20251a355c88193c439f928a84ae69483fb488John Reck
521125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    // Returns true iff the surface is now preserving buffers.
531125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    bool setPreserveBuffer(EGLSurface surface, bool preserve);
543b20251a355c88193c439f928a84ae69483fb488John Reck
553b20251a355c88193c439f928a84ae69483fb488John Reck    void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
563b20251a355c88193c439f928a84ae69483fb488John Reck
573b20251a355c88193c439f928a84ae69483fb488John Reckprivate:
583b20251a355c88193c439f928a84ae69483fb488John Reck    friend class RenderThread;
593b20251a355c88193c439f928a84ae69483fb488John Reck
603b20251a355c88193c439f928a84ae69483fb488John Reck    EglManager(RenderThread& thread);
613b20251a355c88193c439f928a84ae69483fb488John Reck    // EglContext is never destroyed, method is purposely not implemented
623b20251a355c88193c439f928a84ae69483fb488John Reck    ~EglManager();
633b20251a355c88193c439f928a84ae69483fb488John Reck
643b20251a355c88193c439f928a84ae69483fb488John Reck    void loadConfig();
653b20251a355c88193c439f928a84ae69483fb488John Reck    void createContext();
663b20251a355c88193c439f928a84ae69483fb488John Reck    void initAtlas();
673b20251a355c88193c439f928a84ae69483fb488John Reck
683b20251a355c88193c439f928a84ae69483fb488John Reck    RenderThread& mRenderThread;
693b20251a355c88193c439f928a84ae69483fb488John Reck
703b20251a355c88193c439f928a84ae69483fb488John Reck    EGLDisplay mEglDisplay;
713b20251a355c88193c439f928a84ae69483fb488John Reck    EGLConfig mEglConfig;
723b20251a355c88193c439f928a84ae69483fb488John Reck    EGLContext mEglContext;
733b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface mPBufferSurface;
743b20251a355c88193c439f928a84ae69483fb488John Reck
751125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    const bool mAllowPreserveBuffer;
761125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    bool mCanSetPreserveBuffer;
773b20251a355c88193c439f928a84ae69483fb488John Reck
783b20251a355c88193c439f928a84ae69483fb488John Reck    EGLSurface mCurrentSurface;
793b20251a355c88193c439f928a84ae69483fb488John Reck
803b20251a355c88193c439f928a84ae69483fb488John Reck    sp<GraphicBuffer> mAtlasBuffer;
813b20251a355c88193c439f928a84ae69483fb488John Reck    int64_t* mAtlasMap;
823b20251a355c88193c439f928a84ae69483fb488John Reck    size_t mAtlasMapSize;
833b20251a355c88193c439f928a84ae69483fb488John Reck};
843b20251a355c88193c439f928a84ae69483fb488John Reck
853b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace renderthread */
863b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace uirenderer */
873b20251a355c88193c439f928a84ae69483fb488John Reck} /* namespace android */
883b20251a355c88193c439f928a84ae69483fb488John Reck
893b20251a355c88193c439f928a84ae69483fb488John Reck#endif /* EGLMANAGER_H */
90