X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=erebus2020;a=blobdiff_plain;f=xerebus%2Fsrc%2Fmain.c;h=9569df193418dfb603e480c25d3e55b35351d6c6;hp=7f288abdabf9074adc5334c4b0f2c128bcdace58;hb=11a8b7dc9f82d6ed298cb18c94b8053c41832fa1;hpb=29ae0aac16008cd44d73f2ac8320504b907be607 diff --git a/xerebus/src/main.c b/xerebus/src/main.c index 7f288ab..9569df1 100644 --- a/xerebus/src/main.c +++ b/xerebus/src/main.c @@ -1,18 +1,36 @@ #include +#include +#include #include "opengl.h" -#include "miniglut.h" +#include #include "erebus.h" #include "sdr.h" +#ifdef __unix__ +#include +#include +#include +#include + +static Display *dpy; +static int pfd[2]; +#endif + +#define post_redisplay() do { glutPostRedisplay(); redisp_pending = 1; } while(0) + +static void jobdone(unsigned int job, struct erb_rect *rect, void *cls); static void display(void); static void reshape(int x, int y); static void keyb(unsigned char key, int x, int y); static void mouse(int bn, int st, int x, int y); static void motion(int x, int y); +static void dummy_idle(void) {} + static int win_width, win_height; static float win_aspect; -static int reshape_pending; +static int reshape_pending, redisp_pending; +static int quit; static struct erb_rend *erb; @@ -48,12 +66,19 @@ int main(int argc, char **argv) { unsigned int vs, ps; +#ifdef __unix__ + int xfd, maxfd; + + pipe(pfd); +#endif + glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowSize(1280, 800); glutCreateWindow("X erebus"); glutDisplayFunc(display); + glutIdleFunc(dummy_idle); /* we want to be blocking in select, not in glutMainLoopEvent */ glutReshapeFunc(reshape); glutKeyboardFunc(keyb); glutMouseFunc(mouse); @@ -73,18 +98,57 @@ int main(int argc, char **argv) if(!(erb = erb_create())) { return 1; } - reshape_pending = 1; + erb_set_done_callback(erb, jobdone, 0); + reshape_pending = redisp_pending = 1; glGenTextures(1, &fbtex); glBindTexture(GL_TEXTURE_2D, fbtex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glutMainLoop(); +#ifdef __unix__ + dpy = glXGetCurrentDisplay(); + xfd = ConnectionNumber(dpy); + maxfd = xfd > pfd[0] ? xfd : pfd[0]; + + while(!quit) { + struct timeval tv = {0, 0}; + fd_set rdset; + + FD_ZERO(&rdset); + FD_SET(xfd, &rdset); + FD_SET(pfd[0], &rdset); + + if(select(maxfd + 1, &rdset, 0, 0, redisp_pending ? &tv : 0) == -1) { + if(errno == EINTR) continue; + fprintf(stderr, "select failed: %s\n", strerror(errno)); + break; + } + + redisp_pending = 0; + glutMainLoopEvent(); + + if(FD_ISSET(pfd[0], &rdset)) { + struct erb_rect rect; + read(pfd[0], &rect, sizeof rect); + glTexSubImage2D(GL_TEXTURE_2D, 0, rect.x, rect.y, rect.w, rect.h, + GL_RGBA, GL_FLOAT, erb_getframe(erb) + (rect.y * win_width + rect.x) * 4); + post_redisplay(); + printf("update (%d %d %dx%d)!\n", rect.x, rect.y, rect.w, rect.h); + } + } +#endif /* __unix__ */ + erb_destroy(erb); return 0; } +static void jobdone(unsigned int job, struct erb_rect *rect, void *cls) +{ + printf("jobdone!\n"); + write(pfd[1], rect, sizeof *rect); +} + static void display(void) { if(reshape_pending) { @@ -93,14 +157,11 @@ static void display(void) erb_allocframe(erb, win_width, win_height); erb_begin(erb); + glPixelStorei(GL_UNPACK_ROW_LENGTH, win_width); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, win_width, win_height, 0, GL_RGBA, GL_FLOAT, erb_getframe(erb)); - } else { - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, win_width, win_height, - GL_RGBA, GL_FLOAT, erb_getframe(erb)); } - /* TODO: continue with getting notified when a block is done rendering */ - glClear(GL_COLOR_BUFFER_BIT); @@ -151,15 +212,16 @@ static void reshape(int x, int y) glOrtho(0, x, y, 0, -1, 1); reshape_pending = 1; - glutPostRedisplay(); + post_redisplay(); } static void keyb(unsigned char key, int x, int y) { if(key == 27) { glutExit(); + quit = 1; } - glutPostRedisplay(); + post_redisplay(); } static void mouse(int bn, int st, int x, int y) @@ -175,18 +237,24 @@ static void mouse(int bn, int st, int x, int y) drag_x = x; drag_y = y; } else { - drag = 0; + if(drag) { + drag = 0; - rect[0] = x < drag_x ? x : drag_x; - rect[1] = y < drag_y ? y : drag_y; - rect[2] = abs(x - drag_x); - rect[3] = abs(y - drag_y); + rect[0] = x < drag_x ? x : drag_x; + rect[1] = y < drag_y ? y : drag_y; + rect[2] = abs(x - drag_x); + rect[3] = abs(y - drag_y); - erb_queue_block(erb, rect[0], rect[1], rect[2], rect[3]); - printf("rect: %d,%d %dx%d\n", rect[0], rect[1], rect[2], rect[3]); + erb_queue_block(erb, 0, rect[0], rect[1], rect[2], rect[3]); + printf("rect: %d,%d %dx%d\n", rect[0], rect[1], rect[2], rect[3]); + } } - glutPostRedisplay(); + post_redisplay(); + } + if(bn == 2 && st == GLUT_DOWN) { + drag = 0; + post_redisplay(); } } @@ -195,5 +263,5 @@ static void motion(int x, int y) mouse_x = x; mouse_y = y; - glutPostRedisplay(); + post_redisplay(); }