Mercurial > hg > Members > kono > Cerium
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 { |