# HG changeset patch # User tkaito # Date 1289294098 -32400 # Node ID 11dee6cf7116d510d97f9f43cb2a3429a22d36ba # Parent 55f3c5976959af5fb39ecfc0edf0d189ddbac1bf# Parent cb170249c75298121c7e4c162a2bb3cd950f2013 merge diff -r cb170249c752 -r 11dee6cf7116 Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc --- a/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Mon Nov 08 14:40:53 2010 +0900 +++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Tue Nov 09 18:14:58 2010 +0900 @@ -62,7 +62,6 @@ 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); int sg_size = (int)smanager->get_param(0); int width = (int)smanager->get_param(1); @@ -70,9 +69,42 @@ int scale_max = (int)smanager->get_param(3); // triangle を書き戻す - TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_output(wbuf, 0); + //TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_output(wbuf, 0); + + PolygonPackPtr pp + = (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack)); + PolygonPackPtr send_pp + = (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack)); + PolygonPackPtr pp_addr = (PolygonPackPtr)smanager->get_param(1); + PolygonPackPtr tmp_pp; + for (int i = 0; i < sg_size; i += 3) { + if (pp->info.size >= MAX_SIZE_TRIANGLE) { + PolygonPackPtr next; + + smanager->mainMem_alloc(0, sizeof(PolygonPack)); + smanager->mainMem_wait(); + next = (PolygonPackPtr)smanager->mainMem_get(0); + + pp->next = next; + + tmp_pp = pp; + pp = send_pp; + send_pp = tmp_pp; + + smanager->dma_wait(PP_STORE); + smanager->dma_store(send_pp, (memaddr)pp_addr, + sizeof(PolygonPack), PP_STORE); + + pp_addr = next; + + smanager->dma_wait(PP_LOAD); + smanager->dma_load(pp, (memaddr)pp_addr, + sizeof(PolygonPack), PP_LOAD); + smanager->dma_wait(PP_LOAD); + pp->init(); + } xyz1[0] = coord_xyz[(i+0)*3]; xyz1[1] = coord_xyz[(i+0)*3+1]; @@ -101,6 +133,8 @@ xyz3[0] /= xyz3[2]; xyz3[1] /= xyz3[2]; + TrianglePack *triangle = &pp->tri[pp->info.size++]; + triangle->ver1.x = xyz1[0]; triangle->ver1.y = xyz1[1]; triangle->ver1.z = xyz1[2]; @@ -167,5 +201,13 @@ triangle->tex_info.height = height; triangle->tex_info.scale_max = scale_max; } + smanager->dma_wait(PP_STORE); + smanager->dma_store(pp, (memaddr)pp_addr, + sizeof(PolygonPack), PP_STORE); + smanager->dma_wait(PP_STORE); + + free(pp); + free(send_pp); + return 0; } diff -r cb170249c752 -r 11dee6cf7116 Renderer/Engine/viewer.cc --- a/Renderer/Engine/viewer.cc Mon Nov 08 14:40:53 2010 +0900 +++ b/Renderer/Engine/viewer.cc Tue Nov 09 18:14:58 2010 +0900 @@ -690,7 +690,7 @@ sg_division+residue,4,6,1); pptask[spe_num] = 0; - int count= 0; + //int count= 0; int k = 0; while (sg) { @@ -713,7 +713,7 @@ 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)); + //pptask[k]->set_outData(0, &pp->tri[pp->info.size++], sizeof(TrianglePack)); } if (sg->children != NULL) { sg = sg->children; @@ -734,9 +734,18 @@ } } } - count++; + k++; } - + for (int k = 0; k < spe_num; k++) { + task_array[k]->spawn_task_array(pptask[k]->next()); + task_array[k]->set_cpu(SPE_ANY); + task_array[k]->spawn(); + if (sgroot->gtask_array != NULL) { + HTaskPtr game_task_array = sgroot->gtask_array->get_task_array(); + task_create_pp->wait_for(game_task_array); + } + task_next->wait_for(task_create_pp); + } } void