summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/poc_c/compil.sh9
-rw-r--r--tests/poc_c/main.c112
2 files changed, 100 insertions, 21 deletions
diff --git a/tests/poc_c/compil.sh b/tests/poc_c/compil.sh
index f636aaf..d64cc67 100755
--- a/tests/poc_c/compil.sh
+++ b/tests/poc_c/compil.sh
@@ -1,10 +1,15 @@
#!/bin/bash -e
+AMDAPP_PATH=/opt/AMDAPP
+
CFLAGS="-Wall -g"
LDFLAGS="-Wall -g"
-CFLAGS="$CFLAGS $(pkg-config --cflags gtkglextmm-1.2)"
-LIBS="$(pkg-config --libs gtkglextmm-1.2)"
+CFLAGS="$CFLAGS $(pkg-config --cflags gtkglextmm-1.2) -I$AMDAPP_PATH/include"
+LIBS="$(pkg-config --libs gtkglextmm-1.2) -lGLEW -lOpenCL -L$AMDAPP_PATH/lib/x86_64"
+echo "Compiling..."
gcc $CFLAGS -c main.c -o main.o
+
+echo "Linking..."
gcc $LDFLAGS -o main main.o $LIBS
diff --git a/tests/poc_c/main.c b/tests/poc_c/main.c
index 2b86f0f..4e2be04 100644
--- a/tests/poc_c/main.c
+++ b/tests/poc_c/main.c
@@ -3,9 +3,12 @@
#include <gtk/gtk.h>
#include <gtk/gtkgl.h>
-#include <GL/gl.h>
+/*#include <GL/gl.h>*/
+#include <GL/glew.h> // For VBO OpenGL extensions
#include <GL/glu.h>
+#include <CL/opencl.h>
+
#include <gdk/x11/gdkglx.h> // X11 specific
gboolean gl_area_on_draw (GtkObject* area, GdkEventExpose* event, gpointer data) {
@@ -18,8 +21,6 @@ gboolean gl_area_on_draw (GtkObject* area, GdkEventExpose* event, gpointer data)
return FALSE;
}
- printf("on_draw_glx_current_context==%p\n", (void *)glXGetCurrentContext());
-
GtkAllocation allocation;
gtk_widget_get_allocation (GTK_WIDGET (area), &allocation);
GLdouble viewport_width = (GLdouble) allocation.width;
@@ -83,6 +84,12 @@ int main(int argc, char *argv[]) {
Display *glx_display; // X11 specific
gboolean res;
+ glewInit();
+ if ( !glewIsSupported("GL_ARB_vertex_buffer_object") ) {
+ fputs ("OpenGL extension GL_ARB_vertex_buffer_object is mandatory for this application\n", stderr);
+ return EXIT_FAILURE;
+ }
+
gtk_init(&argc, &argv);
if (gdk_gl_init_check(&argc, &argv) == FALSE ) {
fputs ("Failed to initialize GDKGLExt.\n", stderr);
@@ -144,34 +151,101 @@ int main(int argc, char *argv[]) {
printf("glx_current_context==%p\n", (void *)glx_context);
printf("glx_current_display==%p\n", (void *)glx_display);
+
+ cl_context_properties cpsGL[] = {
+ /* CL_CONTEXT_PLATFORM value to be filled later */
+ CL_CONTEXT_PLATFORM, (cl_context_properties) NULL,
+ CL_GLX_DISPLAY_KHR, (intptr_t) glx_display,
+ CL_GL_CONTEXT_KHR, (intptr_t) glx_context, 0
+ };
/* END : X11 specific */
gdk_gl_drawable_gl_end (drawable);
- //TODO OpenCL init (platform pointer). In a while loop for trying all ?
- /* BEGIN : X11 specific */
- cl_context_properties cpsGL[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform,
- CL_GLX_DISPLAY_KHR, (intptr_t) glx_display,
- CL_GL_CONTEXT_KHR, (intptr_t) glx_context, 0
- };
+ cl_uint i, plat_count;
+ cl_platform_id *plat_ids, plat_id;
+ char pbuf[100];
+ size_t deviceSize;
+ cl_device_id device;
+ cl_context cl_ctx;
+ cl_command_queue commandQueue;
- /*
- if (!clGetGLContextInfoKHR)
- {
- clGetGLContextInfoKHR = (clGetGLContextInfoKHR_fn) clGetExtensionFunctionAddressForPlatform(platform, "clGetGLContextInfoKHR");
- if (!clGetGLContextInfoKHR)
- {
- std::cout << "Failed to query proc address for clGetGLContextInfoKHR";
- }
- }
+ typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)(
+ const cl_context_properties *properties,
+ cl_gl_context_info param_name,
+ size_t param_value_size,
+ void *param_value,
+ size_t *param_value_size_ret);
+ clGetGLContextInfoKHR_fn clGetGLContextInfoKHR_proc;
-*/
+ clGetPlatformIDs(0, NULL, &plat_count); // Get platform count
+ if ( ! ( plat_count > 0 ) ) {
+ fputs ("Failed to find an OpenCL platform\n", stderr);
+ return EXIT_FAILURE;
+ }
+ plat_ids=malloc(sizeof(cl_platform_id *) * plat_count);
+ clGetPlatformIDs(plat_count, plat_ids, &plat_count); // Get platform IDs
+
+ for(i=0;i<plat_count;i++) {
+ plat_id=plat_ids[i];
+
+ clGetPlatformInfo(plat_id, CL_PLATFORM_VENDOR, sizeof(pbuf), pbuf, NULL);
+ printf("Plaform %i (id %p) : VENDOR : '%s'\n", i, (void *) plat_id, pbuf);
+
+ /* CL_CONTEXT_PLATFORM value filled now */
+ cpsGL[1]=(cl_context_properties) plat_id;
+
+ // TODO : use the clGetGLContextInfoKHR() normally when available
+ clGetGLContextInfoKHR_proc = (clGetGLContextInfoKHR_fn) clGetExtensionFunctionAddressForPlatform(plat_id, "clGetGLContextInfoKHR");
+ if (!clGetGLContextInfoKHR_proc) {
+ fputs ("Failed to query proc address of clGetGLContextInfoKHR for this platform\n", stderr);
+ continue;
+ }
+
+ deviceSize=0;
+ // get deviceSize (should be 1*sizeof(cl_device_id) with CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR)
+ res=clGetGLContextInfoKHR_proc(cpsGL,CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR,0,NULL,&deviceSize);
+ if ( res!=CL_SUCCESS || deviceSize!=1*sizeof(cl_device_id)) {
+ fputs ("Failed to get CL_CURRENT_DEVICE_FOR_GL_CONTEXT deviceSize\n", stderr);
+ continue;
+ }
+ device=0;
+ res=clGetGLContextInfoKHR_proc(cpsGL,CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR,deviceSize,&device,NULL);
+ if ( res!=CL_SUCCESS || device==0 ) {
+ fputs ("Failed to get CL_CURRENT_DEVICE_FOR_GL_CONTEXT device\n", stderr);
+ continue;
+ }
+ //TODO : implement selection if multiple devices are usable (instead of taking the first one)
+ break;
+ }
+ printf("cl_device==%p\n", (void *)device);
+
+ cl_ctx = clCreateContext(cpsGL,1,&device,0,0,&res);
+ commandQueue = clCreateCommandQueue(cl_ctx,device,0,&res);
+
+ GLuint gl_vbo;
+ unsigned int meshWidth=2, meshHeight=2;
+ GLsizeiptr gl_vbo_data_size = meshWidth * meshHeight * sizeof(cl_float4);
+ float gl_vertex_default_pos[16] = { // to be removed
+ 0.5, -0.5, 0.0, 1.0,
+ 0.5, 0.5, 0.0, 1.0,
+ -0.5, -0.5, 0.0, 1.0,
+ -0.5, -0.5, 0.0, 1.0
+ };
+ res = gdk_gl_drawable_gl_begin(drawable, gl_context);
+ glGenBuffers(1, &gl_vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, gl_vbo);
+ glBufferData(GL_ARRAY_BUFFER, gl_vbo_data_size, NULL, GL_STREAM_DRAW /*GL_DYNAMIC_DRAW vu dans SimpleGL de ATI*/);
+ // to be removed : default values
+ glBufferSubData(GL_ARRAY_BUFFER,0, gl_vbo_data_size, gl_vertex_default_pos);
+ glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind buffer (no more current buffer)
+ gdk_gl_drawable_gl_end (drawable);
gtk_main();
return EXIT_SUCCESS;