1 /* 2 * Copyright 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef SF_RENDER_ENGINE_PROGRAM_H 18 #define SF_RENDER_ENGINE_PROGRAM_H 19 20 #include <stdint.h> 21 22 #include <GLES2/gl2.h> 23 #include <renderengine/private/Description.h> 24 #include "ProgramCache.h" 25 26 namespace android { 27 28 class String8; 29 30 namespace renderengine { 31 namespace gl { 32 33 /* 34 * Abstracts a GLSL program comprising a vertex and fragment shader 35 */ 36 class Program { 37 public: 38 // known locations for position and texture coordinates 39 enum { 40 /* position of each vertex for vertex shader */ 41 position = 0, 42 43 /* UV coordinates for texture mapping */ 44 texCoords = 1, 45 46 /* Crop coordinates, in pixels */ 47 cropCoords = 2 48 }; 49 50 Program(const ProgramCache::Key& needs, const char* vertex, const char* fragment); 51 ~Program() = default; 52 53 /* whether this object is usable */ 54 bool isValid() const; 55 56 /* Binds this program to the GLES context */ 57 void use(); 58 59 /* Returns the location of the specified attribute */ 60 GLuint getAttrib(const char* name) const; 61 62 /* Returns the location of the specified uniform */ 63 GLint getUniform(const char* name) const; 64 65 /* set-up uniforms from the description */ 66 void setUniforms(const Description& desc); 67 68 private: 69 GLuint buildShader(const char* source, GLenum type); 70 71 // whether the initialization succeeded 72 bool mInitialized; 73 74 // Name of the OpenGL program and shaders 75 GLuint mProgram; 76 GLuint mVertexShader; 77 GLuint mFragmentShader; 78 79 /* location of the projection matrix uniform */ 80 GLint mProjectionMatrixLoc; 81 82 /* location of the texture matrix uniform */ 83 GLint mTextureMatrixLoc; 84 85 /* location of the sampler uniform */ 86 GLint mSamplerLoc; 87 88 /* location of the color uniform */ 89 GLint mColorLoc; 90 91 /* location of display luminance uniform */ 92 GLint mDisplayMaxLuminanceLoc; 93 94 /* location of transform matrix */ 95 GLint mInputTransformMatrixLoc; 96 GLint mOutputTransformMatrixLoc; 97 98 /* location of corner radius uniform */ 99 GLint mCornerRadiusLoc; 100 101 /* location of surface crop origin uniform, for rounded corner clipping */ 102 GLint mCropCenterLoc; 103 }; 104 105 } // namespace gl 106 } // namespace renderengine 107 } // namespace android 108 109 #endif /* SF_RENDER_ENGINE_PROGRAM_H */ 110