diff options
author | Rob Clark <robdclark@gmail.com> | 2017-02-21 12:14:42 -0500 |
---|---|---|
committer | Rob Clark <robdclark@gmail.com> | 2017-02-21 13:59:58 -0500 |
commit | 2ec69c153a5456758c924e14e70d6544e4d2a866 (patch) | |
tree | 79a6f556126ff6d896951a3122858a66f072757d /common.c | |
parent | c6a1571a9b6a55b6d00040bac6172ffb4fd2d3b8 (diff) | |
download | kmscube-2ec69c153a5456758c924e14e70d6544e4d2a866.tar.gz |
split out get_program() helper
Diffstat (limited to 'common.c')
-rw-r--r-- | common.c | 80 |
1 files changed, 80 insertions, 0 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; +} |