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