diff options
-rw-r--r-- | common.c | 80 | ||||
-rw-r--r-- | common.h | 10 | ||||
-rw-r--r-- | kmscube.c | 77 |
3 files changed, 98 insertions, 69 deletions
@@ -22,6 +22,7 @@ */ #include <stdio.h> +#include <stdlib.h> #include "common.h" @@ -42,3 +43,82 @@ const struct gbm * init_gbm(int drm_fd, int w, int h) return &gbm; } + +int create_program(const char *vs_src, const char *fs_src) +{ + GLuint vertex_shader, fragment_shader, program; + GLint ret; + + vertex_shader = glCreateShader(GL_VERTEX_SHADER); + + glShaderSource(vertex_shader, 1, &vs_src, NULL); + glCompileShader(vertex_shader); + + glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &ret); + if (!ret) { + char *log; + + printf("vertex shader compilation failed!:\n"); + glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &ret); + if (ret > 1) { + log = malloc(ret); + glGetShaderInfoLog(vertex_shader, ret, NULL, log); + printf("%s", log); + } + + return -1; + } + + fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + + glShaderSource(fragment_shader, 1, &fs_src, NULL); + glCompileShader(fragment_shader); + + glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &ret); + if (!ret) { + char *log; + + printf("fragment shader compilation failed!:\n"); + glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &ret); + + if (ret > 1) { + log = malloc(ret); + glGetShaderInfoLog(fragment_shader, ret, NULL, log); + printf("%s", log); + } + + return -1; + } + + program = glCreateProgram(); + + glAttachShader(program, vertex_shader); + glAttachShader(program, fragment_shader); + + return program; +} + +int link_program(unsigned program) +{ + GLint ret; + + glLinkProgram(program); + + glGetProgramiv(program, GL_LINK_STATUS, &ret); + if (!ret) { + char *log; + + printf("program linking failed!:\n"); + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &ret); + + if (ret > 1) { + log = malloc(ret); + glGetProgramInfoLog(program, ret, NULL, log); + printf("%s", log); + } + + return -1; + } + + return 0; +} @@ -26,6 +26,12 @@ #include <gbm.h> +#define GL_GLEXT_PROTOTYPES 1 +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> +#include <EGL/egl.h> +#include <EGL/eglext.h> + struct gbm { struct gbm_device *dev; struct gbm_surface *surface; @@ -33,4 +39,8 @@ struct gbm { const struct gbm * init_gbm(int drm_fd, int w, int h); + +int create_program(const char *vs_src, const char *fs_src); +int link_program(unsigned program); + #endif /* _COMMON_H */ @@ -36,12 +36,6 @@ #include <xf86drm.h> #include <xf86drmMode.h> -#define GL_GLEXT_PROTOTYPES 1 -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> -#include <EGL/egl.h> -#include <EGL/eglext.h> - #include <assert.h> #include "common.h" @@ -207,8 +201,7 @@ static int init_drm(const char *dev) static int init_gl(void) { EGLint major, minor, n; - GLuint vertex_shader, fragment_shader; - GLint ret; + int ret; static const GLfloat vVertices[] = { // front @@ -412,73 +405,19 @@ static int init_gl(void) printf("GL Extensions: \"%s\"\n", glGetString(GL_EXTENSIONS)); - vertex_shader = glCreateShader(GL_VERTEX_SHADER); - - glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); - glCompileShader(vertex_shader); - - glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &ret); - if (!ret) { - char *log; - - printf("vertex shader compilation failed!:\n"); - glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &ret); - if (ret > 1) { - log = malloc(ret); - glGetShaderInfoLog(vertex_shader, ret, NULL, log); - printf("%s", log); - } - - return -1; - } - - fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); - - glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); - glCompileShader(fragment_shader); - - glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &ret); - if (!ret) { - char *log; - - printf("fragment shader compilation failed!:\n"); - glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &ret); - - if (ret > 1) { - log = malloc(ret); - glGetShaderInfoLog(fragment_shader, ret, NULL, log); - printf("%s", log); - } - - return -1; - } - - gl.program = glCreateProgram(); + ret = create_program(vertex_shader_source, fragment_shader_source); + if (ret < 0) + return ret; - glAttachShader(gl.program, vertex_shader); - glAttachShader(gl.program, fragment_shader); + gl.program = ret; glBindAttribLocation(gl.program, 0, "in_position"); glBindAttribLocation(gl.program, 1, "in_normal"); glBindAttribLocation(gl.program, 2, "in_color"); - glLinkProgram(gl.program); - - glGetProgramiv(gl.program, GL_LINK_STATUS, &ret); - if (!ret) { - char *log; - - printf("program linking failed!:\n"); - glGetProgramiv(gl.program, GL_INFO_LOG_LENGTH, &ret); - - if (ret > 1) { - log = malloc(ret); - glGetProgramInfoLog(gl.program, ret, NULL, log); - printf("%s", log); - } - - return -1; - } + ret = link_program(gl.program); + if (ret < 0) + return ret; glUseProgram(gl.program); |