xref: /aosp_15_r20/hardware/libhardware/tests/hwc/test-arrows.c (revision e01b6f769022e40d0923dee176e8dc7cd1d52984)
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