Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Demos / NativeClient / shader_util.cc
1 // Copyright (c) 2011 The Native Client Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "shader_util.h"
6
7 #include <stdlib.h>
8 #include <stdio.h>
9
10 namespace shader_util {
11
12 GLuint CreateShaderOfType(GLenum type, const char *shader_src) {
13   GLuint shader;
14   GLint compiled;
15
16   // Create the shader object
17   shader = glCreateShader(type);
18
19   if (shader == 0)
20     return 0;
21
22   // Load and compile the shader source
23   glShaderSource(shader, 1, &shader_src, NULL);
24   glCompileShader(shader);
25
26   // Check the compile status
27   glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
28   if (compiled == 0) {
29     GLint info_len = 0;
30     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_len);
31     if (info_len > 1) {
32       char* info_log = reinterpret_cast<char*>(malloc(sizeof(char) * info_len));
33       glGetShaderInfoLog(shader, info_len, NULL, info_log);
34       // TODO(dspringer): We could really use a logging API.
35       printf("Error compiling shader:\n%s\n", info_log);
36       free(info_log);
37     }
38     glDeleteShader(shader);
39     return 0;
40   }
41
42   return shader;
43 }
44
45 GLuint CreateProgramFromVertexAndFragmentShaders(
46     const char *vertex_shader_src, const char *fragment_shader_src) {
47   GLuint vertex_shader;
48   GLuint fragment_shader;
49   GLuint program_object;
50   GLint linked;
51
52   // Load the vertex/fragment shaders
53   vertex_shader = CreateShaderOfType(GL_VERTEX_SHADER, vertex_shader_src);
54   if (vertex_shader == 0)
55     return 0;
56   fragment_shader = CreateShaderOfType(GL_FRAGMENT_SHADER, fragment_shader_src);
57   if (fragment_shader == 0) {
58     glDeleteShader(vertex_shader);
59     return 0;
60   }
61
62   // Create the program object and attach the shaders.
63   program_object = glCreateProgram();
64   if (program_object == 0)
65     return 0;
66   glAttachShader(program_object, vertex_shader);
67   glAttachShader(program_object, fragment_shader);
68
69   // Link the program
70   glLinkProgram(program_object);
71
72   // Check the link status
73   glGetProgramiv(program_object, GL_LINK_STATUS, &linked);
74   if (linked == 0) {
75     GLint info_len = 0;
76     glGetProgramiv(program_object, GL_INFO_LOG_LENGTH, &info_len);
77     if (info_len > 1) {
78       char* info_log = reinterpret_cast<char*>(malloc(info_len));
79       glGetProgramInfoLog(program_object, info_len, NULL, info_log);
80       // TODO(dspringer): We could really use a logging API.
81       printf("Error linking program:\n%s\n", info_log);
82       free(info_log);
83     }
84     glDeleteProgram(program_object);
85     return 0;
86   }
87
88   // Delete these here because they are attached to the program object.
89   glDeleteShader(vertex_shader);
90   glDeleteShader(fragment_shader);
91
92   return program_object;
93 }
94
95 }  // namespace shader_util