/* * The argv argument will be populated with the address that the PPE provided, * from the 4th argument to spe_context_run() */ int main(uint64_t speid, uint64_t argv, uint64_t envp) { struct spe_args args __attribute__((aligned(SPE_ALIGN))); mfc_get(&args, argv, sizeof(args), 0, 0, 0); mfc_write_tag_mask(1 << 0); mfc_read_tag_status_all(); cmap_calls = 0; dma_puts = 0; spu_write_decrementer(-1); // Run multiple renders with offsets. Should be factored into render_fractal() render_fractal(&args.fractal, args.thread_idx, args.n_threads, 0.); render_fractal(&args.fractal, args.thread_idx, args.n_threads, args.fractal.delta * 7 / 8); render_fractal(&args.fractal, args.thread_idx, args.n_threads, args.fractal.delta * 3 / 4); render_fractal(&args.fractal, args.thread_idx, args.n_threads, args.fractal.delta * 5 / 8); render_fractal(&args.fractal, args.thread_idx, args.n_threads, args.fractal.delta / 2); render_fractal(&args.fractal, args.thread_idx, args.n_threads, args.fractal.delta * 3 / 8); render_fractal(&args.fractal, args.thread_idx, args.n_threads, args.fractal.delta / 4); render_fractal(&args.fractal, args.thread_idx, args.n_threads, args.fractal.delta / 8); // Send remaining points if(fill%2048) { // select the last buffer used int f = fill / 2048; mfc_put(&points[f*2048], (uint)args.fractal.pointbuf[f], 16384, 0, 0, 0); // Block for completion mfc_write_tag_mask(1<<0); mfc_read_tag_status_all(); // Send a message with top bit set to indicate final item spu_write_out_intr_mbox((1<<31)|f); // Send another message indicating count spu_write_out_intr_mbox(fill%2048); ++dma_puts; } // Report some stats uint ticks = -1 - spu_read_decrementer(); printf("cmap calls %d ticks %u calls/tick %f\n", cmap_calls, ticks, (double)cmap_calls/ticks ); printf("dma puts %d\n", dma_puts); return 0; }
int main(int argc, const char* argv[]) { // Get fractal renderer double (*renderer) (complex double, const char *[], int) = &in_mandlebrot; const char** frargv = &argv[1]; int frargc = argc - 1; if(frargc > 0) { frargc --; for(unsigned int i = 0; i < sizeof(fractals) / sizeof(struct Fractal); i++) { if(strcmp(fractals[i].name, frargv[0]) == 0) { renderer = fractals[i].renderer; frargv++; if(frargc < fractals[i].args) { fprintf(stderr, "'%s' takes %d argument%s.\n", fractals[i].name, fractals[i].args, (fractals[i].args == 1) ? "" : "s"); return 1; } } } } MEVENT event; WINDOW * mainwin = initscr(); start_color(); cbreak(); noecho(); nonl(); intrflush(stdscr, false); keypad(stdscr, true); curs_set(0); mousemask(ALL_MOUSE_EVENTS, NULL); // Initialise colours render_init(mainwin); bool looping = true; while(looping) { // Render the fractal render_fractal(renderer, frargv, frargc); // Get input int ch = getch(); switch(ch) { case KEY_UP: scrollpixels(1, 0); break; case KEY_DOWN: scrollpixels(-1, 0); break; case KEY_LEFT: scrollpixels(0, 1); break; case KEY_RIGHT: scrollpixels(0, -1); break; case '+': zoom_in(); break; case '-': zoom_out(); break; case 'h': toggle_hide(); break; case 'b': toggle_bright(); break; case KEY_MOUSE: if(getmouse(&event) == OK) { if(event.bstate & BUTTON1_CLICKED) { centre(pixel_topleft(event.y, event.x)); } } break; case 'r': reset(); break; case 'q': looping = false; break; default: break; } } curs_set(1); nl(); echo(); nocbreak(); delwin(mainwin); endwin(); }
void render_frame(GLboolean debug_maxsrc, GLboolean debug_pal, GLboolean show_mandel, GLboolean show_fps_hist) { static int cnt = 0; static uint32_t maxfrms = 0; static uint32_t last_beat_time = 0, lastpalstep = 0, fps_oldtime = 0; static int beats = 0; static uint64_t now = 0, workstart = 0; //TODO: move this up to top workstart = now = uget_ticks(); int delay = (tick0 + cnt*INT64_C(1000000)/opts->draw_rate) - now; if(delay > 0) { udodelay(delay); workstart = now = uget_ticks(); } // rate limit our maxsrc updates, but run at full frame rate if we're close the opts.maxsrc_rate to avoid choppyness if((tick0-now)*opts->maxsrc_rate + (maxfrms*INT64_C(1000000)) > INT64_C(1000000) ) { // || (totframetime + 10*FPS_HIST_LEN > FPS_HIST_LEN*1000/opts->maxsrc_rate ) ) { audio_data ad; audio_get_samples(&ad); maxsrc_update(glmaxsrc, ad.data, ad.len); audio_finish_samples(); maxfrms++; } render_fractal(glfract, pd, maxsrc_get_tex(glmaxsrc)); if(!debug_pal || !debug_maxsrc || !show_mandel) { gl_pal_render(glpal, fract_get_tex(glfract)); } else { glPushAttrib(GL_VIEWPORT_BIT); setup_viewport(scr_w/2, scr_h/2); gl_pal_render(glpal, fract_get_tex(glfract)); glPopAttrib(); } if(show_mandel) render_mandel(pd); //TODO: enable click to change c //TODO: figure out what attrib to push to save color if(debug_pal || debug_maxsrc) { glPushAttrib(GL_TEXTURE_BIT); if(packed_intesity_pixels) glColor3f(1.0f, 1.0f, 1.0f); } if(debug_pal) { glBindTexture(GL_TEXTURE_2D, fract_get_tex(glfract)); draw_tex_quad(0.5f, 0.5f, -0.5f); } if(debug_maxsrc) { glBindTexture(GL_TEXTURE_2D, maxsrc_get_tex(glmaxsrc)); draw_tex_quad(0.5f, -0.5f, 0.5f); } if(debug_pal || debug_maxsrc) { glPopAttrib(); if(packed_intesity_pixels) glColor3f(1.0f, 1.0f, 1.0f); } if(show_fps_hist) { DEBUG_CHECK_GL_ERR; glPushMatrix(); glScalef(0.5f, 0.25f, 1); glTranslatef(-2, 3, 0); draw_hist_array(cnt, FPS_HIST_LEN/(8.0f*totframetime), frametimes, FPS_HIST_LEN); glPopMatrix(); glPushMatrix(); glScalef(0.5f, 0.25f, 1); glTranslatef(1, 3, 0); draw_hist_array(cnt, FPS_HIST_LEN/(8.0f*totworktime), worktimes, FPS_HIST_LEN); glPopMatrix(); glColor3f(1.0f, 1.0f, 1.0f); char buf[128]; glRasterPos2f(-1,1 - 20.0f/(scr_h*0.5f)); sprintf(buf,"%6.1f FPS %6.1f", FPS_HIST_LEN*1000000.0f/totframetime, maxfrms*1000000.0f/(now-tick0)); draw_string(buf); DEBUG_CHECK_GL_ERR; glRasterPos2f(-1,0.75f-20.0f/(scr_h*0.5f)); sprintf(buf,"%7.1fns frametime\n%7.1fns worktime\n", totframetime/((float)FPS_HIST_LEN), totworktime/((float)FPS_HIST_LEN)); draw_string(buf); DEBUG_CHECK_GL_ERR; } else { glRasterPos2f(-1,0.75f-20.0f/(scr_h*0.5f)); } render_debug_overlay(); swap_buffers(); CHECK_GL_ERR; now = uget_ticks(); if(now - lastpalstep >= 1000*2048/256 && gl_pal_changing(glpal)) { // want pallet switch to take ~2 seconds if(gl_pal_step(glpal, IMIN((now - lastpalstep)*256/(2048*1000), 32))) lastpalstep = now; } int newbeat = beat_get_count(); if(newbeat != beats) { gl_pal_start_switch(glpal, newbeat); } if(newbeat != beats && now - last_beat_time > 1000000) { last_beat_time = now; update_points(pd, (now - tick0)/1000, 1); } else update_points(pd, (now - tick0)/1000, 0); beats = newbeat; now = uget_ticks(); totframetime -= frametimes[cnt%FPS_HIST_LEN]; totframetime += (frametimes[cnt%FPS_HIST_LEN] = now - fps_oldtime); fps_oldtime = now; totworktime -= worktimes[cnt%FPS_HIST_LEN]; totworktime += (worktimes[cnt%FPS_HIST_LEN] = now - workstart); cnt++; }