1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker  *
4*90c8c64dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker  *
8*90c8c64dSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker  *
10*90c8c64dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker  * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker  */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.mediaeffects;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.opengl.GLES20;
20*90c8c64dSAndroid Build Coastguard Worker 
21*90c8c64dSAndroid Build Coastguard Worker public class GLToolbox {
22*90c8c64dSAndroid Build Coastguard Worker 
loadShader(int shaderType, String source)23*90c8c64dSAndroid Build Coastguard Worker     public static int loadShader(int shaderType, String source) {
24*90c8c64dSAndroid Build Coastguard Worker         int shader = GLES20.glCreateShader(shaderType);
25*90c8c64dSAndroid Build Coastguard Worker         if (shader != 0) {
26*90c8c64dSAndroid Build Coastguard Worker             GLES20.glShaderSource(shader, source);
27*90c8c64dSAndroid Build Coastguard Worker             GLES20.glCompileShader(shader);
28*90c8c64dSAndroid Build Coastguard Worker             int[] compiled = new int[1];
29*90c8c64dSAndroid Build Coastguard Worker             GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
30*90c8c64dSAndroid Build Coastguard Worker             if (compiled[0] == 0) {
31*90c8c64dSAndroid Build Coastguard Worker                 String info = GLES20.glGetShaderInfoLog(shader);
32*90c8c64dSAndroid Build Coastguard Worker                 GLES20.glDeleteShader(shader);
33*90c8c64dSAndroid Build Coastguard Worker                 throw new RuntimeException("Could not compile shader " + shaderType + ":" + info);
34*90c8c64dSAndroid Build Coastguard Worker             }
35*90c8c64dSAndroid Build Coastguard Worker         }
36*90c8c64dSAndroid Build Coastguard Worker         return shader;
37*90c8c64dSAndroid Build Coastguard Worker     }
38*90c8c64dSAndroid Build Coastguard Worker 
createProgram(String vertexSource, String fragmentSource)39*90c8c64dSAndroid Build Coastguard Worker     public static int createProgram(String vertexSource, String fragmentSource) {
40*90c8c64dSAndroid Build Coastguard Worker         int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
41*90c8c64dSAndroid Build Coastguard Worker         if (vertexShader == 0) {
42*90c8c64dSAndroid Build Coastguard Worker             return 0;
43*90c8c64dSAndroid Build Coastguard Worker         }
44*90c8c64dSAndroid Build Coastguard Worker         int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
45*90c8c64dSAndroid Build Coastguard Worker         if (pixelShader == 0) {
46*90c8c64dSAndroid Build Coastguard Worker             return 0;
47*90c8c64dSAndroid Build Coastguard Worker         }
48*90c8c64dSAndroid Build Coastguard Worker 
49*90c8c64dSAndroid Build Coastguard Worker         int program = GLES20.glCreateProgram();
50*90c8c64dSAndroid Build Coastguard Worker         if (program != 0) {
51*90c8c64dSAndroid Build Coastguard Worker             GLES20.glAttachShader(program, vertexShader);
52*90c8c64dSAndroid Build Coastguard Worker             checkGlError("glAttachShader");
53*90c8c64dSAndroid Build Coastguard Worker             GLES20.glAttachShader(program, pixelShader);
54*90c8c64dSAndroid Build Coastguard Worker             checkGlError("glAttachShader");
55*90c8c64dSAndroid Build Coastguard Worker             GLES20.glLinkProgram(program);
56*90c8c64dSAndroid Build Coastguard Worker             int[] linkStatus = new int[1];
57*90c8c64dSAndroid Build Coastguard Worker             GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus,
58*90c8c64dSAndroid Build Coastguard Worker                     0);
59*90c8c64dSAndroid Build Coastguard Worker             if (linkStatus[0] != GLES20.GL_TRUE) {
60*90c8c64dSAndroid Build Coastguard Worker                 String info = GLES20.glGetProgramInfoLog(program);
61*90c8c64dSAndroid Build Coastguard Worker                 GLES20.glDeleteProgram(program);
62*90c8c64dSAndroid Build Coastguard Worker                 throw new RuntimeException("Could not link program: " + info);
63*90c8c64dSAndroid Build Coastguard Worker             }
64*90c8c64dSAndroid Build Coastguard Worker         }
65*90c8c64dSAndroid Build Coastguard Worker         return program;
66*90c8c64dSAndroid Build Coastguard Worker     }
67*90c8c64dSAndroid Build Coastguard Worker 
checkGlError(String op)68*90c8c64dSAndroid Build Coastguard Worker     public static void checkGlError(String op) {
69*90c8c64dSAndroid Build Coastguard Worker         int error;
70*90c8c64dSAndroid Build Coastguard Worker         while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
71*90c8c64dSAndroid Build Coastguard Worker             throw new RuntimeException(op + ": glError " + error);
72*90c8c64dSAndroid Build Coastguard Worker         }
73*90c8c64dSAndroid Build Coastguard Worker     }
74*90c8c64dSAndroid Build Coastguard Worker 
initTexParams()75*90c8c64dSAndroid Build Coastguard Worker     public static void initTexParams() {
76*90c8c64dSAndroid Build Coastguard Worker         GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
77*90c8c64dSAndroid Build Coastguard Worker                 GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
78*90c8c64dSAndroid Build Coastguard Worker         GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
79*90c8c64dSAndroid Build Coastguard Worker                 GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
80*90c8c64dSAndroid Build Coastguard Worker         GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
81*90c8c64dSAndroid Build Coastguard Worker                 GLES20.GL_CLAMP_TO_EDGE);
82*90c8c64dSAndroid Build Coastguard Worker         GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
83*90c8c64dSAndroid Build Coastguard Worker                 GLES20.GL_CLAMP_TO_EDGE);
84*90c8c64dSAndroid Build Coastguard Worker     }
85*90c8c64dSAndroid Build Coastguard Worker 
86*90c8c64dSAndroid Build Coastguard Worker }
87