blob: fc3755e78f5bd2f721a68cfcd4e5bcb9e5de536d [file] [log] [blame]
Mathias Agopian3f844832013-08-07 21:24:32 -07001/*
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>
Peiyong Lin833074a2018-08-28 11:53:54 -070023#include <renderengine/private/Description.h>
24#include "ProgramCache.h"
Mathias Agopian3f844832013-08-07 21:24:32 -070025
26namespace android {
27
28class String8;
29
Peiyong Lin833074a2018-08-28 11:53:54 -070030namespace renderengine {
31namespace gl {
32
Mathias Agopian3f844832013-08-07 21:24:32 -070033/*
34 * Abstracts a GLSL program comprising a vertex and fragment shader
35 */
36class Program {
37public:
38 // known locations for position and texture coordinates
Lucas Dupin1b6531c2018-07-05 17:18:21 -070039 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 */
Vishnu Nair440992f2019-12-09 19:53:19 -080047 cropCoords = 2,
48
49 /* Shadow color */
50 shadowColor = 3,
51
52 /* Shadow params */
53 shadowParams = 4,
Lucas Dupin1b6531c2018-07-05 17:18:21 -070054 };
Mathias Agopian3f844832013-08-07 21:24:32 -070055
56 Program(const ProgramCache::Key& needs, const char* vertex, const char* fragment);
Chia-I Wud3b13cb2018-09-13 13:31:26 -070057 ~Program() = default;
Mathias Agopian3f844832013-08-07 21:24:32 -070058
59 /* whether this object is usable */
60 bool isValid() const;
61
62 /* Binds this program to the GLES context */
63 void use();
64
65 /* Returns the location of the specified attribute */
66 GLuint getAttrib(const char* name) const;
67
68 /* Returns the location of the specified uniform */
69 GLint getUniform(const char* name) const;
70
71 /* set-up uniforms from the description */
72 void setUniforms(const Description& desc);
73
Mathias Agopian3f844832013-08-07 21:24:32 -070074private:
75 GLuint buildShader(const char* source, GLenum type);
Mathias Agopian3f844832013-08-07 21:24:32 -070076
77 // whether the initialization succeeded
78 bool mInitialized;
79
80 // Name of the OpenGL program and shaders
81 GLuint mProgram;
82 GLuint mVertexShader;
83 GLuint mFragmentShader;
84
85 /* location of the projection matrix uniform */
86 GLint mProjectionMatrixLoc;
87
Mathias Agopian3f844832013-08-07 21:24:32 -070088 /* location of the texture matrix uniform */
89 GLint mTextureMatrixLoc;
90
91 /* location of the sampler uniform */
92 GLint mSamplerLoc;
93
Mathias Agopian3f844832013-08-07 21:24:32 -070094 /* location of the color uniform */
95 GLint mColorLoc;
Peiyong Linfb069302018-04-25 14:34:31 -070096
97 /* location of display luminance uniform */
98 GLint mDisplayMaxLuminanceLoc;
Peiyong Lin1a70eca2019-11-15 09:33:33 -080099 /* location of max mastering luminance uniform */
100 GLint mMaxMasteringLuminanceLoc;
101 /* location of max content luminance uniform */
102 GLint mMaxContentLuminanceLoc;
Peiyong Lina296b0c2018-04-30 16:55:29 -0700103
104 /* location of transform matrix */
105 GLint mInputTransformMatrixLoc;
106 GLint mOutputTransformMatrixLoc;
Lucas Dupin1b6531c2018-07-05 17:18:21 -0700107
108 /* location of corner radius uniform */
109 GLint mCornerRadiusLoc;
110
111 /* location of surface crop origin uniform, for rounded corner clipping */
112 GLint mCropCenterLoc;
Mathias Agopian3f844832013-08-07 21:24:32 -0700113};
114
Peiyong Lin46080ef2018-10-26 18:43:14 -0700115} // namespace gl
116} // namespace renderengine
117} // namespace android
Mathias Agopian3f844832013-08-07 21:24:32 -0700118
119#endif /* SF_RENDER_ENGINE_PROGRAM_H */