Compare commits
7 Commits
4d26053a70
...
opengl
Author | SHA1 | Date | |
---|---|---|---|
bb4140b819 | |||
8e66150aae | |||
e3e544214a | |||
4ec9195857 | |||
c8fda11c5c | |||
fc0de0aa30 | |||
49201ea8cf |
4
.gitmodules
vendored
Normal file
4
.gitmodules
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
[submodule "cglm/cglm"]
|
||||
path = cglm/cglm
|
||||
url = https://github.com/recp/cglm
|
||||
branch = master
|
@@ -10,10 +10,11 @@ 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)
|
||||
add_subdirectory(cglm)
|
||||
|
||||
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})
|
||||
@@ -25,13 +26,12 @@ aux_source_directory("src" SOURCES)
|
||||
add_compile_options(-Wall)
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
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}")
|
||||
|
14
cglm/CMakeLists.txt
Normal file
14
cglm/CMakeLists.txt
Normal 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
1
cglm/cglm
Submodule
Submodule cglm/cglm added at 7cdeada701
79
src/main.c
79
src/main.c
@@ -6,31 +6,34 @@
|
||||
#include <CL/cl.h>
|
||||
#include <epoxy/gl.h>
|
||||
#include <epoxy/glx.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <cglm/call.h>
|
||||
|
||||
static const char * const vertex_shader = "#version 330 core\n \
|
||||
layout (location = 0) in vec3 aPos;\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 \
|
||||
{\n \
|
||||
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n \
|
||||
texCoord = aTexCoord;\n\
|
||||
texCoord = aTexCoord / zoom;\n\
|
||||
vertPos = aPos;\n\
|
||||
}\n";
|
||||
|
||||
static const char * const orange_framgment_shader = " \
|
||||
#version 330 core\n \
|
||||
out vec4 FragColor;\n \
|
||||
in vec4 vertexColor;\n \
|
||||
in vec3 vertPos;\n \
|
||||
in vec2 texCoord;\n \
|
||||
uniform sampler2D ourTexture;\n \
|
||||
\n \
|
||||
void main()\n \
|
||||
{\n \
|
||||
FragColor = texture(ourTexture, texCoord);\n \
|
||||
FragColor = texture(ourTexture, texCoord);\n\
|
||||
}";
|
||||
|
||||
|
||||
struct canvas_buffer {
|
||||
unsigned char *mandelbrot_buffer;
|
||||
unsigned int iterations;
|
||||
@@ -48,13 +51,13 @@ static gboolean on_main_window_close(GtkWidget *window, gpointer data)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#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 check_error(cl_int error)
|
||||
{
|
||||
if (error != CL_SUCCESS) {
|
||||
printf("OpenCL call failed with error %d\n", (int)error);
|
||||
exit(error);
|
||||
}
|
||||
}
|
||||
|
||||
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 temp_buff[100];
|
||||
size_t data_size;
|
||||
size_t work_size = 10;
|
||||
size_t work_size = 64;
|
||||
|
||||
|
||||
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);
|
||||
|
||||
printf("Calculation finished!\n");
|
||||
|
||||
ret = clFlush(queue);
|
||||
ret = clFinish(queue);
|
||||
ret = clReleaseKernel(kernel);
|
||||
@@ -207,10 +208,10 @@ static int calculate_mandelbrot(struct canvas_buffer *buff)
|
||||
|
||||
float vertices[] = {
|
||||
// Vertex Texture
|
||||
-1.0f, -1.0f, 0.0f, 0.0f, 0.0f, // bottom left
|
||||
-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // top left
|
||||
1.0f, -1.0f, 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, 0.0f, 0.0f, // bottom left
|
||||
-0.95f, 0.95f, 0.0f, 0.0f, 1.0f, // top left
|
||||
0.95f, -0.95f, 0.0f, 1.0f, 0.0f, // bottom right
|
||||
0.95f, 0.95f, 0.0f, 1.0f, 1.0f, // top right
|
||||
};
|
||||
|
||||
unsigned int indices[] = {
|
||||
@@ -226,13 +227,17 @@ static unsigned int texture_id;
|
||||
|
||||
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);
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
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);
|
||||
glBindVertexArray(vertex_array_object);
|
||||
//glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
@@ -254,7 +259,7 @@ void realize(GtkGLArea *gl_area, gpointer user_data)
|
||||
char info_log[512];
|
||||
|
||||
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);
|
||||
glBindVertexArray(vertex_array_object);
|
||||
@@ -335,8 +340,8 @@ int main(int argc, char **argv)
|
||||
GtkGLArea *gl_area;
|
||||
GtkWindow *window;
|
||||
GtkBuilder *builder;
|
||||
GtkWidget *temp;
|
||||
static struct canvas_buffer mandelbrot_buff;
|
||||
clock_t start, end;
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
mandelbrot_buff.x_span = 0.075;//2.8;
|
||||
mandelbrot_buff.y_span = 0.075;//2.25;
|
||||
mandelbrot_buff.x_span = 0.1;//2.8;
|
||||
mandelbrot_buff.y_span = 0.1;//2.25;
|
||||
mandelbrot_buff.center_x = -0.6;
|
||||
mandelbrot_buff.center_y = 0.45;
|
||||
mandelbrot_buff.width = 3000;
|
||||
mandelbrot_buff.height = 3000;
|
||||
mandelbrot_buff.iterations = 200;
|
||||
mandelbrot_buff.center_y = 0.44;
|
||||
mandelbrot_buff.width = 4000;
|
||||
mandelbrot_buff.height = 4000;
|
||||
mandelbrot_buff.iterations = 1000;
|
||||
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());
|
||||
@@ -380,7 +381,7 @@ int main(int argc, char **argv)
|
||||
|
||||
gtk_gl_area_make_current(gl_area);
|
||||
|
||||
|
||||
printf("Gui will be displayed\n");
|
||||
gtk_main();
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user