1 /*
2  * Copyright (C) 2016 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 
17 #define _USE_MATH_DEFINES
18 #include <math.h>
19 #include "utils.h"
20 
DegToRad(float deg)21 float DegToRad(float deg) {
22   return deg * (float)M_PI / 180.0f;
23 }
24 
CompileShader(GLuint shader,const std::string & shader_string)25 bool CompileShader(GLuint shader, const std::string& shader_string) {
26   std::string prefix = "#version 300 es\n";
27   std::string string_with_prefix = prefix + shader_string;
28   const char* shader_str[] = { string_with_prefix.data() };
29   glShaderSource(shader, 1, shader_str, NULL);
30   glCompileShader(shader);
31 
32   GLint success;
33   GLchar infoLog[512];
34   glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
35   if (!success)
36   {
37     glGetShaderInfoLog(shader, 512, NULL, infoLog);
38     LOGI("Shader Failed to compile: %s -- %s\n", *shader_str, infoLog);
39     return false;
40   }
41   return true;
42 }
43 
LinkProgram(GLuint program,GLuint vertex_shader,GLuint fragment_shader)44 bool LinkProgram(GLuint program, GLuint vertex_shader, GLuint fragment_shader) {
45   glAttachShader(program, vertex_shader);
46   glAttachShader(program, fragment_shader);
47   glLinkProgram(program);
48 
49   // Check for linking errors
50   GLint success;
51   GLchar infoLog[512];
52   glGetProgramiv(program, GL_LINK_STATUS, &success);
53   if (!success) {
54     glGetProgramInfoLog(program, 512, NULL, infoLog);
55     LOGE("Shader failed to link: %s\n", infoLog);
56     return false;
57   }
58 
59   return true;
60 }
61 
GLCheckError()62 GLenum GLCheckError() {
63   return GLCheckErrorStr("");
64 }
65 
GLCheckErrorStr(std::string msg)66 GLenum GLCheckErrorStr(std::string msg) {
67   GLenum e = glGetError();
68   std::string str;
69   if (e != GL_NO_ERROR) {
70     switch (e) {
71     case GL_INVALID_ENUM:
72       str = "GL_INVALID_ENUM";
73       break;
74     case GL_INVALID_OPERATION:
75       str = "GL_INVALID_OPERATION";
76       break;
77     case GL_INVALID_VALUE:
78       str = "GL_INVALID_VALUE";
79       break;
80     case GL_OUT_OF_MEMORY:
81       str = "GL_OUT_OF_MEMORY";
82       break;
83     case GL_INVALID_FRAMEBUFFER_OPERATION:
84       str = "GL_INVALID_FRAMEBUFFER_OPERATION";
85       break;
86     }
87     LOGE("OpenGL error : %s : %s (%#08x)\n", msg.c_str(), str.c_str(), e);
88   }
89   return e;
90 }
91