1*e01b6f76SAndroid Build Coastguard Worker /*
2*e01b6f76SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*e01b6f76SAndroid Build Coastguard Worker *
4*e01b6f76SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e01b6f76SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e01b6f76SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e01b6f76SAndroid Build Coastguard Worker *
8*e01b6f76SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e01b6f76SAndroid Build Coastguard Worker *
10*e01b6f76SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e01b6f76SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e01b6f76SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e01b6f76SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e01b6f76SAndroid Build Coastguard Worker * limitations under the License.
15*e01b6f76SAndroid Build Coastguard Worker */
16*e01b6f76SAndroid Build Coastguard Worker
17*e01b6f76SAndroid Build Coastguard Worker #include <stdlib.h>
18*e01b6f76SAndroid Build Coastguard Worker #include <stdio.h>
19*e01b6f76SAndroid Build Coastguard Worker
20*e01b6f76SAndroid Build Coastguard Worker #include <EGL/egl.h>
21*e01b6f76SAndroid Build Coastguard Worker #include <GLES2/gl2.h>
22*e01b6f76SAndroid Build Coastguard Worker
23*e01b6f76SAndroid Build Coastguard Worker #include "util.h"
24*e01b6f76SAndroid Build Coastguard Worker
25*e01b6f76SAndroid Build Coastguard Worker static const char gVertexShader[] =
26*e01b6f76SAndroid Build Coastguard Worker "attribute vec4 aPosition;\n"
27*e01b6f76SAndroid Build Coastguard Worker "uniform mat4 uTransform;\n"
28*e01b6f76SAndroid Build Coastguard Worker "varying vec4 vTexCoord;\n"
29*e01b6f76SAndroid Build Coastguard Worker "void main() {\n"
30*e01b6f76SAndroid Build Coastguard Worker " gl_Position = aPosition * uTransform;\n"
31*e01b6f76SAndroid Build Coastguard Worker " vTexCoord = aPosition * vec4(1.0/16.0,-1.0/16.0,0.0,0.0);\n"
32*e01b6f76SAndroid Build Coastguard Worker "}\n";
33*e01b6f76SAndroid Build Coastguard Worker
34*e01b6f76SAndroid Build Coastguard Worker static const char gFragmentShader[] =
35*e01b6f76SAndroid Build Coastguard Worker "precision mediump float;\n"
36*e01b6f76SAndroid Build Coastguard Worker "uniform sampler2D uTexture;\n"
37*e01b6f76SAndroid Build Coastguard Worker "uniform float uAnim;\n"
38*e01b6f76SAndroid Build Coastguard Worker "varying vec4 vTexCoord;\n"
39*e01b6f76SAndroid Build Coastguard Worker "void main() {\n"
40*e01b6f76SAndroid Build Coastguard Worker " vec2 tc = vec2(vTexCoord.x, uAnim + vTexCoord.y);\n"
41*e01b6f76SAndroid Build Coastguard Worker " gl_FragColor = texture2D(uTexture, tc);\n"
42*e01b6f76SAndroid Build Coastguard Worker "}\n";
43*e01b6f76SAndroid Build Coastguard Worker
44*e01b6f76SAndroid Build Coastguard Worker static GLuint pgm;
45*e01b6f76SAndroid Build Coastguard Worker static GLint aPosition, uTransform, uTexture, uAnim;
46*e01b6f76SAndroid Build Coastguard Worker
47*e01b6f76SAndroid Build Coastguard Worker static GLfloat vtx[2 * 3 * 2];
48*e01b6f76SAndroid Build Coastguard Worker static GLfloat mtx[16];
49*e01b6f76SAndroid Build Coastguard Worker
50*e01b6f76SAndroid Build Coastguard Worker //#define R (0xFF0000FF)
51*e01b6f76SAndroid Build Coastguard Worker #define R (0xFF000000)
52*e01b6f76SAndroid Build Coastguard Worker #define G (0xFF00FF00)
53*e01b6f76SAndroid Build Coastguard Worker uint32_t t32[] = {
54*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, R, G, G, R, R, R, R, R, R, R,
55*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
56*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, G, G, G, G, G, G, R, R, R, R, R,
57*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R,
58*e01b6f76SAndroid Build Coastguard Worker R, R, R, G, G, G, G, G, G, G, G, G, G, R, R, R,
59*e01b6f76SAndroid Build Coastguard Worker R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R,
60*e01b6f76SAndroid Build Coastguard Worker R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R,
61*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
62*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
63*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
64*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
65*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
66*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
67*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R,
68*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R,
69*e01b6f76SAndroid Build Coastguard Worker R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R,
70*e01b6f76SAndroid Build Coastguard Worker };
71*e01b6f76SAndroid Build Coastguard Worker #undef R
72*e01b6f76SAndroid Build Coastguard Worker #undef G
73*e01b6f76SAndroid Build Coastguard Worker
prepare(int w,int h)74*e01b6f76SAndroid Build Coastguard Worker int prepare(int w, int h) {
75*e01b6f76SAndroid Build Coastguard Worker GLuint texid;
76*e01b6f76SAndroid Build Coastguard Worker
77*e01b6f76SAndroid Build Coastguard Worker int left = w / 4;
78*e01b6f76SAndroid Build Coastguard Worker int top = h / 4;
79*e01b6f76SAndroid Build Coastguard Worker int right = (w / 4) * 3;
80*e01b6f76SAndroid Build Coastguard Worker int bottom = (h / 4) * 3;
81*e01b6f76SAndroid Build Coastguard Worker
82*e01b6f76SAndroid Build Coastguard Worker vtx[0] = left;
83*e01b6f76SAndroid Build Coastguard Worker vtx[1] = top;
84*e01b6f76SAndroid Build Coastguard Worker vtx[2] = left;
85*e01b6f76SAndroid Build Coastguard Worker vtx[3] = bottom;
86*e01b6f76SAndroid Build Coastguard Worker vtx[4] = right;
87*e01b6f76SAndroid Build Coastguard Worker vtx[5] = bottom;
88*e01b6f76SAndroid Build Coastguard Worker
89*e01b6f76SAndroid Build Coastguard Worker vtx[6] = right;
90*e01b6f76SAndroid Build Coastguard Worker vtx[7] = bottom;
91*e01b6f76SAndroid Build Coastguard Worker vtx[8] = right;
92*e01b6f76SAndroid Build Coastguard Worker vtx[9] = top;
93*e01b6f76SAndroid Build Coastguard Worker vtx[10] = left;
94*e01b6f76SAndroid Build Coastguard Worker vtx[11] = top;
95*e01b6f76SAndroid Build Coastguard Worker
96*e01b6f76SAndroid Build Coastguard Worker matrix_init_ortho(mtx, w, h);
97*e01b6f76SAndroid Build Coastguard Worker
98*e01b6f76SAndroid Build Coastguard Worker pgm = load_program(gVertexShader, gFragmentShader);
99*e01b6f76SAndroid Build Coastguard Worker if (!pgm)
100*e01b6f76SAndroid Build Coastguard Worker return -1;
101*e01b6f76SAndroid Build Coastguard Worker
102*e01b6f76SAndroid Build Coastguard Worker aPosition = glGetAttribLocation(pgm, "aPosition");
103*e01b6f76SAndroid Build Coastguard Worker uTexture = glGetUniformLocation(pgm, "uTexture");
104*e01b6f76SAndroid Build Coastguard Worker uTransform = glGetUniformLocation(pgm, "uTransform");
105*e01b6f76SAndroid Build Coastguard Worker uAnim = glGetUniformLocation(pgm, "uAnim");
106*e01b6f76SAndroid Build Coastguard Worker
107*e01b6f76SAndroid Build Coastguard Worker glViewport(0, 0, w, h);
108*e01b6f76SAndroid Build Coastguard Worker
109*e01b6f76SAndroid Build Coastguard Worker glGenTextures(1, &texid);
110*e01b6f76SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
111*e01b6f76SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texid);
112*e01b6f76SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
113*e01b6f76SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
114*e01b6f76SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
115*e01b6f76SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
116*e01b6f76SAndroid Build Coastguard Worker glEnable(GL_TEXTURE_2D);
117*e01b6f76SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
118*e01b6f76SAndroid Build Coastguard Worker GL_RGBA, GL_UNSIGNED_BYTE, t32);
119*e01b6f76SAndroid Build Coastguard Worker
120*e01b6f76SAndroid Build Coastguard Worker return 0;
121*e01b6f76SAndroid Build Coastguard Worker }
122*e01b6f76SAndroid Build Coastguard Worker
123*e01b6f76SAndroid Build Coastguard Worker static float anim = 0.0;
124*e01b6f76SAndroid Build Coastguard Worker
render()125*e01b6f76SAndroid Build Coastguard Worker void render() {
126*e01b6f76SAndroid Build Coastguard Worker anim += 0.1;
127*e01b6f76SAndroid Build Coastguard Worker if (anim >= 16.0) anim = 0.0;
128*e01b6f76SAndroid Build Coastguard Worker
129*e01b6f76SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
130*e01b6f76SAndroid Build Coastguard Worker glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
131*e01b6f76SAndroid Build Coastguard Worker glUseProgram(pgm);
132*e01b6f76SAndroid Build Coastguard Worker glUniform1i(uTexture, 0);
133*e01b6f76SAndroid Build Coastguard Worker glUniform1f(uAnim, anim);
134*e01b6f76SAndroid Build Coastguard Worker glUniformMatrix4fv(uTransform, 1, 0, mtx);
135*e01b6f76SAndroid Build Coastguard Worker glVertexAttribPointer(aPosition, 2, GL_FLOAT, GL_FALSE, 0, vtx);
136*e01b6f76SAndroid Build Coastguard Worker glEnableVertexAttribArray(aPosition);
137*e01b6f76SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLES, 0, 6);
138*e01b6f76SAndroid Build Coastguard Worker }
139*e01b6f76SAndroid Build Coastguard Worker
main(int argc,char ** argv)140*e01b6f76SAndroid Build Coastguard Worker int main(int argc, char **argv) {
141*e01b6f76SAndroid Build Coastguard Worker EGLDisplay display;
142*e01b6f76SAndroid Build Coastguard Worker EGLSurface surface;
143*e01b6f76SAndroid Build Coastguard Worker int w, h, count = 0;
144*e01b6f76SAndroid Build Coastguard Worker
145*e01b6f76SAndroid Build Coastguard Worker if (argc > 1)
146*e01b6f76SAndroid Build Coastguard Worker count = atoi(argv[1]);
147*e01b6f76SAndroid Build Coastguard Worker
148*e01b6f76SAndroid Build Coastguard Worker if (egl_create(&display, &surface, &w, &h))
149*e01b6f76SAndroid Build Coastguard Worker return -1;
150*e01b6f76SAndroid Build Coastguard Worker
151*e01b6f76SAndroid Build Coastguard Worker if (prepare(w, h))
152*e01b6f76SAndroid Build Coastguard Worker return -1;
153*e01b6f76SAndroid Build Coastguard Worker
154*e01b6f76SAndroid Build Coastguard Worker for (;;) {
155*e01b6f76SAndroid Build Coastguard Worker render();
156*e01b6f76SAndroid Build Coastguard Worker eglSwapBuffers(display, surface);
157*e01b6f76SAndroid Build Coastguard Worker if (count > 0)
158*e01b6f76SAndroid Build Coastguard Worker if (--count == 0)
159*e01b6f76SAndroid Build Coastguard Worker break;
160*e01b6f76SAndroid Build Coastguard Worker }
161*e01b6f76SAndroid Build Coastguard Worker
162*e01b6f76SAndroid Build Coastguard Worker egl_destroy(display, surface);
163*e01b6f76SAndroid Build Coastguard Worker return 0;
164*e01b6f76SAndroid Build Coastguard Worker }
165