Exemple #1
0
/*
 * 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;
}
Exemple #2
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();
}
Exemple #3
0
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++;
}