From: Chris Atenasio (root@lilo.dyn.ml.org)
Date: Tue 29 Sep 1998 - 22:42:39 IST
On Tue, 29 Sep 1998, Ryan Drake wrote: > Anyone have any experience getting SVGAlib to work with libpthreads? > pthread_create() throws my prog back into text mode... > Yes! I had the exact same problem at one point. Only problem is I dont remember how I fixed it... :)(maybe that I moved the pthread_create()s to before vga_init()... *shrug*) You can see my (functioning) program though(attached)... Its a cute little mandelbrot zoomer. Have fun! - Chris -------------------------------------------------------------------------------- Chris Atenasio (chrisa@ultranet.com) -- Friends don't let friends use Windows. Send me mail with subject "send pgp key" or "word of the day" for auto-response. Running on a debian hamm system(glibc + svgalib1.2.13) Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.2.3/specs gcc version 2.7.2.3 <the makefile> mandel: mandel.c Makefile gcc -g -Wall mandel.c -o mandel -lvga -lpthread opt: mandel.c Makefile pgcc -g -Wall mandel.c -o mandel -lvga -O6 -march=pentiumpro -ffast-math -funroll-all-loops -lpthread <asm.h> static inline void outb(int port, int value) { __asm__ volatile ("outb %0,%1" ::"a" ((unsigned char) value), "d"((unsigned short) port)); } static inline int inb(int port) { unsigned char value; __asm__ volatile ("inb %1,%0" :"=a" (value) :"d"((unsigned short) port)); return value; } <mandel.c> #define _REENTRANT #include <stdlib.h> #include <pthread.h> #include <vga.h> #include "asm.h" int iterations; unsigned char *vidmem; double xmin=-1.5, ymin=-1.1; double xmax=.7, ymax=1.1; volatile int global_sync=0; unsigned char mandel(double a, double b) { int i=iterations; double ta, na=0, nb=0, sa, sb; while(i--) { na += a; nb += b; if((sa=na*na) + (sb=nb*nb) > 4) return 255-i; ta = na; na = sa - sb; nb = ta*nb; nb += nb; } return 0; } void *calculate(void *off) { int x,y, ys; double xadd, yadd, xval, yval, ystart, yend; int local_sync=0; while(1) { if(local_sync != global_sync) { if((int)off) { ys = 100; ystart = (ymax - ymin) / 2.0 + ymin; yend = ymax; } else { ys=0; ystart = ymin; yend = (ymax - ymin) / 2.0 + ymin; } yval = ystart; xadd = (xmax-xmin) / 320.0; yadd = (yend-ystart) / 100.0; for(y=ys;y<ys+100;y++) { xval = xmin; for(x=0;x<320;x++) { vidmem[(y<<6)+(y<<8)+x]=mandel(xval,yval); xval += xadd; } yval += yadd; } local_sync++; } } } void set_pal() { int i; float r,g,b; outb(0x3c8,1); r = 63; g = 0; b = 0; for(i=0;i<42;i++) { g += 63.0 / 42.0; outb(0x3c9,(int)r); outb(0x3c9,(int)g); outb(0x3c9,(int)b); } for(i=0;i<42;i++) { r -= 63.0 / 42.0; outb(0x3c9,(int)r); outb(0x3c9,(int)g); outb(0x3c9,(int)b); } for(i=0;i<42;i++) { b += 63.0 / 42.0; outb(0x3c9,(int)r); outb(0x3c9,(int)g); outb(0x3c9,(int)b); } for(i=0;i<42;i++) { g -= 63.0 / 42.0; outb(0x3c9,(int)r); outb(0x3c9,(int)g); outb(0x3c9,(int)b); } for(i=0;i<42;i++) { r += 63.0 / 42.0; outb(0x3c9,(int)r); outb(0x3c9,(int)g); outb(0x3c9,(int)b); } for(i=0;i<42;i++) { b -= 63.0 / 42.0; outb(0x3c9,(int)r); outb(0x3c9,(int)g); outb(0x3c9,(int)b); } } int main(int argc, char **argv) { pthread_t t1, t2; if(argc>1) iterations = atoi(argv[1]); else iterations = 256; pthread_create(&t1, NULL, calculate, 0); pthread_create(&t2, NULL, calculate, 1); vga_init(); vga_setmode(G320x200x256); set_pal(); vidmem = vga_getgraphmem(); global_sync++; while(1) { char k; switch(k = getchar()) { double change; case '8': change = (ymax - ymin) / 10; ymin -= change; ymax -= change; break; case '2': change = (ymax - ymin) / 10; ymin += change; ymax += change; break; case '4': change = (xmax - xmin) / 10; xmin -= change; xmax -= change; break; case '6': change = (xmax - xmin) / 10; xmin += change; xmax += change; break; case '5': change = (xmax - xmin) / 10; xmin += change; xmax -= change; change = (ymax - ymin) / 10; ymin += change; ymax -= change; break; case ' ': change = (xmax - xmin) / 10; xmin -= change; xmax += change; change = (ymax - ymin) / 10; ymin -= change; ymax += change; break; case '+': iterations++; break; case '-': iterations--; break; case 'q': case 'Q': vga_setmode(TEXT); pthread_kill(t1,9); pthread_kill(t2,9); exit(1); } global_sync++; } return 0; }
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:22 IST