summaryrefslogtreecommitdiffstats
path: root/balls.c
diff options
context:
space:
mode:
Diffstat (limited to 'balls.c')
-rw-r--r--balls.c71
1 files changed, 59 insertions, 12 deletions
diff --git a/balls.c b/balls.c
index ecb649e..bfa2f4b 100644
--- a/balls.c
+++ b/balls.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <stdio.h>
+#include <GL/glew.h>
#include <GL/glut.h>
#include <GL/glx.h>
#include <CL/cl_gl.h>
@@ -10,12 +11,16 @@
#define PROG_FILE "balls.cl"
#define KERNEL_FUNC "balls"
+#define VERTEX_SHADER "balls.vert"
+#define FRAGMENT_SHADER "balls.frag"
enum { WIDTH = 640, HEIGHT = 480 };
void initGL(int argc, char *argv[]);
void initCL(void);
+void initShaders(void);
char *readFile(const char *filename, size_t *size);
+void compileShader(GLint shader);
static cl_context context;
static cl_command_queue queue;
@@ -32,11 +37,18 @@ main(int argc, char *argv[]) {
void
initGL(int argc, char *argv[]) {
+ GLenum err;
+
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("Balls");
glClearColor(1, 1, 1, 1);
+
+ if ((err = glewInit()) != GLEW_OK)
+ sysfatal("Failed to initialize GLEW.\n");
+
+ initShaders();
}
void
@@ -109,6 +121,36 @@ initCL(void) {
sysfatal("Failed to create kernel: %d\n", err);
}
+void
+initShaders(void) {
+ GLuint vs, fs, prog;
+ char *vSrc, *fSrc;
+ size_t vLen, fLen;
+
+ vs = glCreateShader(GL_VERTEX_SHADER);
+ fs = glCreateShader(GL_FRAGMENT_SHADER);
+
+ vSrc = readFile(VERTEX_SHADER, &vLen);
+ fSrc = readFile(FRAGMENT_SHADER, &fLen);
+
+ glShaderSource(vs, 1, (const char **) &vSrc, (GLint *) &vLen);
+ glShaderSource(fs, 1, (const char **) &fSrc, (GLint *) &fLen);
+
+ compileShader(vs);
+ compileShader(fs);
+
+ prog = glCreateProgram();
+
+ glBindAttribLocation(prog, 0, "in_coords");
+ glBindAttribLocation(prog, 1, "in_colors");
+
+ glAttachShader(prog, vs);
+ glAttachShader(prog, fs);
+
+ glLinkProgram(prog);
+ glUseProgram(prog);
+}
+
char *
readFile(const char *filename, size_t *size) {
FILE *f;
@@ -130,16 +172,21 @@ readFile(const char *filename, size_t *size) {
}
void
-configSharedData(void) {
-
-}
-
-void
-execKernel(void) {
-
-}
-
-void
-display(void) {
-
+compileShader(GLint shader) {
+ GLint success;
+ GLsizei logSize;
+ GLchar *log;
+
+ glCompileShader(shader);
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
+ if (!success) {
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logSize);
+ if ((log = malloc((logSize+1) * sizeof(GLchar))) == NULL)
+ sysfatal("Failed to allocate space for shader compile log.\n");
+ glGetShaderInfoLog(shader, logSize+1, NULL, log);
+ log[logSize] = '\0';
+ fprintf(stderr, "%s\n", log);
+ free(log);
+ exit(1);
+ }
}