[1] | 1 | /* |
---|
| 2 | * Demonstration program for SOCLIB FB graphics on ALMOS. |
---|
| 3 | */ |
---|
| 4 | #include <stdlib.h> |
---|
| 5 | #include <stdio.h> |
---|
| 6 | #include <sys/mman.h> |
---|
| 7 | #include <GL/gl.h> |
---|
| 8 | #include <GL/oscontext.h> |
---|
| 9 | #include "ui.h" |
---|
| 10 | |
---|
| 11 | void tkSwapBuffers(void) |
---|
| 12 | { |
---|
| 13 | nglXSwapBuffers(w1); |
---|
| 14 | } |
---|
| 15 | |
---|
| 16 | static ostgl_context *ctx; |
---|
| 17 | |
---|
| 18 | int ui_loop(int argc, char **argv, const char *name) |
---|
| 19 | { |
---|
| 20 | void *dsiplay; |
---|
| 21 | size_t xsize; |
---|
| 22 | size_t ysize; |
---|
| 23 | size_t mode; |
---|
| 24 | size_t pgsize; |
---|
| 25 | size_t size; |
---|
| 26 | clock_t tm_tmp; |
---|
| 27 | clock_t tm_now; |
---|
| 28 | int fd; |
---|
| 29 | |
---|
| 30 | pgsize = sysconf(_SC_PAGE_SIZE); |
---|
| 31 | |
---|
| 32 | if(pgsize < 0) |
---|
| 33 | { |
---|
| 34 | fprintf(stderr, "ERROR: sysconf pgsize got %u\n", pgsize); |
---|
| 35 | exit(1); |
---|
| 36 | } |
---|
| 37 | |
---|
| 38 | int fd = open("/ETC/FBRC", O_RDONLY, 420); |
---|
| 39 | |
---|
| 40 | if(fd < 0) |
---|
| 41 | { |
---|
| 42 | fprintf(stderr, "ERROR: cannot read /etc/fbrc configuration file\n"); |
---|
| 43 | exit(2); |
---|
| 44 | } |
---|
| 45 | |
---|
| 46 | xsize = 0; |
---|
| 47 | ysize = 0; |
---|
| 48 | |
---|
| 49 | fscanf(fd, "XSIZE=%u\n", &xsize); |
---|
| 50 | fscanf(fd, "YSIZE=%u\n", &ysize); |
---|
| 51 | fscanf(fd, "MODE=%u\n", &mode); |
---|
| 52 | |
---|
| 53 | close(fd); |
---|
| 54 | |
---|
| 55 | if((xsize == 0) || (ysize == 0) || (mode != 16)) |
---|
| 56 | { |
---|
| 57 | fprintf(stderr, "ERROR: dont like these info: xsize %d, ysize %d, mode %d\n", |
---|
| 58 | xsize, |
---|
| 59 | ysize, |
---|
| 60 | mode); |
---|
| 61 | |
---|
| 62 | exit(3); |
---|
| 63 | } |
---|
| 64 | |
---|
| 65 | size = xsize * ysize * 2; |
---|
| 66 | |
---|
| 67 | size = (size & (pgsize - 1)) ? (size & ~(pgsize - 1)) + pgsize : pgsize; |
---|
| 68 | |
---|
| 69 | if((fd = open("/DEV/FB0",O_WRONLY,420)) == -1) |
---|
| 70 | { |
---|
| 71 | fprintf(stderr, "ERROR: cannot open /dev/fb0\n"); |
---|
| 72 | exit(4); |
---|
| 73 | } |
---|
| 74 | |
---|
| 75 | display = mmap(NULL, |
---|
| 76 | size, |
---|
| 77 | PROT_WRITE | PROT_READ, |
---|
| 78 | MAP_SHARED | MAP_FILE, |
---|
| 79 | fd, 0); |
---|
| 80 | |
---|
| 81 | close(fd); |
---|
| 82 | |
---|
| 83 | if(display == MAP_FAILED) |
---|
| 84 | { |
---|
| 85 | perror("mmap dest file"); |
---|
| 86 | exit(5); |
---|
| 87 | } |
---|
| 88 | |
---|
| 89 | ctx = ostgl_create_context(xsize, ysize, 16, &display, 1); |
---|
| 90 | |
---|
| 91 | if(ctx == NULL) |
---|
| 92 | { |
---|
| 93 | fprintf(stderr, "ERROR: failed to create ostgl ctx\n"); |
---|
| 94 | exit(6); |
---|
| 95 | } |
---|
| 96 | |
---|
| 97 | if(ostgl_make_current(ctx,0) != 0) |
---|
| 98 | { |
---|
| 99 | fprintf(stderr, "ERROR: failed to make current ctx\n"); |
---|
| 100 | exit(7); |
---|
| 101 | } |
---|
| 102 | |
---|
| 103 | fprintf(stderr, "Initializing scene .."); |
---|
| 104 | tm_tmp = clock(); |
---|
| 105 | init(); |
---|
| 106 | tm_now = clock(); |
---|
| 107 | fprintf(stderr, " done [%llu]\n", tm_now - tm_tmp); |
---|
| 108 | |
---|
| 109 | fprintf(stderr, "Shape scene .."); |
---|
| 110 | tm_tmp = clock(); |
---|
| 111 | reshape(xsize,ysize); |
---|
| 112 | tm_now = clock(); |
---|
| 113 | fprintf(stderr, " done [%llu]\n", tm_now - tm_tmp); |
---|
| 114 | |
---|
| 115 | while (1) |
---|
| 116 | { |
---|
| 117 | idle(); |
---|
| 118 | fprintf(stderr, "Time now %llu\n", clock()); |
---|
| 119 | } |
---|
| 120 | |
---|
| 121 | return 0; |
---|
| 122 | } |
---|