comparison Renderer/Engine/viewer.cc @ 509:8148c81d2660

Cerium Rendering Library
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 12 Oct 2009 10:17:09 +0900
parents 735f76483bb2
children 97e1b0346597
comparison
equal deleted inserted replaced
508:f6daf964f483 509:8148c81d2660
88 Viewer::swap_buffers(void) 88 Viewer::swap_buffers(void)
89 { 89 {
90 SDL_GL_SwapBuffers(); 90 SDL_GL_SwapBuffers();
91 } 91 }
92 92
93 extern void node_init(TaskManager *manager); 93
94 extern void create_cube_split(TaskManager *manager, int); 94 void
95 extern void panel_init(TaskManager *manager, int bg); 95 Viewer::run_init(TaskManager *manager, Application *app)
96 extern void universe_init(TaskManager *manager);
97 extern void ieshoot_init(TaskManager *manager);
98 extern void ball_bound_init(TaskManager *manager, int, int);
99 extern void lcube_init(TaskManager *manager, int, int);
100 extern void direction_init(TaskManager *manager);
101 extern void init_position(TaskManager *manager, int, int);
102 extern void vacuum_init(TaskManager *manager, int w, int h);
103 extern void untitled_init(TaskManager *manager);
104 extern void chain_init(TaskManager *manager, int w, int h);
105 extern void chain_old_init(TaskManager *manager, int w, int h);
106 extern void boss1_init(TaskManager *manager, int w, int h);
107 extern void init_gaplant(TaskManager *manager, int w, int h);
108 extern void vacuum_init2(TaskManager *manager, int w, int h);
109
110 void
111 Viewer::run_init(TaskManager *manager, const char *xml, int sg_number)
112 { 96 {
113 this->manager = manager; 97 this->manager = manager;
114 98
115 start_time = get_ticks(); 99 start_time = get_ticks();
116 this_time = 0; 100 this_time = 0;
117 frames = 0; 101 frames = 0;
118 102
119 sgroot = new SceneGraphRoot(this->width, this->height); 103 sgroot = new SceneGraphRoot(this->width, this->height);
120 // sgroot_2 = new SceneGraphRoot(this->width, this->height); 104
121 //sgroot->createFromXMLFile(xml); 105 app->init(manager, this->width, this->height);
122 // ここの switch は application->init(this, manager, sg_no); になるべき
123 switch (sg_number) {
124 case 0:
125 case 1:
126 create_cube_split(manager, sg_number);
127 break;
128 case 2:
129 case 3:
130 case 4:
131 panel_init(manager, sg_number);
132 break;
133 case 5:
134 universe_init(manager);
135 break;
136 case 6:
137 ieshoot_init(manager);
138 break;
139 case 7:
140 ball_bound_init(manager, this->width, this->height);
141 break;
142 case 8:
143 lcube_init(manager, this->width, this->height);
144 break;
145 case 9:
146 direction_init(manager);
147 break;
148 case 10:
149 init_position(manager, this->width, this->height);
150 break;
151 case 11:
152 // vacuum_init(manager, this->width, this->height);
153 break;
154 case 12:
155 untitled_init(manager);
156 break;
157 case 13:
158 boss1_init(manager, this->width, this->height);
159 break;
160 case 14:
161 init_gaplant(manager, this->width, this->height);
162 break;
163 case 15:
164 vacuum_init2(manager, this->width, this->height);
165 break;
166 case 16:
167 app = new Chain();
168 app->init(manager, this->width, this->height);
169 speLoop();
170 return;
171 break;
172 case 17:
173 chain_old_init(manager, this->width, this->height);
174 break;
175 default:
176 node_init(manager);
177 break;
178 }
179 106
180 mainLoop(); 107 mainLoop();
181 } 108 }
182 109
183 110
396 } 323 }
397 324
398 void 325 void
399 Viewer::rendering(HTaskPtr task_next) 326 Viewer::rendering(HTaskPtr task_next)
400 { 327 {
401 #if 0 328 common_rendering(task_next);
329
330 // Barrier 同期
331 // run_draw() を呼ぶ post2runDraw
332 task_next->set_post(post2runDraw, (void*)this); // set_post(function(this->run_draw()), NULL)
333 task_next->spawn();
334
335 // TASK_CREATE_SPAN が全て終わったら DUMMY_TASK が Viewer::run_draw() を呼ぶ
336 }
337
338 static void
339 post2runLoop(void *viewer_)
340 {
341 Viewer *viewer = (Viewer*)viewer_;
342 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
343 viewer->run_loop(task_next);
344
345 }
346
347 void
348 Viewer::run_loop(HTaskPtr task_next)
349 {
350 bool quit_flg;
351 quit_flg = quit_check();
352 if (quit_flg == true) {
353 this_time = get_ticks();
354 run_finish();
355 return;
356 }
357
358 clean_pixels();
359
360 for (int i = 1; i <= spackList_length; i++) {
361 spackList[i-1].reinit(i*split_screen_h);
362 }
363
364 //run_move(task_next);
365 sgroot->updateControllerState();
366 sgroot->allExecute(width, height);
367 //sgroot->checkRemove();
368
369 // ここから下は Rendering という関数にする
370 rendering(task_next);
371 }
372
373 static void
374 post2runDraw(void *viewer_)
375 {
376 Viewer *viewer = (Viewer*)viewer_;
377 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
378 viewer->run_draw(task_next);
379
380 }
381
382 void
383 Viewer::run_draw(HTaskPtr task_next) // 引数に post2runLoop を入れるようにする
384 {
385 common_draw(task_next);
386
387 task_next->set_post(post2runLoop, (void*)this); // set_post(function(this->run_loop()), NULL)
388 task_next->spawn();
389 // TASK_DRAW_SPAN が全て終わったら DUMMY_TASK が Viewer::run_loop() を呼ぶ
390
391 frames++;
392 }
393
394 void
395 Viewer::run_finish(void)
396 {
397 if (this_time != start_time) {
398 printf("%f FPS\n", (((float)frames)/(this_time-start_time))*1000.0);
399 }
400
401 delete sgroot;
402 // delete sgroot_2;
403 quit();
404 }
405
406 static void
407 post2speRendering(void *viewer_)
408 {
409 Viewer *viewer = (Viewer*)viewer_;
410 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
411 viewer->spe_rendering(task_next);
412 }
413
414 void
415 Viewer::spe_rendering(HTaskPtr task_next)
416 {
417 common_rendering(task_next);
418
419 this->draw_dummy->wait_for(task_next);
420 task_next->set_post(post2speDraw, (void*)this);
421 task_next->spawn();
422
423 }
424
425 static void
426 post2speDraw(void *viewer_)
427 {
428 Viewer *viewer = (Viewer*)viewer_;
429 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
430 viewer->spe_draw(task_next);
431 }
432
433 void
434 Viewer::spe_draw(HTaskPtr task_next)
435 {
436 common_draw(task_next);
437
438 this->draw_dummy->wait_for(task_next);
439 task_next->spawn();
440 this->draw_dummy->spawn();
441
442 frames++;
443 }
444
445 void
446 Viewer::common_rendering(HTaskPtr task_next)
447 {
402 HTaskPtr task_create_pp = manager->create_task(TASK_CREATE_PP2); 448 HTaskPtr task_create_pp = manager->create_task(TASK_CREATE_PP2);
403 449
404 // SceneGraph(木構造) -> PolygonPack 450 // SceneGraph(木構造) -> PolygonPack
405 451
406 task_create_pp->add_param((uint32)sgroot->getDrawSceneGraph()); 452 task_create_pp->add_param((uint32)sgroot->getDrawSceneGraph());
422 task_create_sp->add_inData(spackList_ptr, 468 task_create_sp->add_inData(spackList_ptr,
423 sizeof(SpanPack*)*spackList_length_align); 469 sizeof(SpanPack*)*spackList_length_align);
424 task_create_sp->add_inData(&spackList[index_start], sizeof(SpanPack)); 470 task_create_sp->add_inData(&spackList[index_start], sizeof(SpanPack));
425 471
426 task_create_sp->add_param(index_start); 472 task_create_sp->add_param(index_start);
427 473
428 /** 474 /**
429 * ex. screen_height が 480, spenum が 6 の場合、各SPEのy担当範囲 475 * ex. screen_height が 480, spenum が 6 の場合、各SPEのy担当範囲
430 * [ 1.. 80] [ 81..160] [161..240] 476 * [ 1.. 80] [ 81..160] [161..240]
431 * [241..320] [321..400] [401..480] 477 * [241..320] [321..400] [401..480]
432 * 478 *
443 task_create_sp->set_cpu(SPE_ANY); 489 task_create_sp->set_cpu(SPE_ANY);
444 task_create_sp->spawn(); 490 task_create_sp->spawn();
445 } 491 }
446 492
447 task_create_pp->spawn(); 493 task_create_pp->spawn();
448 #else 494 }
449 common_rendering(task_next); 495
450 #endif 496 void
451 497 Viewer::common_draw(HTaskPtr task_next)
452 // Barrier 同期 498 {
453 // run_draw() を呼ぶ post2runDraw
454 task_next->set_post(post2runDraw, (void*)this); // set_post(function(this->run_draw()), NULL)
455 task_next->spawn();
456
457 // TASK_CREATE_SPAN が全て終わったら DUMMY_TASK が Viewer::run_draw() を呼ぶ
458 }
459
460 static void
461 post2runLoop(void *viewer_)
462 {
463 Viewer *viewer = (Viewer*)viewer_;
464 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
465 viewer->run_loop(task_next);
466
467 }
468
469 void
470 Viewer::run_loop(HTaskPtr task_next)
471 {
472 bool quit_flg;
473 quit_flg = quit_check();
474 if (quit_flg == true) {
475 this_time = get_ticks();
476 run_finish();
477 return;
478 }
479
480 clean_pixels();
481
482 for (int i = 1; i <= spackList_length; i++) {
483 spackList[i-1].reinit(i*split_screen_h);
484 }
485
486 //run_move(task_next);
487 sgroot->updateControllerState();
488 sgroot->allExecute(width, height);
489 //sgroot->checkRemove();
490
491 // ここから下は Rendering という関数にする
492 rendering(task_next);
493 }
494
495 static void
496 post2runDraw(void *viewer_)
497 {
498 Viewer *viewer = (Viewer*)viewer_;
499 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
500 viewer->run_draw(task_next);
501
502 }
503
504 void
505 Viewer::run_draw(HTaskPtr task_next) // 引数に post2runLoop を入れるようにする
506 {
507 #if 0
508 HTaskPtr task_draw; 499 HTaskPtr task_draw;
509 500
510 //task_next = manager->create_task(TASK_DUMMY); 501 //task_next = manager->create_task(TASK_DUMMY);
511 //task_next->set_post(post2runLoop, (void*)this); 502 //task_next->set_post(post2runLoop, (void*)this);
512 503
551 542
552 if (endx > this->width) { 543 if (endx > this->width) {
553 endx = this->width; 544 endx = this->width;
554 } 545 }
555 } 546 }
556 }
557 #else
558 common_draw(task_next);
559 #endif
560
561 task_next->set_post(post2runLoop, (void*)this); // set_post(function(this->run_loop()), NULL)
562 task_next->spawn();
563 // TASK_DRAW_SPAN が全て終わったら DUMMY_TASK が Viewer::run_loop() を呼ぶ
564
565 frames++;
566 }
567
568 void
569 Viewer::run_finish(void)
570 {
571 if (this_time != start_time) {
572 printf("%f FPS\n", (((float)frames)/(this_time-start_time))*1000.0);
573 }
574
575 delete sgroot;
576 // delete sgroot_2;
577 quit();
578 }
579
580 static void
581 post2speRendering(void *viewer_)
582 {
583 Viewer *viewer = (Viewer*)viewer_;
584 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
585 viewer->spe_rendering(task_next);
586 }
587
588 void
589 Viewer::spe_rendering(HTaskPtr task_next)
590 {
591 common_rendering(task_next);
592
593 this->draw_dummy->wait_for(task_next);
594 task_next->set_post(post2speDraw, (void*)this);
595 task_next->spawn();
596
597 }
598
599 static void
600 post2speDraw(void *viewer_)
601 {
602 Viewer *viewer = (Viewer*)viewer_;
603 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY);
604 viewer->spe_draw(task_next);
605 }
606
607 void
608 Viewer::spe_draw(HTaskPtr task_next)
609 {
610 common_draw(task_next);
611
612 this->draw_dummy->wait_for(task_next);
613 task_next->spawn();
614 this->draw_dummy->spawn();
615
616 frames++;
617 }
618
619 void
620 Viewer::common_rendering(HTaskPtr task_next)
621 {
622 HTaskPtr task_create_pp = manager->create_task(TASK_CREATE_PP2);
623
624 // SceneGraph(木構造) -> PolygonPack
625
626 task_create_pp->add_param((uint32)sgroot->getDrawSceneGraph());
627 task_create_pp->add_param((uint32)ppack);
628
629 task_next->wait_for(task_create_pp);
630
631 int range_base = spe_num;
632 // 切り上げのつもり
633 int range = (spackList_length + range_base - 1) / range_base;
634
635 for (int i = 0; i < range_base; i++) {
636 int index_start = range*i;
637 int index_end = (index_start + range >= spackList_length)
638 ? spackList_length : index_start + range;
639
640 HTaskPtr task_create_sp = manager->create_task(TASK_CREATE_SPAN);
641 task_create_sp->add_inData(ppack, sizeof(PolygonPack));
642 task_create_sp->add_inData(spackList_ptr,
643 sizeof(SpanPack*)*spackList_length_align);
644 task_create_sp->add_inData(&spackList[index_start], sizeof(SpanPack));
645
646 task_create_sp->add_param(index_start);
647
648 /**
649 * ex. screen_height が 480, spenum が 6 の場合、各SPEのy担当範囲
650 * [ 1.. 80] [ 81..160] [161..240]
651 * [241..320] [321..400] [401..480]
652 *
653 * ex. screen_height が 1080, spenum が 5 の場合、
654 * [ 1..216] [217..432] [433..648]
655 * [649..864] [865..1080]
656 */
657 task_create_sp->add_param(index_start*split_screen_h + 1);
658 task_create_sp->add_param(index_end*split_screen_h);
659
660 task_next->wait_for(task_create_sp);
661 task_create_sp->wait_for(task_create_pp);
662
663 task_create_sp->set_cpu(SPE_ANY);
664 task_create_sp->spawn();
665 }
666
667 task_create_pp->spawn();
668 }
669
670 void
671 Viewer::common_draw(HTaskPtr task_next)
672 {
673 HTaskPtr task_draw;
674
675 //task_next = manager->create_task(TASK_DUMMY);
676 //task_next->set_post(post2runLoop, (void*)this);
677
678 ppack->clear();
679 for (int i = 0; i < spackList_length; i++) {
680 SpanPack *spack = &spackList[i];
681 int startx = 1;
682 int endx = split_screen_w;
683
684 int starty = spack->info.y_top - split_screen_h + 1;
685 //int endy = spack->info.y_top;
686 int rangey = (starty + split_screen_h - 1 > this->height)
687 ? this->height - starty + 1 : split_screen_h;
688
689 while (startx < this->width) {
690 if (spack->info.size > 0) {
691 // Draw SpanPack
692 task_draw = manager->create_task(TASK_DRAW_SPAN);
693 task_draw->add_inData(spack, sizeof(SpanPack));
694
695 task_draw->add_param(
696 (uint32)&pixels[(startx-1) + this->width*(starty-1)]);
697 task_draw->add_param(this->width);
698 } else {
699 // 7.7.3 SL1 Data Cache Range Set to Zero コマンド
700 // を使って、DMAでclearするべき... ということは、
701 // それもSPEでやる方が良い?
702 memset(&pixels[(startx-1)+this->width*(starty-1)],
703 0, (this->width)*sizeof(int)*rangey);
704 break;
705 }
706
707 task_draw->add_param(startx);
708 task_draw->add_param(endx);
709 task_draw->add_param(rangey);
710 task_draw->set_cpu(SPE_ANY);
711 task_next->wait_for(task_draw);
712 task_draw->spawn();
713
714 startx += split_screen_w;
715 endx += split_screen_w;
716
717 if (endx > this->width) {
718 endx = this->width;
719 }
720 }
721 } 547 }
722 } 548 }
723 549
724 /* end */ 550 /* end */