summaryrefslogtreecommitdiff
path: root/common.c
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2017-02-21 12:14:42 -0500
committerRob Clark <robdclark@gmail.com>2017-02-21 13:59:58 -0500
commit2ec69c153a5456758c924e14e70d6544e4d2a866 (patch)
tree79a6f556126ff6d896951a3122858a66f072757d /common.c
parentc6a1571a9b6a55b6d00040bac6172ffb4fd2d3b8 (diff)
downloadkmscube-2ec69c153a5456758c924e14e70d6544e4d2a866.tar.gz
split out get_program() helper
Diffstat (limited to 'common.c')
-rw-r--r--common.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/common.c b/common.c
index b3c2212..ee6b23f 100644
--- a/common.c
+++ b/common.c
@@ -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;
+}