1441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
2441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Copyright 2013 The Android Open Source Project
3441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
4441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5441e847feb0e055ecb004802802cea07782ab228Andy McFadden * you may not use this file except in compliance with the License.
6441e847feb0e055ecb004802802cea07782ab228Andy McFadden * You may obtain a copy of the License at
7441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
8441e847feb0e055ecb004802802cea07782ab228Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
10441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Unless required by applicable law or agreed to in writing, software
11441e847feb0e055ecb004802802cea07782ab228Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12441e847feb0e055ecb004802802cea07782ab228Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13441e847feb0e055ecb004802802cea07782ab228Andy McFadden * See the License for the specific language governing permissions and
14441e847feb0e055ecb004802802cea07782ab228Andy McFadden * limitations under the License.
15441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
16441e847feb0e055ecb004802802cea07782ab228Andy McFadden
17441e847feb0e055ecb004802802cea07782ab228Andy McFadden#ifndef SCREENRECORD_PROGRAM_H
18441e847feb0e055ecb004802802cea07782ab228Andy McFadden#define SCREENRECORD_PROGRAM_H
19441e847feb0e055ecb004802802cea07782ab228Andy McFadden
20441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <utils/Errors.h>
21441e847feb0e055ecb004802802cea07782ab228Andy McFadden
22441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <EGL/egl.h>
23441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <GLES2/gl2.h>
24441e847feb0e055ecb004802802cea07782ab228Andy McFadden
25441e847feb0e055ecb004802802cea07782ab228Andy McFaddennamespace android {
26441e847feb0e055ecb004802802cea07782ab228Andy McFadden
27441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
28441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Utility class for GLES rendering.
29441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
30441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Not thread-safe.
31441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
32441e847feb0e055ecb004802802cea07782ab228Andy McFaddenclass Program {
33441e847feb0e055ecb004802802cea07782ab228Andy McFaddenpublic:
34441e847feb0e055ecb004802802cea07782ab228Andy McFadden    enum ProgramType { PROGRAM_UNKNOWN=0, PROGRAM_EXTERNAL_TEXTURE,
35441e847feb0e055ecb004802802cea07782ab228Andy McFadden            PROGRAM_TEXTURE_2D };
36441e847feb0e055ecb004802802cea07782ab228Andy McFadden
37441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Program() :
38441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mProgramType(PROGRAM_UNKNOWN),
39441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mProgram(0),
40441e847feb0e055ecb004802802cea07782ab228Andy McFadden        maPositionLoc(0),
41441e847feb0e055ecb004802802cea07782ab228Andy McFadden        maTextureCoordLoc(0),
42441e847feb0e055ecb004802802cea07782ab228Andy McFadden        muMVPMatrixLoc(0),
43441e847feb0e055ecb004802802cea07782ab228Andy McFadden        muGLCMatrixLoc(0),
44441e847feb0e055ecb004802802cea07782ab228Andy McFadden        muTextureLoc(0)
45441e847feb0e055ecb004802802cea07782ab228Andy McFadden        {}
46441e847feb0e055ecb004802802cea07782ab228Andy McFadden    ~Program() { release(); }
47441e847feb0e055ecb004802802cea07782ab228Andy McFadden
48441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Initialize the program for use with the specified texture type.
49441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t setup(ProgramType type);
50441e847feb0e055ecb004802802cea07782ab228Andy McFadden
51441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Release the program and associated resources.
52441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void release();
53441e847feb0e055ecb004802802cea07782ab228Andy McFadden
54587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Blit the specified texture to { x, y, x+w, y+h }.  Inverts the
55587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // content if "invert" is set.
56441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t blit(GLuint texName, const float* texMatrix,
57587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden            int32_t x, int32_t y, int32_t w, int32_t h,
58587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden            bool invert = false) const;
59441e847feb0e055ecb004802802cea07782ab228Andy McFadden
60441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Draw a number of triangles.
61441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t drawTriangles(GLuint texName, const float* texMatrix,
62441e847feb0e055ecb004802802cea07782ab228Andy McFadden            const float* vertices, const float* texes, size_t count) const;
63441e847feb0e055ecb004802802cea07782ab228Andy McFadden
64441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static const float kIdentity[];
65441e847feb0e055ecb004802802cea07782ab228Andy McFadden
66441e847feb0e055ecb004802802cea07782ab228Andy McFaddenprivate:
67441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Program(const Program&);
68441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Program& operator=(const Program&);
69441e847feb0e055ecb004802802cea07782ab228Andy McFadden
70441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Common code for draw functions.
71441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t beforeDraw(GLuint texName, const float* texMatrix,
72587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden            const float* vertices, const float* texes, bool invert) const;
73441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t afterDraw() const;
74441e847feb0e055ecb004802802cea07782ab228Andy McFadden
75441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // GLES 2 shader utilities.
76441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t createProgram(GLuint* outPgm, const char* vertexShader,
77441e847feb0e055ecb004802802cea07782ab228Andy McFadden            const char* fragmentShader);
78441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static status_t compileShader(GLenum shaderType, const char* src,
79441e847feb0e055ecb004802802cea07782ab228Andy McFadden            GLuint* outShader);
80441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static status_t linkShaderProgram(GLuint vs, GLuint fs, GLuint* outPgm);
81441e847feb0e055ecb004802802cea07782ab228Andy McFadden
82441e847feb0e055ecb004802802cea07782ab228Andy McFadden    ProgramType mProgramType;
83441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLuint mProgram;
84441e847feb0e055ecb004802802cea07782ab228Andy McFadden
85441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLint maPositionLoc;
86441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLint maTextureCoordLoc;
87441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLint muMVPMatrixLoc;
88441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLint muGLCMatrixLoc;
89441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLint muTextureLoc;
90441e847feb0e055ecb004802802cea07782ab228Andy McFadden};
91441e847feb0e055ecb004802802cea07782ab228Andy McFadden
92441e847feb0e055ecb004802802cea07782ab228Andy McFadden}; // namespace android
93441e847feb0e055ecb004802802cea07782ab228Andy McFadden
94441e847feb0e055ecb004802802cea07782ab228Andy McFadden#endif /*SCREENRECORD_PROGRAM_H*/
95