165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#ifndef ANDROID_FILTERFW_CORE_GL_ENV_H
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define ANDROID_FILTERFW_CORE_GL_ENV_H
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string>
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <utility>
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <map>
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "base/logging.h"
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "base/utilities.h"
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <GLES2/gl2.h>
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <EGL/egl.h>
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
30d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/IGraphicBufferProducer.h>
3152800617946c456e78ed010c82d0ec4358368164Mathias Agopian#include <gui/Surface.h>
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace android {
34e3eae73abb5e429d9747f9c36ab025219e68bb26Mathias Agopian
35e3eae73abb5e429d9747f9c36ab025219e68bb26Mathias Agopianclass GLConsumer;
36e3eae73abb5e429d9747f9c36ab025219e68bb26Mathias Agopian
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace filterfw {
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass ShaderProgram;
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass VertexFrame;
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass WindowHandle {
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  public:
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    virtual ~WindowHandle() {
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    virtual void Destroy() = 0;
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    virtual bool Equals(const WindowHandle* window) const {
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return InternalHandle() == window->InternalHandle();
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    virtual const void* InternalHandle() const = 0;
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    virtual void* InternalHandle() = 0;
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// The GLEnv class provides functionality related to the EGL environment, which
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// includes the display, context, and surface. It is possible to either create
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// a new environment or base it off the currently active EGL environment. In
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// order to do the latter, an EGL environment must be setup already (though not
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// necessarily through this class), and have an active display, context, and
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// surface.
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass GLEnv {
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  public:
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Constructing and Activating /////////////////////////////////////////////
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Constructs a new GLEnv object. This does not create a GL context.
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLEnv();
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Destructor. Tears down and deallocates any GL objects that were created
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // by this instance.
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ~GLEnv();
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Inits a new GL environment, including a new surface and context. You
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // must call Activate() before performing any GL operations.
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool InitWithNewContext();
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Inits the GL environment from the current GL environment. Use this when
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // there is already a display, surface and context available (possibly
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // created by the host application). You do not need to call Activate() as
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // this context is active already.
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool InitWithCurrentContext();
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Activates the environment, and makes the associated GL context the
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // current context. Creates the environment, if it has not been created
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // already. Returns true if the activation was successful.
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool Activate();
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Deactivates the environment. Returns true if the deactivation was
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // successful. You may want to call this when moving a context to another
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // thread. In this case, deactivate the GLEnv in the old thread, and
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // reactivate it in the new thread.
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool Deactivate();
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // When rendering to a visible surface, call this to swap between the
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // offscreen and onscreen buffers. Returns true if the buffer swap was
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // successful.
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool SwapBuffers();
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Working with Surfaces ///////////////////////////////////////////////////
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Add a surface to the environment. This surface will now be managed (and
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // owned) by the GLEnv instance. Returns the id of the surface.
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int AddSurface(const EGLSurface& surface);
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Add a window surface to the environment. The window is passed in as
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // an opaque window handle.
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // This surface will now be managed (and owned) by the GLEnv instance.
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns the id of the surface.
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int AddWindowSurface(const EGLSurface& surface, WindowHandle* window_handle);
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Switch to the surface with the specified id. This will make the surface
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // active, if it is not active already. Specify an ID of 0 if you would like
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // to switch to the default surface. Returns true if successful.
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool SwitchToSurfaceId(int surface_id);
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Release the surface with the specified id. This will deallocate the
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // surface. If this is the active surface, the environment will switch to
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // the default surface (0) first. You cannot release the default surface.
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool ReleaseSurfaceId(int surface_id);
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Set the timestamp for the current surface. Must be called
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // before swapBuffers to associate the timestamp with the frame
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // resulting from swapBuffers.
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool SetSurfaceTimestamp(int64_t timestamp);
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Looks for a surface with the associated window handle. Returns -1 if no
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // surface with such a window was found.
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int FindSurfaceIdForWindow(const WindowHandle* window_handle);
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Obtain the environment's EGL surface.
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const EGLSurface& surface() const {
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return surfaces_.find(surface_id_)->second.first;
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Working with Contexts ///////////////////////////////////////////////////
13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Add a context to the environment. This context will now be managed (and
13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // owned) by the GLEnv instance. Returns the id of the context.
14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int AddContext(const EGLContext& context);
14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Switch to the context with the specified id. This will make the context
14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // active, if it is not active already. Specify an ID of 0 if you would like
14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // to switch to the default context. Returns true if successful.
14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool SwitchToContextId(int context_id);
14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Release the context with the specified id. This will deallocate the
14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // context. If this is the active context, the environment will switch to
14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // the default context (0) first. You cannot release the default context.
15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    void ReleaseContextId(int context_id);
15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Obtain the environment's EGL context.
15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const EGLContext& context() const {
15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return contexts_.find(context_id_)->second;
15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Working with the Display ////////////////////////////////////////////////
15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Obtain the environment's EGL display.
16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const EGLDisplay& display() const {
16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return display_;
16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Inspecting the environment //////////////////////////////////////////////
16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if the environment is active in the current thread.
16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool IsActive() const;
16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if the environment's context is active in the curent thread.
16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool IsContextActive() const;
17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if there is any EGL context active in the current thread.
17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // This need not be a context created by a GLEnv instance.
17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    static bool IsAnyContextActive();
17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Attaching GL objects ////////////////////////////////////////////////////
17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Attach a shader to the environment. The environment takes ownership of
17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // the shader.
17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    void AttachShader(int key, ShaderProgram* shader);
18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Attach a vertex frame to the environment. The environment takes ownership
18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // of the frame.
18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    void AttachVertexFrame(int key, VertexFrame* frame);
18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Return the shader with the specified key, or NULL if there is no such
18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // shader attached to this environment.
18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ShaderProgram* ShaderWithKey(int key);
18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Return the vertex frame with the specified key, or NULL if there is no
19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // such frame attached to this environment.
19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    VertexFrame* VertexFrameWithKey(int key);
19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Static methods //////////////////////////////////////////////////////////
19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // These operate on the currently active environment!
19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Checks if the current environment is in a GL error state. If so, it will
19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // output an error message referencing the given operation string. Returns
19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // true if there was at least one error.
19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    static bool CheckGLError(const std::string& operation);
20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Checks if the current environment is in an EGL error state. If so, it
20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // will output an error message referencing the given operation string.
20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if there was at least one error.
20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    static bool CheckEGLError(const std::string& operation);
20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the currently used (shader) program.
20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    static GLuint GetCurrentProgram();
20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the currently active display.
21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    static EGLDisplay GetCurrentDisplay();
21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns the number of components for a given GL type. For instance,
21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // returns 4 for vec4, and 16 for mat4.
21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    static int NumberOfComponents(GLenum type);
21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  private:
21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    typedef std::pair<EGLSurface, WindowHandle*> SurfaceWindowPair;
21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Initializes a new GL environment.
22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool Init();
22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if one of the Inits has been called successfully on this
22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // instance.
22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool IsInitialized() const;
22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Outputs error messages specific to the operation eglMakeCurrent().
22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if there was at least one error.
22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    static bool CheckEGLMakeCurrentError();
22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The EGL display, contexts, and surfaces.
23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    EGLDisplay display_;
23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    std::map<int, EGLContext> contexts_;
23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    std::map<int, SurfaceWindowPair> surfaces_;
23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The currently active context and surface ids.
23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int context_id_;
23765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int surface_id_;
23865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
23965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Dummy surface for context
24065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    sp<ANativeWindow> window_;
24165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
242d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    // Dummy GLConsumer for context
243d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<GLConsumer> surfaceTexture_;
24465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
24565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The maximum surface id used.
24665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int max_surface_id_;
24765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
24865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // These bools keep track of which objects this GLEnv has created (and
24965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // owns).
25065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool created_context_;
25165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool created_surface_;
25265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool initialized_;
25365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
25465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Attachments that GL objects can add to the environment.
25565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    std::map<int, ShaderProgram*> attached_shaders_;
25665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    std::map<int, VertexFrame*> attached_vframes_;
25765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
25865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    DISALLOW_COPY_AND_ASSIGN(GLEnv);
25965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
26065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
26165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace filterfw
26265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace android
26365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
26465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif  // ANDROID_FILTERFW_CORE_GL_ENV_H
265