xref: /aosp_15_r20/frameworks/native/cmds/flatland/Renderers.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include "Flatland.h"
18*38e8c45fSAndroid Build Coastguard Worker #include "GLHelper.h"
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker namespace android {
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker static float colors[][4] = {
23*38e8c45fSAndroid Build Coastguard Worker     { .85f, .14f, .44f, 1.0f },
24*38e8c45fSAndroid Build Coastguard Worker     { .91f, .72f, .10f, 1.0f },
25*38e8c45fSAndroid Build Coastguard Worker     { .04f, .66f, .42f, 1.0f },
26*38e8c45fSAndroid Build Coastguard Worker     { .84f, .39f, .68f, 1.0f },
27*38e8c45fSAndroid Build Coastguard Worker     { .38f, .53f, .78f, 1.0f },
28*38e8c45fSAndroid Build Coastguard Worker };
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker static size_t g_colorIndex;
31*38e8c45fSAndroid Build Coastguard Worker 
genColor()32*38e8c45fSAndroid Build Coastguard Worker const float* genColor() {
33*38e8c45fSAndroid Build Coastguard Worker     float* color = colors[g_colorIndex];
34*38e8c45fSAndroid Build Coastguard Worker     g_colorIndex = (g_colorIndex + 1) % NELEMS(colors);
35*38e8c45fSAndroid Build Coastguard Worker     return color;
36*38e8c45fSAndroid Build Coastguard Worker }
37*38e8c45fSAndroid Build Coastguard Worker 
resetColorGenerator()38*38e8c45fSAndroid Build Coastguard Worker void resetColorGenerator() {
39*38e8c45fSAndroid Build Coastguard Worker     g_colorIndex = 0;
40*38e8c45fSAndroid Build Coastguard Worker }
41*38e8c45fSAndroid Build Coastguard Worker 
42*38e8c45fSAndroid Build Coastguard Worker class GradientRenderer {
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker public:
45*38e8c45fSAndroid Build Coastguard Worker 
setUp(GLHelper * helper)46*38e8c45fSAndroid Build Coastguard Worker     bool setUp(GLHelper* helper) {
47*38e8c45fSAndroid Build Coastguard Worker         bool result;
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker         result = helper->getShaderProgram("Gradient", &mGradPgm);
50*38e8c45fSAndroid Build Coastguard Worker         if (!result) {
51*38e8c45fSAndroid Build Coastguard Worker             return false;
52*38e8c45fSAndroid Build Coastguard Worker         }
53*38e8c45fSAndroid Build Coastguard Worker 
54*38e8c45fSAndroid Build Coastguard Worker         result = helper->getDitherTexture(&mDitherTexName);
55*38e8c45fSAndroid Build Coastguard Worker         if (!result) {
56*38e8c45fSAndroid Build Coastguard Worker             return false;
57*38e8c45fSAndroid Build Coastguard Worker         }
58*38e8c45fSAndroid Build Coastguard Worker 
59*38e8c45fSAndroid Build Coastguard Worker         mPosAttribLoc = glGetAttribLocation(mGradPgm, "position");
60*38e8c45fSAndroid Build Coastguard Worker         mUVAttribLoc = glGetAttribLocation(mGradPgm, "uv");
61*38e8c45fSAndroid Build Coastguard Worker         mUVToInterpUniformLoc = glGetUniformLocation(mGradPgm, "uvToInterp");
62*38e8c45fSAndroid Build Coastguard Worker         mObjToNdcUniformLoc = glGetUniformLocation(mGradPgm, "objToNdc");
63*38e8c45fSAndroid Build Coastguard Worker         mDitherKernelSamplerLoc = glGetUniformLocation(mGradPgm, "ditherKernel");
64*38e8c45fSAndroid Build Coastguard Worker         mInvDitherKernelSizeUniformLoc = glGetUniformLocation(mGradPgm,
65*38e8c45fSAndroid Build Coastguard Worker                 "invDitherKernelSize");
66*38e8c45fSAndroid Build Coastguard Worker         mInvDitherKernelSizeSqUniformLoc = glGetUniformLocation(mGradPgm,
67*38e8c45fSAndroid Build Coastguard Worker                 "invDitherKernelSizeSq");
68*38e8c45fSAndroid Build Coastguard Worker         mColor0UniformLoc = glGetUniformLocation(mGradPgm, "color0");
69*38e8c45fSAndroid Build Coastguard Worker         mColor1UniformLoc = glGetUniformLocation(mGradPgm, "color1");
70*38e8c45fSAndroid Build Coastguard Worker 
71*38e8c45fSAndroid Build Coastguard Worker         return true;
72*38e8c45fSAndroid Build Coastguard Worker     }
73*38e8c45fSAndroid Build Coastguard Worker 
tearDown()74*38e8c45fSAndroid Build Coastguard Worker     void tearDown() {
75*38e8c45fSAndroid Build Coastguard Worker     }
76*38e8c45fSAndroid Build Coastguard Worker 
drawGradient()77*38e8c45fSAndroid Build Coastguard Worker     bool drawGradient() {
78*38e8c45fSAndroid Build Coastguard Worker         float identity[16] = {
79*38e8c45fSAndroid Build Coastguard Worker             1.0f,   0.0f,   0.0f,   0.0f,
80*38e8c45fSAndroid Build Coastguard Worker             0.0f,   1.0f,   0.0f,   0.0f,
81*38e8c45fSAndroid Build Coastguard Worker             0.0f,   0.0f,   1.0f,   0.0f,
82*38e8c45fSAndroid Build Coastguard Worker             0.0f,   0.0f,   0.0f,   1.0f,
83*38e8c45fSAndroid Build Coastguard Worker         };
84*38e8c45fSAndroid Build Coastguard Worker         const float pos[] = {
85*38e8c45fSAndroid Build Coastguard Worker             -1.0f,  -1.0f,
86*38e8c45fSAndroid Build Coastguard Worker             1.0f,   -1.0f,
87*38e8c45fSAndroid Build Coastguard Worker             -1.0f,  1.0f,
88*38e8c45fSAndroid Build Coastguard Worker             1.0f,   1.0f,
89*38e8c45fSAndroid Build Coastguard Worker         };
90*38e8c45fSAndroid Build Coastguard Worker         const float uv[] = {
91*38e8c45fSAndroid Build Coastguard Worker             0.0f, 0.0f,
92*38e8c45fSAndroid Build Coastguard Worker             1.0f, 0.0f,
93*38e8c45fSAndroid Build Coastguard Worker             0.0f, 1.0f,
94*38e8c45fSAndroid Build Coastguard Worker             1.0f, 1.0f,
95*38e8c45fSAndroid Build Coastguard Worker         };
96*38e8c45fSAndroid Build Coastguard Worker         const float* color0 = genColor();
97*38e8c45fSAndroid Build Coastguard Worker         const float* color1 = genColor();
98*38e8c45fSAndroid Build Coastguard Worker 
99*38e8c45fSAndroid Build Coastguard Worker         glUseProgram(mGradPgm);
100*38e8c45fSAndroid Build Coastguard Worker 
101*38e8c45fSAndroid Build Coastguard Worker         glVertexAttribPointer(mPosAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, pos);
102*38e8c45fSAndroid Build Coastguard Worker         glVertexAttribPointer(mUVAttribLoc, 2, GL_FLOAT, GL_FALSE, 0, uv);
103*38e8c45fSAndroid Build Coastguard Worker         glEnableVertexAttribArray(mPosAttribLoc);
104*38e8c45fSAndroid Build Coastguard Worker         glEnableVertexAttribArray(mUVAttribLoc);
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker         float invDitherKernelSize = 1.0f / float(GLHelper::DITHER_KERNEL_SIZE);
107*38e8c45fSAndroid Build Coastguard Worker         float invDitherKernelSizeSq = invDitherKernelSize * invDitherKernelSize;
108*38e8c45fSAndroid Build Coastguard Worker 
109*38e8c45fSAndroid Build Coastguard Worker         glUniformMatrix4fv(mObjToNdcUniformLoc, 1, GL_FALSE, identity);
110*38e8c45fSAndroid Build Coastguard Worker         glUniformMatrix4fv(mUVToInterpUniformLoc, 1, GL_FALSE, identity);
111*38e8c45fSAndroid Build Coastguard Worker         glUniform1f(mInvDitherKernelSizeUniformLoc, invDitherKernelSize);
112*38e8c45fSAndroid Build Coastguard Worker         glUniform1f(mInvDitherKernelSizeSqUniformLoc, invDitherKernelSizeSq);
113*38e8c45fSAndroid Build Coastguard Worker         glUniform4fv(mColor0UniformLoc, 1, color0);
114*38e8c45fSAndroid Build Coastguard Worker         glUniform4fv(mColor1UniformLoc, 1, color1);
115*38e8c45fSAndroid Build Coastguard Worker 
116*38e8c45fSAndroid Build Coastguard Worker         if (glGetError() != GL_NO_ERROR) {
117*38e8c45fSAndroid Build Coastguard Worker             fprintf(stderr, "GL error! 0\n");
118*38e8c45fSAndroid Build Coastguard Worker         }
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
121*38e8c45fSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mDitherTexName);
122*38e8c45fSAndroid Build Coastguard Worker 
123*38e8c45fSAndroid Build Coastguard Worker         if (glGetError() != GL_NO_ERROR) {
124*38e8c45fSAndroid Build Coastguard Worker             fprintf(stderr, "GL error! 1\n");
125*38e8c45fSAndroid Build Coastguard Worker         }
126*38e8c45fSAndroid Build Coastguard Worker 
127*38e8c45fSAndroid Build Coastguard Worker         glUniform1i(mDitherKernelSamplerLoc, 0);
128*38e8c45fSAndroid Build Coastguard Worker 
129*38e8c45fSAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
130*38e8c45fSAndroid Build Coastguard Worker 
131*38e8c45fSAndroid Build Coastguard Worker         glDisableVertexAttribArray(mPosAttribLoc);
132*38e8c45fSAndroid Build Coastguard Worker         glDisableVertexAttribArray(mUVAttribLoc);
133*38e8c45fSAndroid Build Coastguard Worker 
134*38e8c45fSAndroid Build Coastguard Worker         if (glGetError() != GL_NO_ERROR) {
135*38e8c45fSAndroid Build Coastguard Worker             fprintf(stderr, "GL error! 2\n");
136*38e8c45fSAndroid Build Coastguard Worker         }
137*38e8c45fSAndroid Build Coastguard Worker 
138*38e8c45fSAndroid Build Coastguard Worker         return true;
139*38e8c45fSAndroid Build Coastguard Worker     }
140*38e8c45fSAndroid Build Coastguard Worker 
141*38e8c45fSAndroid Build Coastguard Worker     GLuint mGradPgm;
142*38e8c45fSAndroid Build Coastguard Worker     GLuint mDitherTexName;
143*38e8c45fSAndroid Build Coastguard Worker     GLuint mPosAttribLoc;
144*38e8c45fSAndroid Build Coastguard Worker     GLuint mUVAttribLoc;
145*38e8c45fSAndroid Build Coastguard Worker     GLuint mObjToNdcUniformLoc;
146*38e8c45fSAndroid Build Coastguard Worker     GLuint mUVToInterpUniformLoc;
147*38e8c45fSAndroid Build Coastguard Worker     GLuint mDitherKernelSamplerLoc;
148*38e8c45fSAndroid Build Coastguard Worker     GLuint mInvDitherKernelSizeUniformLoc;
149*38e8c45fSAndroid Build Coastguard Worker     GLuint mInvDitherKernelSizeSqUniformLoc;
150*38e8c45fSAndroid Build Coastguard Worker     GLuint mColor0UniformLoc;
151*38e8c45fSAndroid Build Coastguard Worker     GLuint mColor1UniformLoc;
152*38e8c45fSAndroid Build Coastguard Worker };
153*38e8c45fSAndroid Build Coastguard Worker 
staticGradient()154*38e8c45fSAndroid Build Coastguard Worker Renderer* staticGradient() {
155*38e8c45fSAndroid Build Coastguard Worker     class NoRenderer : public Renderer {
156*38e8c45fSAndroid Build Coastguard Worker         virtual bool setUp(GLHelper* helper) {
157*38e8c45fSAndroid Build Coastguard Worker             mIsFirstFrame = true;
158*38e8c45fSAndroid Build Coastguard Worker             mGLHelper = helper;
159*38e8c45fSAndroid Build Coastguard Worker             return mGradientRenderer.setUp(helper);
160*38e8c45fSAndroid Build Coastguard Worker         }
161*38e8c45fSAndroid Build Coastguard Worker 
162*38e8c45fSAndroid Build Coastguard Worker         virtual void tearDown() {
163*38e8c45fSAndroid Build Coastguard Worker             mGradientRenderer.tearDown();
164*38e8c45fSAndroid Build Coastguard Worker         }
165*38e8c45fSAndroid Build Coastguard Worker 
166*38e8c45fSAndroid Build Coastguard Worker         virtual bool render(EGLSurface surface) {
167*38e8c45fSAndroid Build Coastguard Worker             if (mIsFirstFrame) {
168*38e8c45fSAndroid Build Coastguard Worker                 bool result;
169*38e8c45fSAndroid Build Coastguard Worker                 mIsFirstFrame = false;
170*38e8c45fSAndroid Build Coastguard Worker 
171*38e8c45fSAndroid Build Coastguard Worker                 result = mGLHelper->makeCurrent(surface);
172*38e8c45fSAndroid Build Coastguard Worker                 if (!result) {
173*38e8c45fSAndroid Build Coastguard Worker                     return false;
174*38e8c45fSAndroid Build Coastguard Worker                 }
175*38e8c45fSAndroid Build Coastguard Worker 
176*38e8c45fSAndroid Build Coastguard Worker                 result = mGradientRenderer.drawGradient();
177*38e8c45fSAndroid Build Coastguard Worker                 if (!result) {
178*38e8c45fSAndroid Build Coastguard Worker                     return false;
179*38e8c45fSAndroid Build Coastguard Worker                 }
180*38e8c45fSAndroid Build Coastguard Worker 
181*38e8c45fSAndroid Build Coastguard Worker                 result = mGLHelper->swapBuffers(surface);
182*38e8c45fSAndroid Build Coastguard Worker                 if (!result) {
183*38e8c45fSAndroid Build Coastguard Worker                     return false;
184*38e8c45fSAndroid Build Coastguard Worker                 }
185*38e8c45fSAndroid Build Coastguard Worker             }
186*38e8c45fSAndroid Build Coastguard Worker             return true;
187*38e8c45fSAndroid Build Coastguard Worker         }
188*38e8c45fSAndroid Build Coastguard Worker 
189*38e8c45fSAndroid Build Coastguard Worker         bool mIsFirstFrame;
190*38e8c45fSAndroid Build Coastguard Worker         GLHelper* mGLHelper;
191*38e8c45fSAndroid Build Coastguard Worker         GradientRenderer mGradientRenderer;
192*38e8c45fSAndroid Build Coastguard Worker     };
193*38e8c45fSAndroid Build Coastguard Worker     return new NoRenderer;
194*38e8c45fSAndroid Build Coastguard Worker }
195*38e8c45fSAndroid Build Coastguard Worker 
196*38e8c45fSAndroid Build Coastguard Worker 
197*38e8c45fSAndroid Build Coastguard Worker } // namespace android
198