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.
5 #include "shader_util.h"
10 namespace shader_util {
12 GLuint CreateShaderOfType(GLenum type, const char *shader_src) {
16 // Create the shader object
17 shader = glCreateShader(type);
22 // Load and compile the shader source
23 glShaderSource(shader, 1, &shader_src, NULL);
24 glCompileShader(shader);
26 // Check the compile status
27 glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
30 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_len);
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);
38 glDeleteShader(shader);
45 GLuint CreateProgramFromVertexAndFragmentShaders(
46 const char *vertex_shader_src, const char *fragment_shader_src) {
48 GLuint fragment_shader;
49 GLuint program_object;
52 // Load the vertex/fragment shaders
53 vertex_shader = CreateShaderOfType(GL_VERTEX_SHADER, vertex_shader_src);
54 if (vertex_shader == 0)
56 fragment_shader = CreateShaderOfType(GL_FRAGMENT_SHADER, fragment_shader_src);
57 if (fragment_shader == 0) {
58 glDeleteShader(vertex_shader);
62 // Create the program object and attach the shaders.
63 program_object = glCreateProgram();
64 if (program_object == 0)
66 glAttachShader(program_object, vertex_shader);
67 glAttachShader(program_object, fragment_shader);
70 glLinkProgram(program_object);
72 // Check the link status
73 glGetProgramiv(program_object, GL_LINK_STATUS, &linked);
76 glGetProgramiv(program_object, GL_INFO_LOG_LENGTH, &info_len);
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);
84 glDeleteProgram(program_object);
88 // Delete these here because they are attached to the program object.
89 glDeleteShader(vertex_shader);
90 glDeleteShader(fragment_shader);
92 return program_object;
95 } // namespace shader_util