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