1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#define CL_TARGET_OPENCL_VERSION 110
#include <stdio.h>
#include <GL/glut.h>
#include <GL/glx.h>
#include <CL/cl_gl.h>
#include "sysfatal.h"
#define PROG "balls.cl"
#define KERNEL "balls"
enum { WIDTH = 640, HEIGHT = 480 };
void initGL(int argc, char *argv[]);
cl_context initCL(void);
int
main(int argc, char *argv[]) {
cl_context context;
initGL(argc, argv);
context = initCL();
clReleaseContext(context);
}
void
initGL(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("Balls");
glClearColor(1, 1, 1, 1);
}
cl_context
initCL(void) {
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_int err;
if (clGetPlatformIDs(1, &platform, NULL) < 0)
sysfatal("No OpenCL platform available.\n");
#ifdef WINDOWS
cl_context_properties properties[] = {
CL_GL_CONTEXT_KHR, (cl_context_properties) wglGetCurrentContext(),
CL_GLX_DISPLAY_KHR, (cl_context_properties) wctlGetCurrentDC(),
CL_CONTEXT_PLATFORM, (cl_context_properties) platform,
0
};
#else
cl_context_properties properties[] = {
CL_GL_CONTEXT_KHR, (cl_context_properties) glXGetCurrentContext(),
CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay(),
CL_CONTEXT_PLATFORM, (cl_context_properties) platform,
0
};
#endif
if (clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL) < 0)
sysfatal("No GPUs available.\n");
context = clCreateContext(properties, 1, &device, NULL, NULL, &err);
if (err < 0)
sysfatal("Failed to create context.\n");
return context;
}
|