diff options
author | Leonard Kugis <leonardkugis@gmail.com> | 2018-01-26 01:12:49 +0100 |
---|---|---|
committer | Leonard Kugis <leonardkugis@gmail.com> | 2018-01-26 01:12:49 +0100 |
commit | 1c3ea27064257d8cf7b9f36b0388b8cf2e94ab08 (patch) | |
tree | 9b2d9a0dbb2940158b2fb734325cfc360efac6f4 /src/render_cpu.c | |
parent | e6c241add375353c1c80b0e3915a6505dbd5db9a (diff) |
Skeleton for OpenCL rendering, cleaned up alot, WIP and crashing
Diffstat (limited to 'src/render_cpu.c')
-rw-r--r-- | src/render_cpu.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/render_cpu.c b/src/render_cpu.c new file mode 100644 index 0000000..9370461 --- /dev/null +++ b/src/render_cpu.c @@ -0,0 +1,86 @@ +/* + * render.c + * + * Created on: 15.01.2018 + * Author: Superleo1810 + */ + +#include "render.h" +#define HAVE_STRUCT_TIMESPEC + +void init_cpu(CpuConfig *config) +{ + config_cpu = config; +} + +void render_cpu(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glBindTexture(GL_TEXTURE_2D, tex); + glEnable(GL_TEXTURE_2D); + + glBegin(GL_QUADS); + glTexCoord2i(0, 0); glVertex2i(0, 0); + glTexCoord2i(0, 1); glVertex2i(0, _config->height); + glTexCoord2i(1, 1); glVertex2i(_config->width, _config->height); + glTexCoord2i(1, 0); glVertex2i(_config->width, 0); + glEnd(); + + glDisable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, 0); + glutSwapBuffers(); +} + +void calculate(d64 x_min, d64 y_min, d64 x_max, d64 y_max, u32 (*sfunc) (d64, d64, u32), u32 *arr) +{ + pthread_t thread; + ThreadArgs *args = (ThreadArgs *) malloc(config_cpu->threads * sizeof(ThreadArgs)); + for(u8 i = 0; i < config_cpu->threads; i++) + { + args[i] = (ThreadArgs) { .tc = config_cpu->threads, .tid = i, .x_min = x_min, .y_min = y_min, .x_max = x_max, .y_max = y_max, .sfunc = sfunc, .arr = arr }; + pthread_create(&thread, NULL, calculate_t, (void *)&args[i]); + } + pthread_join(thread, NULL); +} + +void calculate_t(void *args) +{ + ThreadArgs *_args = (ThreadArgs *)args; + d64 x_math, y_math; + u32 iterations; + for (u32 y = (config_cpu->height/_args->tc)*(_args->tid); y < config_cpu->height; y++) + { + for (u32 x = 0; x < _config->width; x++) + { + x_math = _args->x_min + ((d64) x * (_args->x_max - _args->x_min)) / config_cpu->width; + y_math = _args->y_min + ((d64) (config_cpu->height - y) * (_args->y_max - _args->y_min)) / config_cpu->height; + iterations = _args->sfunc(x_math, y_math, config_cpu->iterations); + _args->arr[COORDS(x, y, config_cpu->width)] = (((1<<24)-1)*iterations)/config_cpu->iterations; + } + } +} + +long double zoom_func(d64 ft, d64 s) +{ + return (s - expl(-ft)); +} + +void idle_cpu(void) +{ + calculate(x_min, y_min, x_max, y_max, config_cpu->set_func, config_cpu->arr); + //glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, config_cpu->width, config_cpu->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, s_arr); + glBindTexture(GL_TEXTURE_2D, 0); + int t = glutGet(GLUT_ELAPSED_TIME); + dt = (t - delta) / 1000.0; + delta = t; + ft+=(config_cpu->speed*dt); + x_min = x_min_s + zoom_func(ft, (d64)2.0 + config_cpu->to_x); + y_min = y_min_s + zoom_func(ft, (d64)1.0 + config_cpu->to_y); + x_max = x_max_s - zoom_func(ft, (d64)1.0 - config_cpu->to_x); + y_max = y_max_s - zoom_func(ft, (d64)1.0 - config_cpu->to_y); + glutPostRedisplay(); +} |