You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
4.2 KiB

/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include <stdio.h>
#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include "util.h"
static const char gVertexShader[] =
"attribute vec4 aPosition;\n"
"uniform mat4 uTransform;\n"
"varying vec4 vTexCoord;\n"
"void main() {\n"
" gl_Position = aPosition * uTransform;\n"
" vTexCoord = aPosition * vec4(1.0/16.0,-1.0/16.0,0.0,0.0);\n"
"}\n";
static const char gFragmentShader[] =
"precision mediump float;\n"
"uniform sampler2D uTexture;\n"
"uniform float uAnim;\n"
"varying vec4 vTexCoord;\n"
"void main() {\n"
" vec2 tc = vec2(vTexCoord.x, uAnim + vTexCoord.y);\n"
" gl_FragColor = texture2D(uTexture, tc);\n"
"}\n";
static GLuint pgm;
static GLint aPosition, uTransform, uTexture, uAnim;
static GLfloat vtx[2 * 3 * 2];
static GLfloat mtx[16];
//#define R (0xFF0000FF)
#define R (0xFF000000)
#define G (0xFF00FF00)
uint32_t t32[] = {
R, R, R, R, R, R, R, G, G, R, R, R, R, R, R, R,
R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
R, R, R, R, R, G, G, G, G, G, G, R, R, R, R, R,
R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R,
R, R, R, G, G, G, G, G, G, G, G, G, G, R, R, R,
R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R,
R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R,
R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
R, R, R, R, R, R, G, G, G, G, R, R, R, R, R, R,
R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R,
R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R,
R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R,
};
#undef R
#undef G
int prepare(int w, int h) {
GLuint texid;
int left = w / 4;
int top = h / 4;
int right = (w / 4) * 3;
int bottom = (h / 4) * 3;
vtx[0] = left;
vtx[1] = top;
vtx[2] = left;
vtx[3] = bottom;
vtx[4] = right;
vtx[5] = bottom;
vtx[6] = right;
vtx[7] = bottom;
vtx[8] = right;
vtx[9] = top;
vtx[10] = left;
vtx[11] = top;
matrix_init_ortho(mtx, w, h);
pgm = load_program(gVertexShader, gFragmentShader);
if (!pgm)
return -1;
aPosition = glGetAttribLocation(pgm, "aPosition");
uTexture = glGetUniformLocation(pgm, "uTexture");
uTransform = glGetUniformLocation(pgm, "uTransform");
uAnim = glGetUniformLocation(pgm, "uAnim");
glViewport(0, 0, w, h);
glGenTextures(1, &texid);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texid);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glEnable(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
GL_RGBA, GL_UNSIGNED_BYTE, t32);
return 0;
}
static float anim = 0.0;
void render() {
anim += 0.1;
if (anim >= 16.0) anim = 0.0;
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glUseProgram(pgm);
glUniform1i(uTexture, 0);
glUniform1f(uAnim, anim);
glUniformMatrix4fv(uTransform, 1, 0, mtx);
glVertexAttribPointer(aPosition, 2, GL_FLOAT, GL_FALSE, 0, vtx);
glEnableVertexAttribArray(aPosition);
glDrawArrays(GL_TRIANGLES, 0, 6);
}
int main(int argc, char **argv) {
EGLDisplay display;
EGLSurface surface;
int w, h, count = 0;
if (argc > 1)
count = atoi(argv[1]);
if (egl_create(&display, &surface, &w, &h))
return -1;
if (prepare(w, h))
return -1;
for (;;) {
render();
eglSwapBuffers(display, surface);
if (count > 0)
if (--count == 0)
break;
}
egl_destroy(display, surface);
return 0;
}