summaryrefslogtreecommitdiffstats
path: root/media/mca/filterfw/native/core/gl_frame.h
diff options
context:
space:
mode:
Diffstat (limited to 'media/mca/filterfw/native/core/gl_frame.h')
-rw-r--r--media/mca/filterfw/native/core/gl_frame.h217
1 files changed, 217 insertions, 0 deletions
diff --git a/media/mca/filterfw/native/core/gl_frame.h b/media/mca/filterfw/native/core/gl_frame.h
new file mode 100644
index 0000000..f2a1ad5
--- /dev/null
+++ b/media/mca/filterfw/native/core/gl_frame.h
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_FILTERFW_CORE_GL_FRAME_H
+#define ANDROID_FILTERFW_CORE_GL_FRAME_H
+
+#include <map>
+
+#include <GLES2/gl2.h>
+
+#include "core/gl_buffer_interface.h"
+
+namespace android {
+namespace filterfw {
+
+class GLEnv;
+class ShaderProgram;
+
+// A GLFrame stores pixel data on the GPU. While pixel data may be uploaded to
+// a GLFrame and also read out of a GLFrame (access in place is not supported),
+// it is strongly recommended to use ShaderProgram objects for any kind of
+// processing from one GLFrame to another.
+class GLFrame : public GLBufferHandle {
+ public:
+ // Create an empty GL frame in the specified GL environment. Note, that the GLFrame does NOT
+ // take ownership. The caller must make sure the GLEnv stays valid as long as the GLFrame is
+ // alive.
+ GLFrame(GLEnv* gl_env);
+
+ // Deallocate a GL frame.
+ ~GLFrame();
+
+ // Initialize a GL frame to the given width, height, format. Also specify
+ // whether this is a read-only GL frame or not.
+ bool Init(int width, int height);
+
+ // Initialize as using an external texture.
+ bool InitWithExternalTexture();
+
+ // Initialize using an existing texture.
+ bool InitWithTexture(GLint texture_id, int width, int height);
+
+ // Initialize using an existing FBO.
+ bool InitWithFbo(GLint fbo_id, int width, int height);
+
+ // Write the data with the given size in bytes to the frame. The frame size must match the
+ // size of the data.
+ bool WriteData(const uint8_t* data, int size);
+
+ // Copies the frame data to the given buffer.
+ bool CopyDataTo(uint8_t* buffer, int size);
+
+ // Copies the pixels from another GL frame to this frame.
+ bool CopyPixelsFrom(const GLFrame* frame);
+
+ // Returns the size of the buffer in bytes.
+ int Size() const;
+
+ // Clone the current frame by creating a new GL frame and copying all data to it.
+ GLFrame* Clone() const;
+
+ // Returns the held texture id. Only call this if the GLFrame holds a
+ // texture. You can check this by calling HoldsTexture().
+ // Note, that a texture is created only when needed. If you are creating a
+ // new GLFrame, and you need it to be bound to a texture, upload (zeroed)
+ // data to it first, before calling this method.
+ GLuint GetTextureId() const;
+
+ // Returns the held FBO id. Only call this if the GLFrame holds an FBO. You
+ // can check this by calling HoldsFbo().
+ GLuint GetFboId() const;
+
+ // Returns the texture target: GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES.
+ GLuint GetTextureTarget() const {
+ return texture_target_;
+ }
+
+ // Set the viewport that will be used when focusing this frame for rendering. Defaults to
+ // the dimensions of the frame.
+ bool SetViewport(int x, int y, int width, int height);
+
+ // Binds the held texture. This may result in creating the texture if it
+ // is not yet available.
+ bool FocusTexture();
+
+ // Binds the held FBO. This may result in creating the FBO if it
+ // is not yet available.
+ bool FocusFrameBuffer();
+
+ // Generates the mipmap chain of the held texture. Returns true, iff
+ // generating was successful.
+ bool GenerateMipMap();
+
+ // Set a texture parameter (see glTextureParameter documentation). Returns
+ // true iff the parameter was set successfully.
+ bool SetTextureParameter(GLenum pname, GLint value);
+
+ // Reset any modifed texture parameters.
+ bool ResetTexParameters();
+
+ // Detaches the internal texture from the FBO.
+ bool DetachTextureFromFbo();
+
+ // Reattaches the internal texture to the FBO after detachment.
+ bool ReattachTextureToFbo();
+
+ private:
+ // Type to keep track of texture and FBO states
+ enum GLObjectState {
+ kStateUnmanaged, // We do not manage this object (externally managed)
+ kStateUninitialized, // Not yet initialized
+ kStateGenerated, // Tex/FBO id is generated
+ kStateComplete // FBO has valid attachment / Tex has valid pixel data
+ };
+
+ // Sets the frame and viewport dimensions.
+ void InitDimensions(int width, int height);
+
+ // Generates the internal texture name.
+ bool GenerateTextureName();
+
+ // Allocates the internal texture.
+ bool AllocateTexture();
+
+ // Creates the internal FBO.
+ bool GenerateFboName();
+
+ // Copies pixels from texture or FBO to the specified buffer.
+ bool CopyPixelsTo(uint8_t* buffer);
+
+ // Reads the pixels from the internal texture to the given buffer.
+ bool ReadTexturePixels(uint8_t* pixels) const;
+
+ // Reads the pixels from the internal FBO to the given buffer.
+ bool ReadFboPixels(uint8_t* pixels) const;
+
+ // Writes the specified pixels to the internal texture.
+ bool UploadTexturePixels(const uint8_t* pixels);
+
+ // Binds the internal texture.
+ bool BindTexture() const;
+
+ // Binds the internal FBO.
+ bool BindFrameBuffer() const;
+
+ // Attaches the internal texture to the internal FBO.
+ bool AttachTextureToFbo();
+
+ // Update the texture parameters to the user specified parameters
+ bool UpdateTexParameters();
+
+ // Returns true if the current texture parameters are not the GLES2
+ // default parameters.
+ bool TexParametersModifed();
+
+ // Sets the current texture parameters to the GLES2 default
+ // parameters. This still requires a call to UpdateTexParameters()
+ // for the changes to take effect.
+ void SetDefaultTexParameters();
+
+ // Returns true if the texture we assume to be allocated has been
+ // deleted externally. In this case we assume the texture name is
+ // still valid (otherwise we were provided with a bad texture id).
+ bool TextureWasDeleted() const;
+
+ // Get the (cached) identity shader.
+ ShaderProgram* GetIdentity() const;
+
+ // The GL environment this frame belongs to
+ GLEnv* gl_env_;
+
+ // The width, height and format of the frame
+ int width_;
+ int height_;
+
+ // The viewport dimensions
+ int vp_x_;
+ int vp_y_;
+ int vp_width_;
+ int vp_height_;
+
+ // The texture and FBO ids
+ GLuint texture_id_;
+ GLuint fbo_id_;
+
+ // The texture target: GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES
+ GLuint texture_target_;
+
+ // Flags whether or not frame holds a texture and FBO
+ GLObjectState texture_state_;
+ GLObjectState fbo_state_;
+
+ // Set of current texture parameters
+ std::map<GLenum, GLint> tex_params_;
+
+ // Flag whether frame owns the texture and FBO
+ bool owns_texture_;
+ bool owns_fbo_;
+};
+
+} // namespace filterfw
+} // namespace android
+
+#endif // ANDROID_FILTERFW_CORE_GL_FRAME_H