WarpRenderer.h revision eeb94d4de94bfd4e01f3a716803f77a530f5b92c
1eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal#pragma once
2eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
3eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal#include "FrameBuffer.h"
4eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
5eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal#include <GLES2/gl2.h>
6eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
7eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal#include <stdint.h>
8eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal#include <stdio.h>
9eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal#include <stdlib.h>
10eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
11eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansalclass WarpRenderer {
12eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal  public:
13eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    WarpRenderer();
14eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    virtual ~WarpRenderer();
15eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
16eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    // Initialize OpenGL resources
17eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    // @return true if successful
18eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    bool InitializeGLProgram();
19eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
20eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    bool SetupGraphics(FrameBuffer* buffer);
21eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    bool SetupGraphics(int width, int height);
22eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
23eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    bool Clear(float r, float g, float b, float a);
24eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
25eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    void SetViewportMatrix(int w, int h, int W, int H);
26eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    void SetScalingMatrix(float xscale, float yscale);
27eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    bool DrawTexture(GLfloat *affine);
28eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
29eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    int GetTextureName();
30eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    void SetInputTextureName(GLuint textureName);
31eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    void SetInputTextureDimensions(int width, int height);
32eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
33eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    void InitializeGLContext();
34eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
35eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal  protected:
36eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
37eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLuint loadShader(GLenum shaderType, const char* pSource);
38eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLuint createProgram(const char*, const char* );
39eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
40eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    int SurfaceWidth() const { return mSurfaceWidth; }
41eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    int SurfaceHeight() const { return mSurfaceHeight; }
42eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
43eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal private:
44eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    // Source code for shaders.
45eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    virtual const char* VertexShaderSource() const;
46eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    virtual const char* FragmentShaderSource() const;
47eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
48eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    // Redefine this to use special texture types such as
49eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    // GL_TEXTURE_EXTERNAL_OES.
50eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    virtual GLenum InputTextureType() const { return GL_TEXTURE_2D; }
51eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
52eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
53eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLuint mGlProgram;
54eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLuint mInputTextureName;
55eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    int mInputTextureWidth;
56eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    int mInputTextureHeight;
57eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
58eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLuint mTexHandle;                  // Handle to s_texture.
59eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLuint mTexCoordHandle;             // Handle to a_texCoord.
60eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLuint mTriangleVerticesHandle;     // Handle to vPosition.
61eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
62eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    // Attribute locations
63eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLint  mPositionLoc;
64eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLint  mAffinetransLoc;
65eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLint  mViewporttransLoc;
66eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLint  mScalingtransLoc;
67eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLint  mTexCoordLoc;
68eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
69eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLfloat mViewportMatrix[16];
70eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLfloat mScalingMatrix[16];
71eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
72eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    // Sampler location
73eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    GLint mSamplerLoc;
74eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
75eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    int mSurfaceWidth;      // Width of target surface.
76eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    int mSurfaceHeight;     // Height of target surface.
77eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
78eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal    FrameBuffer *mFrameBuffer;
79eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal};
80eeb94d4de94bfd4e01f3a716803f77a530f5b92cmbansal
81