Compare commits

..

7 Commits

Author SHA1 Message Date
bb4140b819 Add zoom to texture and a gray border around square 2019-10-01 14:27:08 +02:00
8e66150aae Add cglm to project 2019-10-01 14:25:27 +02:00
e3e544214a Add cglm 2019-10-01 13:22:41 +02:00
4ec9195857 Update rendering settings 2019-10-01 13:19:42 +02:00
c8fda11c5c Remove merge fail 2019-09-30 22:41:29 +02:00
fc0de0aa30 increase worksize again and print debug outputs 2019-09-30 22:39:56 +02:00
49201ea8cf reverted 2019-09-30 22:29:42 +02:00
5 changed files with 64 additions and 44 deletions

4
.gitmodules vendored Normal file
View File

@@ -0,0 +1,4 @@
[submodule "cglm/cglm"]
path = cglm/cglm
url = https://github.com/recp/cglm
branch = master

View File

@@ -10,10 +10,11 @@ pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
pkg_check_modules(CAIRO REQUIRED cairo) pkg_check_modules(CAIRO REQUIRED cairo)
find_package(OpenCL REQUIRED) find_package(OpenCL REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
add_subdirectory(glade) add_subdirectory(glade)
add_subdirectory(cglm)
include_directories(${GLIB_INCLUDE_DIRS} ${GTK3_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} ${OPENCL_INCLUDE_DIRS}) include_directories(${GLIB_INCLUDE_DIRS} ${GTK3_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} ${OPENCL_INCLUDE_DIRS})
link_directories(${GLIB_LINK_DIRS} ${GTK3_LINK_DIRS} ${CAIRO_LINK_DIRS}) link_directories(${GLIB_LINK_DIRS} ${GTK3_LINK_DIRS} ${CAIRO_LINK_DIRS})
@@ -25,13 +26,12 @@ aux_source_directory("src" SOURCES)
add_compile_options(-Wall) add_compile_options(-Wall)
add_executable(${PROJECT_NAME} ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/glade/resources.c) add_executable(${PROJECT_NAME} ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/glade/resources.c)
add_dependencies(${PROJECT_NAME} glib-resources) add_dependencies(${PROJECT_NAME} glib-resources cglm)
SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/glade/resources.c PROPERTIES GENERATED 1) 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} epoxy) target_link_libraries(${PROJECT_NAME} ${GLIB_LDFLAGS} ${GTK3_LDFLAGS} ${CAIRO_LDFLAGS} m pthread ${OPENCL_LIBRARIES} epoxy cglm)
install (TARGETS ${PROJECT_NAME} DESTINATION bin) install (TARGETS ${PROJECT_NAME} DESTINATION bin)
message(STATUS "OpenCL found: ${OPENCL_FOUND}") message(STATUS "OpenCL found: ${OPENCL_FOUND}")
message(STATUS "OpenCL includes: ${OPENCL_INCLUDE_DIRS}") message(STATUS "OpenCL includes: ${OPENCL_INCLUDE_DIRS}")
message(STATUS "OpenCL CXX includes: ${OPENCL_HAS_CPP_BINDINGS}") message(STATUS "OpenCL CXX includes: ${OPENCL_HAS_CPP_BINDINGS}")
message(STATUS "OpenCL libraries: ${OPENCL_LIBRARIES}") message(STATUS "OpenCL libraries: ${OPENCL_LIBRARIES}")
message(STATUS "OpenGL libraries: ${OPENGL_gl_LIBRARIES}")

14
cglm/CMakeLists.txt Normal file
View File

@@ -0,0 +1,14 @@
project(cglm)
cmake_minimum_required(VERSION 2.8)
include_directories(${GLIB_INCLUDE_DIRS} ${GTK3_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} ${OPENCL_INCLUDE_DIRS})
link_directories(${GLIB_LINK_DIRS} ${GTK3_LINK_DIRS} ${CAIRO_LINK_DIRS})
add_definitions(${GLIB2_CFLAGS_OTHER})
aux_source_directory("cglm/src" SOURCES)
add_library(${PROJECT_NAME} STATIC ${SOURCES})
add_compile_options(-Wall -std=gnu99 -O3 -Wstrict-aliasing=2 -fstrict-aliasing -pedantic)
target_include_directories(${PROJECT_NAME} PUBLIC "cglm/include")
target_link_libraries(${PROJECT_NAME} m)

