# HG changeset patch # User yutaka@localhost.localdomain # Date 1289135464 -32400 # Node ID 43808a098020897dd0eba3c7b433ef3810d823d5 # Parent f8e9c985e2a8c537cc3681cc478b20d6cf311332# Parent 360f8eba78f105b52ed3d198e321317f56ca5e98 merge diff -r f8e9c985e2a8 -r 43808a098020 Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc --- a/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Sun Nov 07 22:10:29 2010 +0900 +++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Sun Nov 07 22:11:04 2010 +0900 @@ -8,7 +8,7 @@ #include "polygon_pack.h" #include "scene_graph_pack.h" -SchedDefineTask(CreatePolygonFromSceneGraph); +SchedDefineTask1(CreatePolygonFromSceneGraph, createPolygonFromSceneGraph); #define SG_PACK_LOAD 10 #define SG_NODE_LOAD 11 @@ -50,20 +50,29 @@ } static int -run(SchedTask *smanager, void *rbuf, void *wbuf) +createPolygonFromSceneGraph(SchedTask *smanager, void *rbuf, void *wbuf) { float xyz1[4], xyz2[4], xyz3[4]; float normal1[4],normal2[4],normal3[4]; //coord_xyz, coord_tex, normal, matrix, real_matrix を受け取る - float *coord_xyz = (float)smanager->get_inData(0); - float *coord_tex = (float)smanager->get_inData(1); - float *normal = (float)smanager->get_inData(2); - float *matrix = (float)smanager->get_inData(3); - float *real_matrix = (float)smanager->get_inData(4); - TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_inData(5); + float *coord_xyz = (float*)smanager->get_input(rbuf, 0); + float *coord_tex = (float*)smanager->get_input(rbuf, 1); + float *normal = (float*)smanager->get_input(rbuf, 2); + float *matrix = (float*)smanager->get_input(rbuf, 3); + float *real_matrix = (float*)smanager->get_input(rbuf, 4); + uint32 *pixels = (uint32*)smanager->get_input(rbuf, 5); + //TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_input(rbuf, 6); - for (int i = 0; i < sg->size; i += 3) { + int sg_size = (int)smanager->get_param(0); + int width = (int)smanager->get_param(1); + int height = (int)smanager->get_param(2); + int scale_max = (int)smanager->get_param(3); + + // triangle を書き戻す + TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_output(wbuf, 0); + + for (int i = 0; i < sg_size; i += 3) { xyz1[0] = coord_xyz[(i+0)*3]; xyz1[1] = coord_xyz[(i+0)*3+1]; @@ -110,20 +119,20 @@ triangle->ver3.tex_x = coord_tex[(i+2)*3]; triangle->ver3.tex_y = coord_tex[(i+2)*3+1]; - normal1[0] = sg->normal[(i+0)*3]; - normal1[1] = sg->normal[(i+0)*3+1]; - normal1[2] = sg->normal[(i+0)*3+2]*-1.0f; + normal1[0] = normal[(i+0)*3]; + normal1[1] = normal[(i+0)*3+1]; + normal1[2] = normal[(i+0)*3+2]*-1.0f; //normal1[3] = 1.0f; normal1[3] = 0.0f; - normal2[0] = sg->normal[(i+1)*3]; - normal2[1] = sg->normal[(i+1)*3+1]; - normal2[2] = sg->normal[(i+1)*3+2]*-1.0f; + normal2[0] = normal[(i+1)*3]; + normal2[1] = normal[(i+1)*3+1]; + normal2[2] = normal[(i+1)*3+2]*-1.0f; //normal2[3] = 1.0f; normal2[3] = 0.0f; - normal3[0] = sg->normal[(i+2)*3]; - normal3[1] = sg->normal[(i+2)*3+1]; + normal3[0] = normal[(i+2)*3]; + normal3[1] = normal[(i+2)*3+1]; normal3[2] = normal[(i+2)*3+2]*-1.0f; //normal3[3] = 1.0f; normal3[3] = 0.0f; @@ -153,10 +162,10 @@ triangle->normal3.y = normal3[1]; triangle->normal3.z = normal3[2]; - triangle->tex_info.addr = sg->texture_info.pixels; - triangle->tex_info.width = sg->texture_info.t_w; - triangle->tex_info.height = sg->texture_info.t_h; - triangle->tex_info.scale_max = sg->texture_info.scale_max; + triangle->tex_info.addr = pixels; + triangle->tex_info.width = width; + triangle->tex_info.height = height; + triangle->tex_info.scale_max = scale_max; } return 0; } diff -r f8e9c985e2a8 -r 43808a098020 Renderer/Engine/viewer.cc --- a/Renderer/Engine/viewer.cc Sun Nov 07 22:10:29 2010 +0900 +++ b/Renderer/Engine/viewer.cc Sun Nov 07 22:11:04 2010 +0900 @@ -627,59 +627,116 @@ } +/* flag_drawable な Scenegraph の総数を求める */ +int +sg_drawable_num(SceneGraphPtr scenegraph) +{ + SceneGraphPtr sg = scenegraph; + + int sg_count = 0; + while (sg) { + if (sg->flag_drawable) { + sg_count++; + } + if (sg->children != NULL) { + sg = sg->children; + } else if (sg->brother != NULL) { + sg = sg->brother; + } else { + while (sg) { + if (sg->brother != NULL) { + sg = sg->brother; + break; + } else { + if (sg->parent == NULL) { + sg = NULL; + break; + } else { + sg = sg->parent; + } + } + } + } + } + return sg_count; +} + void create_pp_task(SceneGraphPtr sg, TaskManager *manager, int spe_num, HTaskPtr task_next) { - MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo)); - collect_matrix(sg, matrix_info, manager); - /* * SceneGraph を辿って coord_xyz, coord_tex, normal, matrix, real_matrix 及び、 * PolygonPack の TrianglePack (空) を送る。pp->info.size の計算もここで。 * */ + //int spe_num = 6; - //HTaskPtr phase_wait = manager->create_task(Dummy); + 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 (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) { - - printf("list_length %d \n", t->list_length); - - int alloc_size = 16*1024; + 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; - if (t->coord_pack_size < alloc_size) { - alloc_size = t->coord_pack_size; - } - + int count= 0; + int k = 0; - 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++) { + 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); - 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); - + pptask[k]->set_outData(0, &pp->tri[pp->info.size++], sizeof(TrianglePack)); + } + if (sg->children != NULL) { + sg = sg->children; + } else if (sg->brother != NULL) { + sg = sg->brother; + } else { + while (sg) { + if (sg->brother != NULL) { + sg = sg->brother; + break; + } else { + if (sg->parent == NULL) { + sg = NULL; + break; + } else { + sg = sg->parent; + } + } } - - coord_free(spe_num, manager, alloc_wait); - alloc_wait->spawn(); } + count++; } - printf("-----------------------\n"); - //return create_pp_wait; - } void @@ -699,7 +756,8 @@ #else - + //SceneGraphPtr sg = sgroot->getDrawSceneGraph(); + //printf("sg->size = %lld\n", sg->size); HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph); // SceneGraph(木構造) -> PolygonPack