# HG changeset patch # User tkaito # Date 1289071464 -32400 # Node ID 360f8eba78f105b52ed3d198e321317f56ca5e98 # Parent f20ca98d47c65f7c59ed8e72aa49886113632eb3 create_pp_task fix. not done. diff -r f20ca98d47c6 -r 360f8eba78f1 Renderer/Engine/viewer.cc --- a/Renderer/Engine/viewer.cc Sun Nov 07 02:54:22 2010 +0900 +++ b/Renderer/Engine/viewer.cc Sun Nov 07 04:24:24 2010 +0900 @@ -629,8 +629,10 @@ /* flag_drawable な Scenegraph の総数を求める */ int -sg_drawable_num(SceneGraphPtr sg) +sg_drawable_num(SceneGraphPtr scenegraph) { + SceneGraphPtr sg = scenegraph; + int sg_count = 0; while (sg) { if (sg->flag_drawable) { @@ -670,19 +672,48 @@ */ //int spe_num = 6; - HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); - Task **pp = (Task**)manager->allocate(sizeof(Task*)*spe_num); + PolygonPackPtr pp = (PolygonPackPtr)manager->allocate(sizeof(PolygonPack)); int sg_num = sg_drawable_num(sg); + int sg_division = sg_num / spe_num; + int residue = sg_num % spe_num; - for (int k = 0; k < spe_num; k++) { - task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_num,4,6,1); - pp[k] = 0; + HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); + Task **pptask = (Task**)manager->allocate(sizeof(Task*)*spe_num); + + for (int k = 0; k < spe_num-1; k++) { + task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_division,4,6,1); + pptask[k] = 0; } + + task_array[spe_num] = manager->create_task_array(CreatePolygonFromSceneGraph, + sg_division+residue,4,6,1); + pptask[spe_num] = 0; + + int count= 0; + int k = 0; while (sg) { if (sg->flag_drawable) { + if(count < spe_num * sg_division) { + k %= spe_num-1; + } else { + k = spe_num; + } + pptask[k] = task_array[k]->next_task_array(CreatePolygonFromSceneGraph,pptask[k]); + pptask[k]->set_inData(0, &sg->coord_xyz, sizeof(float)*sg->size/3); + pptask[k]->set_inData(1, &sg->coord_tex, sizeof(float)*sg->size/3); + pptask[k]->set_inData(2, &sg->normal , sizeof(float)*sg->size/3); + pptask[k]->set_inData(3, &sg->matrix , sizeof(float)*12); + pptask[k]->set_inData(4, &sg->real_matrix, sizeof(float)*8); + pptask[k]->set_inData(5, &sg->texture_info.pixels, sizeof(uint32)); + pptask[k]->set_param(0,(memaddr)sg->size); + pptask[k]->set_param(1,(memaddr)sg->texture_info.t_w); + pptask[k]->set_param(2,(memaddr)sg->texture_info.t_h); + pptask[k]->set_param(3,(memaddr)sg->texture_info.scale_max); + + pptask[k]->set_outData(0, &pp->tri[pp->info.size++], sizeof(TrianglePack)); } if (sg->children != NULL) { sg = sg->children; @@ -702,52 +733,10 @@ } } } - } + } + count++; } - //MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo)); - //collect_matrix(sg, matrix_info, manager); - - //HTaskPtr phase_wait = manager->create_task(Dummy); - /* - for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) { - - printf("list_length %d \n", t->list_length); - - int alloc_size = 16*1024; - - if (t->coord_pack_size < alloc_size) { - alloc_size = t->coord_pack_size; - } - - - int division_num = (t->coord_pack_size + alloc_size - 1) / alloc_size; - int phase_num = (division_num + spe_num -1) / spe_num; - int cur_point = 0; - - for (int i = 0; i < phase_num; i++) { - - HTaskPtr alloc_wait = manager->create_task(Dummy); - coord_allocate(cur_point, t->coord_pack, spe_num, - alloc_size, alloc_wait, manager); - - - for (MatrixList* u = t->first; u != NULL; u = u->next) { - - //HTaskPtr free_wait = manager->create_task(Dummy); - - //phase_wait = manager->create_task(Dummy); - - } - - coord_free(spe_num, manager, alloc_wait); - alloc_wait->spawn(); - } - } - - printf("-----------------------\n"); - //return create_pp_wait; - */ } void