1
cglm/cglm Submodule

Submodule cglm/cglm added at 7cdeada701

View File

@@ -6,31 +6,34 @@
#include <CL/cl.h> #include <CL/cl.h>
#include <epoxy/gl.h> #include <epoxy/gl.h>
#include <epoxy/glx.h> #include <epoxy/glx.h>
#include <time.h>
#include <cglm/call.h>
static const char * const vertex_shader = "#version 330 core\n \ static const char * const vertex_shader = "#version 330 core\n \
layout (location = 0) in vec3 aPos;\n \ layout (location = 0) in vec3 aPos;\n \
layout (location = 1) in vec2 aTexCoord;\n\ layout (location = 1) in vec2 aTexCoord;\n\
out vec2 texCoord;\n \ out vec2 texCoord;\n\
out vec3 vertPos;\n \
uniform float zoom;\n\
void main()\n \ void main()\n \
{\n \ {\n \
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n \ gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n \
texCoord = aTexCoord;\n\ texCoord = aTexCoord / zoom;\n\
vertPos = aPos;\n\
}\n"; }\n";
static const char * const orange_framgment_shader = " \ static const char * const orange_framgment_shader = " \
#version 330 core\n \ #version 330 core\n \
out vec4 FragColor;\n \ out vec4 FragColor;\n \
in vec4 vertexColor;\n \ in vec3 vertPos;\n \
in vec2 texCoord;\n \ in vec2 texCoord;\n \
uniform sampler2D ourTexture;\n \ uniform sampler2D ourTexture;\n \
\n \ \n \
void main()\n \ void main()\n \
{\n \ {\n \
FragColor = texture(ourTexture, texCoord);\n \ FragColor = texture(ourTexture, texCoord);\n\
}"; }";
struct canvas_buffer { struct canvas_buffer {
unsigned char *mandelbrot_buffer; unsigned char *mandelbrot_buffer;
unsigned int iterations; unsigned int iterations;
@@ -48,13 +51,13 @@ static gboolean on_main_window_close(GtkWidget *window, gpointer data)
return FALSE; return FALSE;
} }
#define check_error(error) \ void check_error(cl_int error)
do { \ {
if (error != CL_SUCCESS) { \ if (error != CL_SUCCESS) {
printf("OpenCL call failed with error %d. %s:%d\n", (int)error, __func__, __LINE__); \ printf("OpenCL call failed with error %d\n", (int)error);
exit(error); \ exit(error);
} } while(0) }
}
void load_kernel_from_file(char *file, char **src) void load_kernel_from_file(char *file, char **src)
{ {
@@ -103,7 +106,7 @@ static int calculate_mandelbrot(struct canvas_buffer *buff)
char *source_code = NULL; char *source_code = NULL;
char temp_buff[100]; char temp_buff[100];
size_t data_size; size_t data_size;
size_t work_size = 10; size_t work_size = 64;
data_size = buff->width*buff->height; data_size = buff->width*buff->height;
@@ -189,8 +192,6 @@ static int calculate_mandelbrot(struct canvas_buffer *buff)
clEnqueueReadBuffer(queue, dat_buff, CL_TRUE, 0, data_size*3, buff->mandelbrot_buffer, 0, NULL, NULL); clEnqueueReadBuffer(queue, dat_buff, CL_TRUE, 0, data_size*3, buff->mandelbrot_buffer, 0, NULL, NULL);
printf("Calculation finished!\n");
ret = clFlush(queue); ret = clFlush(queue);
ret = clFinish(queue); ret = clFinish(queue);
ret = clReleaseKernel(kernel); ret = clReleaseKernel(kernel);
@@ -207,10 +208,10 @@ static int calculate_mandelbrot(struct canvas_buffer *buff)
float vertices[] = { float vertices[] = {
// Vertex Texture // Vertex Texture
-1.0f, -1.0f, 0.0f, 0.0f, 0.0f, // bottom left -0.95f, -0.95f, 0.0f, 0.0f, 0.0f, // bottom left
-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // top left -0.95f, 0.95f, 0.0f, 0.0f, 1.0f, // top left
1.0f, -1.0f, 0.0f, 1.0f, 0.0f, // bottom right 0.95f, -0.95f, 0.0f, 1.0f, 0.0f, // bottom right
1.0f, 1.0f, 0.0f, 1.0f, 1.0f, // top right 0.95f, 0.95f, 0.0f, 1.0f, 1.0f, // top right
}; };
unsigned int indices[] = { unsigned int indices[] = {
@@ -226,13 +227,17 @@ static unsigned int texture_id;
gboolean render(GtkGLArea *gl_area, GdkGLContext *context, gpointer user_data) gboolean render(GtkGLArea *gl_area, GdkGLContext *context, gpointer user_data)
{ {
int zoom_loc;
static float zoom = 1.0f;
gtk_gl_area_make_current(gl_area); gtk_gl_area_make_current(gl_area);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader_program_id); glUseProgram(shader_program_id);
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); zoom_loc = glGetUniformLocation(shader_program_id, "zoom");
glUniform1f(zoom_loc, zoom);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBindTexture(GL_TEXTURE_2D, texture_id); glBindTexture(GL_TEXTURE_2D, texture_id);
glBindVertexArray(vertex_array_object); glBindVertexArray(vertex_array_object);
//glDrawArrays(GL_TRIANGLES, 0, 3); //glDrawArrays(GL_TRIANGLES, 0, 3);
@@ -254,7 +259,7 @@ void realize(GtkGLArea *gl_area, gpointer user_data)
char info_log[512]; char info_log[512];
gtk_gl_area_make_current(gl_area); gtk_gl_area_make_current(gl_area);
glClearColor(0, 0, 0, 1); glClearColor(0.2, 0.2, 0.2, 1);
glGenVertexArrays(1, &vertex_array_object); glGenVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object); glBindVertexArray(vertex_array_object);
@@ -335,8 +340,8 @@ int main(int argc, char **argv)
GtkGLArea *gl_area; GtkGLArea *gl_area;
GtkWindow *window; GtkWindow *window;
GtkBuilder *builder; GtkBuilder *builder;
GtkWidget *temp;
static struct canvas_buffer mandelbrot_buff; static struct canvas_buffer mandelbrot_buff;
clock_t start, end;
gtk_init(&argc, &argv); gtk_init(&argc, &argv);
@@ -346,24 +351,20 @@ int main(int argc, char **argv)
g_signal_connect(window, "delete-event", G_CALLBACK(on_main_window_close), NULL); g_signal_connect(window, "delete-event", G_CALLBACK(on_main_window_close), NULL);
mandelbrot_buff.x_span = 0.1;//2.8;
mandelbrot_buff.x_span = 0.075;//2.8; mandelbrot_buff.y_span = 0.1;//2.25;
mandelbrot_buff.y_span = 0.075;//2.25;
mandelbrot_buff.center_x = -0.6; mandelbrot_buff.center_x = -0.6;
mandelbrot_buff.center_y = 0.45; mandelbrot_buff.center_y = 0.44;
mandelbrot_buff.width = 3000; mandelbrot_buff.width = 4000;
mandelbrot_buff.height = 3000; mandelbrot_buff.height = 4000;
mandelbrot_buff.iterations = 200; mandelbrot_buff.iterations = 1000;
mandelbrot_buff.mandelbrot_buffer = NULL; mandelbrot_buff.mandelbrot_buffer = NULL;
//calculate_mandelbrot(&mandelbrot_buff);
gtk_gl_area_make_current(glarea);
GError *error = NULL;
g_signal_connect(glarea, "render", G_CALLBACK(render), NULL);
printf("Compile and run Mandelbrot on OpenCL HW\n");
start = clock();
calculate_mandelbrot(&mandelbrot_buff);
end = clock();
printf("Calculation finished. Time needed: %lf ms\n", ((double)(end - start)) / CLOCKS_PER_SEC * 1000.0);
gl_area = GTK_GL_AREA(gtk_gl_area_new()); gl_area = GTK_GL_AREA(gtk_gl_area_new());
@@ -380,7 +381,7 @@ int main(int argc, char **argv)
gtk_gl_area_make_current(gl_area); gtk_gl_area_make_current(gl_area);
printf("Gui will be displayed\n");
gtk_main(); gtk_main();
return 0; return 0;