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_FRAME_H
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define ANDROID_FILTERFW_CORE_GL_FRAME_H
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <map>
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <GLES2/gl2.h>
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "core/gl_buffer_interface.h"
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace android {
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace filterfw {
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass GLEnv;
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass ShaderProgram;
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// A GLFrame stores pixel data on the GPU. While pixel data may be uploaded to
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// a GLFrame and also read out of a GLFrame (access in place is not supported),
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// it is strongly recommended to use ShaderProgram objects for any kind of
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// processing from one GLFrame to another.
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass GLFrame : public GLBufferHandle {
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  public:
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Create an empty GL frame in the specified GL environment. Note, that the GLFrame does NOT
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // take ownership. The caller must make sure the GLEnv stays valid as long as the GLFrame is
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // alive.
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLFrame(GLEnv* gl_env);
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Deallocate a GL frame.
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ~GLFrame();
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Initialize a GL frame to the given width, height, format. Also specify
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // whether this is a read-only GL frame or not.
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool Init(int width, int height);
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Initialize as using an external texture.
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool InitWithExternalTexture();
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Initialize using an existing texture.
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool InitWithTexture(GLint texture_id, int width, int height);
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Initialize using an existing FBO.
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool InitWithFbo(GLint fbo_id, int width, int height);
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Write the data with the given size in bytes to the frame. The frame size must match the
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // size of the data.
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool WriteData(const uint8_t* data, int size);
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Copies the frame data to the given buffer.
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool CopyDataTo(uint8_t* buffer, int size);
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Copies the pixels from another GL frame to this frame.
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool CopyPixelsFrom(const GLFrame* frame);
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns the size of the buffer in bytes.
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int Size() const;
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Clone the current frame by creating a new GL frame and copying all data to it.
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLFrame* Clone() const;
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns the held texture id. Only call this if the GLFrame holds a
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // texture. You can check this by calling HoldsTexture().
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Note, that a texture is created only when needed. If you are creating a
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // new GLFrame, and you need it to be bound to a texture, upload (zeroed)
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // data to it first, before calling this method.
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLuint GetTextureId() const;
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns the held FBO id. Only call this if the GLFrame holds an FBO. You
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // can check this by calling HoldsFbo().
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLuint GetFboId() const;
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns the texture target: GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES.
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLuint GetTextureTarget() const {
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return texture_target_;
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Set the viewport that will be used when focusing this frame for rendering. Defaults to
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // the dimensions of the frame.
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool SetViewport(int x, int y, int width, int height);
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Binds the held texture. This may result in creating the texture if it
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // is not yet available.
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool FocusTexture();
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Binds the held FBO. This may result in creating the FBO if it
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // is not yet available.
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool FocusFrameBuffer();
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Generates the mipmap chain of the held texture. Returns true, iff
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // generating was successful.
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool GenerateMipMap();
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Set a texture parameter (see glTextureParameter documentation). Returns
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // true iff the parameter was set successfully.
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool SetTextureParameter(GLenum pname, GLint value);
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Reset any modifed texture parameters.
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool ResetTexParameters();
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Detaches the internal texture from the FBO.
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool DetachTextureFromFbo();
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Reattaches the internal texture to the FBO after detachment.
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool ReattachTextureToFbo();
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  private:
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Type to keep track of texture and FBO states
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    enum GLObjectState {
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      kStateUnmanaged,      // We do not manage this object (externally managed)
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      kStateUninitialized,  // Not yet initialized
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      kStateGenerated,      // Tex/FBO id is generated
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      kStateComplete        // FBO has valid attachment / Tex has valid pixel data
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    };
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Sets the frame and viewport dimensions.
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    void InitDimensions(int width, int height);
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Generates the internal texture name.
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool GenerateTextureName();
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Allocates the internal texture.
13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool AllocateTexture();
13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Creates the internal FBO.
13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool GenerateFboName();
14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Copies pixels from texture or FBO to the specified buffer.
14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool CopyPixelsTo(uint8_t* buffer);
14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Reads the pixels from the internal texture to the given buffer.
14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool ReadTexturePixels(uint8_t* pixels) const;
14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Reads the pixels from the internal FBO to the given buffer.
14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool ReadFboPixels(uint8_t* pixels) const;
14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Writes the specified pixels to the internal texture.
15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool UploadTexturePixels(const uint8_t* pixels);
15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Binds the internal texture.
15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool BindTexture() const;
15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Binds the internal FBO.
15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool BindFrameBuffer() const;
15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Attaches the internal texture to the internal FBO.
16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool AttachTextureToFbo();
16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Update the texture parameters to the user specified parameters
16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool UpdateTexParameters();
16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if the current texture parameters are not the GLES2
16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // default parameters.
16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool TexParametersModifed();
16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Sets the current texture parameters to the GLES2 default
17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // parameters. This still requires a call to UpdateTexParameters()
17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // for the changes to take effect.
17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    void SetDefaultTexParameters();
17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Returns true if the texture we assume to be allocated has been
17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // deleted externally. In this case we assume the texture name is
17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // still valid (otherwise we were provided with a bad texture id).
17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool TextureWasDeleted() const;
17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the (cached) identity shader.
18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ShaderProgram* GetIdentity() const;
18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The GL environment this frame belongs to
18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLEnv* gl_env_;
18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The width, height and format of the frame
18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int width_;
18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int height_;
18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The viewport dimensions
19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int vp_x_;
19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int vp_y_;
19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int vp_width_;
19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    int vp_height_;
19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The texture and FBO ids
19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLuint texture_id_;
19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLuint fbo_id_;
19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // The texture target: GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES
20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLuint texture_target_;
20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Flags whether or not frame holds a texture and FBO
20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLObjectState texture_state_;
20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLObjectState fbo_state_;
20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Set of current texture parameters
20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    std::map<GLenum, GLint> tex_params_;
20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Flag whether frame owns the texture and FBO
21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool owns_texture_;
21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    bool owns_fbo_;
21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace filterfw
21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace android
21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif  // ANDROID_FILTERFW_CORE_GL_FRAME_H
218