Test
This commit is contained in:
		| @@ -10,8 +10,8 @@ pkg_check_modules(GTK3 REQUIRED gtk+-3.0) | ||||
| pkg_check_modules(CAIRO REQUIRED cairo) | ||||
|  | ||||
| find_package(OpenCL REQUIRED) | ||||
|  | ||||
|  | ||||
| find_package(OpenGL REQUIRED) | ||||
| find_package(GLUT REQUIRED) | ||||
|  | ||||
| add_subdirectory(glade) | ||||
|  | ||||
| @@ -27,10 +27,11 @@ add_compile_options(-Wall) | ||||
| add_executable(${PROJECT_NAME} ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/glade/resources.c) | ||||
| add_dependencies(${PROJECT_NAME} glib-resources) | ||||
| SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/glade/resources.c PROPERTIES GENERATED 1) | ||||
| target_link_libraries(${PROJECT_NAME} ${GLIB_LDFLAGS} ${GTK3_LDFLAGS} ${CAIRO_LDFLAGS} m pthread ${OPENCL_LIBRARIES}) | ||||
| target_link_libraries(${PROJECT_NAME} ${GLIB_LDFLAGS} ${GTK3_LDFLAGS} ${CAIRO_LDFLAGS} m pthread ${OPENCL_LIBRARIES} ${GLUT_LIBRARIES} ${OPENGL_gl_LIBRARIES} ${GLUT_LIBRARIES} epoxy) | ||||
| install (TARGETS ${PROJECT_NAME} DESTINATION bin) | ||||
|  | ||||
| message(STATUS "OpenCL found: ${OPENCL_FOUND}") | ||||
| message(STATUS "OpenCL includes: ${OPENCL_INCLUDE_DIRS}") | ||||
| message(STATUS "OpenCL CXX includes: ${OPENCL_HAS_CPP_BINDINGS}") | ||||
| message(STATUS "OpenCL libraries: ${OPENCL_LIBRARIES}") | ||||
| message(STATUS "OpenGL libraries: ${OPENGL_gl_LIBRARIES}") | ||||
|   | ||||
| @@ -11,8 +11,9 @@ | ||||
|       <placeholder/> | ||||
|     </child> | ||||
|     <child> | ||||
|       <object class="GtkDrawingArea" id="drawing-area"> | ||||
|       <object class="GtkGLArea" id="glarea"> | ||||
|         <property name="visible">True</property> | ||||
|         <property name="app_paintable">True</property> | ||||
|         <property name="can_focus">False</property> | ||||
|       </object> | ||||
|     </child> | ||||
|   | ||||
							
								
								
									
										138
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -4,6 +4,7 @@ | ||||
| #include <errno.h> | ||||
| #include <stdlib.h> | ||||
| #include <CL/cl.h> | ||||
| #include <epoxy/gl.h> | ||||
|  | ||||
| struct canvas_buffer { | ||||
| 		unsigned int *mandelbrot_buffer; | ||||
| @@ -22,13 +23,13 @@ static gboolean on_main_window_close(GtkWidget *window, gpointer data) | ||||
| 	return FALSE; | ||||
| } | ||||
|  | ||||
| void check_error(cl_int error) | ||||
| { | ||||
| 	if (error != CL_SUCCESS) { | ||||
| 		printf("OpenCL call failed with error %d\n", (int)error); | ||||
| 		exit(error); | ||||
| 	} | ||||
| } | ||||
| #define check_error(error) \ | ||||
| 	do { \ | ||||
| 	if (error != CL_SUCCESS) { \ | ||||
| 		printf("OpenCL call failed with error %d. %s:%d\n", (int)error, __func__, __LINE__); \ | ||||
| 		exit(error); \ | ||||
| 	} } while(0) | ||||
|  | ||||
|  | ||||
| void load_kernel_from_file(char *file, char **src) | ||||
| { | ||||
| @@ -58,51 +59,6 @@ cl_program create_program(char *src, cl_context context) | ||||
|  | ||||
| 	return program; | ||||
| } | ||||
| unsigned int *data_array = NULL; | ||||
| static gboolean drawing_callback(GtkWidget *widget, cairo_t *cr, gpointer data) | ||||
| { | ||||
| 	struct canvas_buffer *buff = (struct canvas_buffer *)data; | ||||
| 	int width; | ||||
| 	int height; | ||||
| 	GtkStyleContext *style_context; | ||||
| 	int x, y; | ||||
| 	double color_scale; | ||||
|  | ||||
| 	style_context = gtk_widget_get_style_context(widget); | ||||
| 	width = gtk_widget_get_allocated_width(widget); | ||||
| 	height = gtk_widget_get_allocated_height(widget); | ||||
|  | ||||
| 	cairo_save(cr); | ||||
| 	/* Drawing code start */ | ||||
| 	cairo_scale(cr, 1, -1); | ||||
| 	cairo_translate(cr, (double)width/2.0, -(double)height/2.0); | ||||
|  | ||||
|  | ||||
|        for (x = 0; x < buff->width; x++) { | ||||
| 	       for (y = 0; y < buff->height; y++) { | ||||
| 		       cairo_rectangle(cr, | ||||
| 				       ((double)x - (double)(buff->width - 1) / 2), | ||||
| 				       ((double)y - (double)(buff->height - 1) / 2), | ||||
| 				      1, | ||||
| 				       1); | ||||
| 		       if (data_array[y * buff->width + x] == buff->iterations) { | ||||
| 			       cairo_set_source_rgb (cr, 0, 0, 0); | ||||
| 		      } else { | ||||
| 			       color_scale = (double)data_array[y * buff->width + x] / buff->iterations; | ||||
| 			       cairo_set_source_rgb (cr, (sqrt(1-color_scale)), (color_scale*color_scale), color_scale); | ||||
| 		       } | ||||
| 		       cairo_fill(cr); | ||||
|  | ||||
| 	       } | ||||
| 	       } | ||||
|  | ||||
|  | ||||
| 	/* Drawing code end */ | ||||
| 	cairo_restore(cr); | ||||
|  | ||||
| 	return FALSE; | ||||
| } | ||||
|  | ||||
|  | ||||
| static int calculate_mandelbrot(struct canvas_buffer *buff) | ||||
| { | ||||
| @@ -123,10 +79,14 @@ static int calculate_mandelbrot(struct canvas_buffer *buff) | ||||
| 	char temp_buff[100]; | ||||
| 	size_t data_size; | ||||
| 	size_t work_size = 64; | ||||
|  | ||||
| 	unsigned int *data_array; | ||||
|  | ||||
| 	data_size = buff->width*buff->height; | ||||
| 	data_array = (unsigned int *)malloc(sizeof(data_array[0])*data_size); | ||||
|  | ||||
| 	if (!buff->mandelbrot_buffer) | ||||
| 		buff->mandelbrot_buffer = (unsigned int *)calloc(data_size, sizeof(buff->mandelbrot_buffer[0])); | ||||
|  | ||||
| 	data_array = buff->mandelbrot_buffer; | ||||
| 	if (!data_array) | ||||
| 		return -ENOMEM; | ||||
|  | ||||
| @@ -205,6 +165,8 @@ static int calculate_mandelbrot(struct canvas_buffer *buff) | ||||
|  | ||||
| 	clEnqueueReadBuffer(queue, dat_buff, CL_TRUE, 0, data_size*sizeof(data_array[0]), data_array, 0, NULL, NULL); | ||||
|  | ||||
| 	printf("Calculation finished!\n"); | ||||
|  | ||||
| 	ret = clFlush(queue); | ||||
| 	ret = clFinish(queue); | ||||
| 	ret = clReleaseKernel(kernel); | ||||
| @@ -219,39 +181,83 @@ static int calculate_mandelbrot(struct canvas_buffer *buff) | ||||
|  | ||||
| } | ||||
|  | ||||
| // This will identify our vertex buffer | ||||
| GLuint vertexbuffer; | ||||
|  | ||||
| // An array of 3 vectors which represents 3 vertices | ||||
| static const GLfloat g_vertex_buffer_data[] = { | ||||
|    -10.0f, -10.0f, 0.0f, | ||||
|    10.0f, -10.0f, 0.0f, | ||||
|    0.0f,  10.0f, 0.0f, | ||||
| }; | ||||
|  | ||||
|  | ||||
| static gboolean render(GtkGLArea *area, GdkGLContext *context) | ||||
| { | ||||
| 	gtk_gl_area_make_current(area); | ||||
|   glClearColor (1, 0, 1, 0.5); | ||||
|   //glClear (GL_COLOR_BUFFER_BIT); | ||||
|  | ||||
|  | ||||
|   // Generate 1 buffer, put the resulting identifier in vertexbuffer | ||||
|   glGenBuffers(1, &vertexbuffer); | ||||
|   // The following commands will talk about our 'vertexbuffer' buffer | ||||
|   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); | ||||
|   // Give our vertices to OpenGL. | ||||
|   glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); | ||||
|  | ||||
|  | ||||
|   // 1st attribute buffer : vertices | ||||
|   glEnableVertexAttribArray(0); | ||||
|   glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); | ||||
|   glVertexAttribPointer( | ||||
|      0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader. | ||||
|      3,                  // size | ||||
|      GL_FLOAT,           // type | ||||
|      GL_FALSE,           // normalized? | ||||
|      0,                  // stride | ||||
|      (void*)0            // array buffer offset | ||||
|   ); | ||||
|   // Draw the triangle ! | ||||
|   glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle | ||||
|   glDisableVertexAttribArray(0); | ||||
|  | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
| 	GtkDrawingArea *drawing_area; | ||||
| 	GtkWindow *window; | ||||
| 	GtkBuilder *builder; | ||||
| 	GtkGLArea *glarea; | ||||
| 	static struct canvas_buffer mandelbrot_buff; | ||||
|  | ||||
| 	gtk_init(&argc, &argv); | ||||
|  | ||||
| 	builder = gtk_builder_new_from_resource("/main.glade"); | ||||
|  | ||||
| 	drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(builder, "drawing-area")); | ||||
| 	window = GTK_WINDOW(gtk_builder_get_object(builder, "main-window")); | ||||
|  | ||||
| 	g_signal_connect(window, "delete-event", G_CALLBACK(on_main_window_close), NULL); | ||||
| 	g_signal_connect(G_OBJECT(drawing_area), | ||||
| 			 "draw", G_CALLBACK(drawing_callback), (gpointer)&mandelbrot_buff); | ||||
| 	glarea = GTK_GL_AREA(gtk_builder_get_object(builder, "glarea")); | ||||
|  | ||||
| 	g_object_unref(builder); | ||||
|  | ||||
|  | ||||
| 	mandelbrot_buff.x_span = 1;//2.8; | ||||
| 	mandelbrot_buff.y_span = 0.5;//2.25; | ||||
| 	mandelbrot_buff.center_x = -0.6; | ||||
| 	mandelbrot_buff.center_y = 0.6; | ||||
| 	mandelbrot_buff.width = 4000; | ||||
| 	mandelbrot_buff.height = 2000; | ||||
| 	mandelbrot_buff.width = 1920*3; | ||||
| 	mandelbrot_buff.height = 1080*3; | ||||
| 	mandelbrot_buff.iterations = 70; | ||||
| 	mandelbrot_buff.mandelbrot_buffer = NULL; | ||||
| 	calculate_mandelbrot(&mandelbrot_buff); | ||||
| 	//calculate_mandelbrot(&mandelbrot_buff); | ||||
|  | ||||
| 	gtk_gl_area_make_current(glarea); | ||||
|  | ||||
|  | ||||
|  | ||||
| 	GError *error = NULL; | ||||
| 	g_signal_connect(glarea, "render", G_CALLBACK(render), NULL); | ||||
|  | ||||
|  | ||||
| 	gtk_main(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user