summaryrefslogtreecommitdiff
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
parentc6a1571a9b6a55b6d00040bac6172ffb4fd2d3b8 (diff)
split out get_program() helper
-rw-r--r--common.c80
-rw-r--r--common.h10
-rw-r--r--kmscube.c77
3 files changed, 98 insertions, 69 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;
+}
diff --git a/common.h b/common.h
index 8f3a827..fbbed23 100644
--- a/common.h
+++ b/common.h
@@ -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 */
diff --git a/kmscube.c b/kmscube.c
index bb557b5..dc3adeb 100644
--- a/kmscube.c
+++ b/kmscube.c
@@ -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);