1 /* 2 * Copyright (C) 2012 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 #include <GLES2/gl2.h> 17 #include <GLES2/gl2ext.h> 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include "color_one.h" 21 #include "common.h" 22 #include "vertex.h" 23 #include "shader.h" 24 25 #define LOG_TAG "color_one" 26 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) 27 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) 28 29 static const GLfloat gTriangleVertices[] = { 0.0f, 0.5f, -0.5f, -0.5f, 30 0.5f, -0.5f }; 31 GLuint gProgram; 32 GLuint gvPositionHandle; 33 GLuint gvColorHandle; 34 int width; 35 int height; 36 37 float dataFloat[4]; 38 void initColorOne(int w, int h){ 39 GLuint vertexShader = loadShader(GL_VERTEX_SHADER, color_one_vertex_shader_one); 40 GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, color_one_fragment_shader_one); 41 gProgram = glCreateProgram(); 42 LOGI("Program %d\n", gProgram); 43 width = w; 44 height = h; 45 glAttachShader(gProgram, vertexShader); 46 checkGlError("glAttachShader"); 47 glAttachShader(gProgram, fragmentShader); 48 checkGlError("glAttachShader"); 49 glBindAttribLocation(gProgram, 0, "vPosition"); 50 glBindAttribLocation(gProgram, 1, "vColor"); 51 glLinkProgram(gProgram); 52 GLint linkStatus = GL_FALSE; 53 glGetProgramiv(gProgram, GL_LINK_STATUS, &linkStatus); 54 if (linkStatus != GL_TRUE) { 55 GLint bufLength = 0; 56 glGetProgramiv(gProgram, GL_INFO_LOG_LENGTH, &bufLength); 57 if (bufLength) { 58 char* buf = (char*) malloc(bufLength); 59 if (buf) { 60 glGetProgramInfoLog(gProgram, bufLength, NULL, buf); 61 LOGE("Could not link program:\n%s\n", buf); 62 free(buf); 63 } 64 } 65 } 66 LOGI("w %d, h %d\n",w, h); 67 glViewport(0, 0, w, h); 68 69 checkGlError("glViewport"); 70 gvPositionHandle = glGetAttribLocation(gProgram, "vPosition"); 71 gvColorHandle = glGetAttribLocation(gProgram, "vColor"); 72 GLsizei maxCount = 10; 73 GLsizei count; 74 GLuint shaders[maxCount]; 75 76 glGetAttachedShaders(gProgram, maxCount, 77 &count, 78 shaders); 79 LOGI("Attached Shader First element : %d\n", *shaders); 80 LOGI("ShaderCount %d\n", count); 81 GLint error = glGetError(); 82 return; 83 } 84 85 float* drawColorOne(float mColor[]){ 86 LOGI("drawColorOne start"); 87 static float grey; 88 grey = 0.01f; 89 90 glClearColor(grey, grey, grey, 1.0f); 91 checkGlError("glClearColor"); 92 glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 93 checkGlError("glClear"); 94 95 glUseProgram(gProgram); 96 checkGlError("glUseProgram"); 97 98 glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, gTriangleVertices); 99 checkGlError("glVertexAttribPointer"); 100 glEnableVertexAttribArray(0); 101 checkGlError("glEnableVertexAttribArray"); 102 103 glVertexAttribPointer(gvColorHandle,4, GL_FLOAT, GL_FALSE, 0, mColor); 104 checkGlError("glVertexAttribPointer"); 105 glEnableVertexAttribArray(1); 106 checkGlError("glEnableVertexAttribArray"); 107 108 glDrawArrays(GL_TRIANGLES, 0, 3); 109 checkGlError("glDrawArrays"); 110 GLubyte data[4*1]; 111 112 113 glReadPixels(width/2, height/2, 1,1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)&data); 114 for(int i = 0; i < sizeof(data); i++){ 115 dataFloat[i] = data[i]; 116 } 117 118 return dataFloat; 119 } 120 121 void deleteColorOne() { 122 glDeleteProgram(gProgram); 123 } 124 125 static void checkGlError(const char* op) { 126 for (GLint error = glGetError(); error; error 127 = glGetError()) { 128 LOGI("after %s() glError (0x%x)\n", op, error); 129 } 130 } 131