comparison Renderer/Engine/viewer.cc @ 1020:360f8eba78f1

create_pp_task fix. not done.
author tkaito
date Sun, 07 Nov 2010 04:24:24 +0900
parents 736a833db108
children 55f3c5976959
comparison
equal deleted inserted replaced
1019:f20ca98d47c6 1020:360f8eba78f1
627 627
628 } 628 }
629 629
630 /* flag_drawable な Scenegraph の総数を求める */ 630 /* flag_drawable な Scenegraph の総数を求める */
631 int 631 int
632 sg_drawable_num(SceneGraphPtr sg) 632 sg_drawable_num(SceneGraphPtr scenegraph)
633 { 633 {
634 SceneGraphPtr sg = scenegraph;
635
634 int sg_count = 0; 636 int sg_count = 0;
635 while (sg) { 637 while (sg) {
636 if (sg->flag_drawable) { 638 if (sg->flag_drawable) {
637 sg_count++; 639 sg_count++;
638 } 640 }
668 * PolygonPack の TrianglePack (空) を送る。pp->info.size の計算もここで。 670 * PolygonPack の TrianglePack (空) を送る。pp->info.size の計算もここで。
669 * 671 *
670 */ 672 */
671 //int spe_num = 6; 673 //int spe_num = 6;
672 674
675 PolygonPackPtr pp = (PolygonPackPtr)manager->allocate(sizeof(PolygonPack));
676
677 int sg_num = sg_drawable_num(sg);
678 int sg_division = sg_num / spe_num;
679 int residue = sg_num % spe_num;
680
673 HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); 681 HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num);
674 Task **pp = (Task**)manager->allocate(sizeof(Task*)*spe_num); 682 Task **pptask = (Task**)manager->allocate(sizeof(Task*)*spe_num);
675 683
676 int sg_num = sg_drawable_num(sg); 684 for (int k = 0; k < spe_num-1; k++) {
677 685 task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_division,4,6,1);
678 for (int k = 0; k < spe_num; k++) { 686 pptask[k] = 0;
679 task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_num,4,6,1);
680 pp[k] = 0;
681 } 687 }
688
689 task_array[spe_num] = manager->create_task_array(CreatePolygonFromSceneGraph,
690 sg_division+residue,4,6,1);
691 pptask[spe_num] = 0;
692
693 int count= 0;
694 int k = 0;
682 695
683 while (sg) { 696 while (sg) {
684 if (sg->flag_drawable) { 697 if (sg->flag_drawable) {
698 if(count < spe_num * sg_division) {
699 k %= spe_num-1;
700 } else {
701 k = spe_num;
702 }
703 pptask[k] = task_array[k]->next_task_array(CreatePolygonFromSceneGraph,pptask[k]);
704 pptask[k]->set_inData(0, &sg->coord_xyz, sizeof(float)*sg->size/3);
705 pptask[k]->set_inData(1, &sg->coord_tex, sizeof(float)*sg->size/3);
706 pptask[k]->set_inData(2, &sg->normal , sizeof(float)*sg->size/3);
707 pptask[k]->set_inData(3, &sg->matrix , sizeof(float)*12);
708 pptask[k]->set_inData(4, &sg->real_matrix, sizeof(float)*8);
709 pptask[k]->set_inData(5, &sg->texture_info.pixels, sizeof(uint32));
685 710
711 pptask[k]->set_param(0,(memaddr)sg->size);
712 pptask[k]->set_param(1,(memaddr)sg->texture_info.t_w);
713 pptask[k]->set_param(2,(memaddr)sg->texture_info.t_h);
714 pptask[k]->set_param(3,(memaddr)sg->texture_info.scale_max);
715
716 pptask[k]->set_outData(0, &pp->tri[pp->info.size++], sizeof(TrianglePack));
686 } 717 }
687 if (sg->children != NULL) { 718 if (sg->children != NULL) {
688 sg = sg->children; 719 sg = sg->children;
689 } else if (sg->brother != NULL) { 720 } else if (sg->brother != NULL) {
690 sg = sg->brother; 721 sg = sg->brother;
700 } else { 731 } else {
701 sg = sg->parent; 732 sg = sg->parent;
702 } 733 }
703 } 734 }
704 } 735 }
705 } 736 }
737 count++;
706 } 738 }
707 739
708 //MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo));
709 //collect_matrix(sg, matrix_info, manager);
710
711 //HTaskPtr phase_wait = manager->create_task(Dummy);
712 /*
713 for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
714
715 printf("list_length %d \n", t->list_length);
716
717 int alloc_size = 16*1024;
718
719 if (t->coord_pack_size < alloc_size) {
720 alloc_size = t->coord_pack_size;
721 }
722
723
724 int division_num = (t->coord_pack_size + alloc_size - 1) / alloc_size;
725 int phase_num = (division_num + spe_num -1) / spe_num;
726 int cur_point = 0;
727
728 for (int i = 0; i < phase_num; i++) {
729
730 HTaskPtr alloc_wait = manager->create_task(Dummy);
731 coord_allocate(cur_point, t->coord_pack, spe_num,
732 alloc_size, alloc_wait, manager);
733
734
735 for (MatrixList* u = t->first; u != NULL; u = u->next) {
736
737 //HTaskPtr free_wait = manager->create_task(Dummy);
738
739 //phase_wait = manager->create_task(Dummy);
740
741 }
742
743 coord_free(spe_num, manager, alloc_wait);
744 alloc_wait->spawn();
745 }
746 }
747
748 printf("-----------------------\n");
749 //return create_pp_wait;
750 */
751 } 740 }
752 741
753 void 742 void
754 Viewer::common_rendering(HTaskPtr task_next, SceneGraphRoot *sgroot) 743 Viewer::common_rendering(HTaskPtr task_next, SceneGraphRoot *sgroot)
755 { 744 {