Mercurial > hg > Members > kono > Cerium
diff Renderer/Engine/viewer.cc @ 748:b7376415fa5f
TaskManager changeset 683, Renderer changeset 746
author | hiroki |
---|---|
date | Mon, 25 Jan 2010 18:01:19 +0900 |
parents | dbe137505f2e |
children | 24a37fe8419a |
line wrap: on
line diff
--- a/Renderer/Engine/viewer.cc Sun Dec 06 10:23:19 2009 +0900 +++ b/Renderer/Engine/viewer.cc Mon Jan 25 18:01:19 2010 +0900 @@ -12,6 +12,7 @@ #include "Pad.h" #include "Application.h" #include "lindaapi.h" +#include "global_alloc.h" static void post2runLoop(SchedTask *s,void *viewer,void *s1); static void post2runDraw(SchedTask *s,void *viewer,void *s1); @@ -43,12 +44,16 @@ * */ -Viewer::Viewer(int b, int w, int h, int _num) +Viewer::Viewer(TaskManager *m, ViewerDevice *vd, int b, int w, int h, int _num) { bpp = b; width = w; height = h; spe_num = _num; + manager = m; + dev = vd; + pixels = dev->video_init(manager, b, w, h); + } int @@ -85,12 +90,6 @@ SDL_Quit(); } -void -Viewer::swap_buffers(void) -{ - SDL_GL_SwapBuffers(); -} - void Viewer::run_init(TaskManager *manager, Application *app) @@ -101,8 +100,33 @@ this_time = 0; frames = 0; + if (spe_num == 0) spe_num = 1; + sgroot = new SceneGraphRoot(this->width, this->height); sgroot->tmanager = manager; + + int size = sizeof(float)*4; + + light_xyz = (float *)manager->allocate(size); + light_xyz[0] = 0.0f; + light_xyz[1] = 0.0f; + light_xyz[2] = 0.0f; + light_xyz[3] = 0.0f; + + HTaskPtr data_load; + data_load = manager->create_task(DataLoad); + data_load->set_param(0,(memaddr)size); + data_load->set_param(1,(memaddr)Light); + data_load->set_cpu((CPU_TYPE)((int)SPE_0)); + data_load->spawn(); + + for(int i = 1; i < spe_num; i++) { + data_load = manager->create_task(DataLoad); + data_load->set_param(0,(memaddr)size); + data_load->set_param(1,(memaddr)Light); + data_load->set_cpu((CPU_TYPE)((int)SPE_0 + i)); + data_load->spawn(); + } MainLoop *mainloop = app->init(this, this->width, this->height); @@ -151,40 +175,14 @@ // ここは、Iterator を用意するべきだよね for (int i = 0; i < spe_num; i++) { task_tex = manager->create_task(LoadTexture); - task_tex->set_cpu((CPU_TYPE)((int)SPE_0 + i)); - task_next->wait_for(task_tex); - task_tex->spawn(); + task_tex->set_cpu((CPU_TYPE)((int)SPE_0 + i)); + task_next->wait_for(task_tex); + task_tex->spawn(); } return task_next; } -/* Loop って言っても1回しか実行されない */ -void -Viewer::speLoop() -{ - HTaskPtr task_next = initLoop(); - // key の情報を格納する領域を確保する (global_alloc(KEY_STATUS)) - HTaskPtr init_key_task = manager->create_task(InitKey); - init_key_task->set_cpu(SPE_0); - init_key_task->spawn(); - - // SPE に送信する KEY_STATUS の領域確保 - key_stat *key = (key_stat*)manager->allocate(sizeof(key_stat)); - this->keyPtr = key; - - // post2runLoop は旧バージョン用なので post2speRunLoop の様なものを別につくるべき - //task_next->set_post(post2speRunLoop, (void*)this); // set_post(function(this->run_loop()), NULL) - //task_next->spawn(); - // TASK_INIT_TEXTURE が全て終わったら DUMMY_TASK が Viewer::run_loop() を呼ぶ - - /* test */ - - HTaskPtr task_switch = manager->create_task(Switch); - task_switch->wait_for(task_next); - task_switch->set_post(post2runMoveDrawLoop, (void*)this, 0); - task_switch->spawn(); -} void Viewer::getKey() @@ -243,7 +241,7 @@ viewer->getKey(); HTaskPtr update_key = viewer->manager->create_task(UpdateKey); update_key->add_inData(viewer->keyPtr, sizeof(key_stat)); - update_key->set_cpu(SPE_0); + //update_key->set_cpu(SPE_0); update_key->spawn(); /* TASK_MOVE は外から引数で取ってくるべき */ @@ -272,16 +270,6 @@ } -#if 0 -static void -post2speRunLoop(void *viewer_) -{ - Viewer *viewer = (Viewer *)viewer_; - HTaskPtr task_next = viewer->manager->create_task(Dummy); - viewer->run_move(task_next); -} -#endif - void Viewer::mainLoop() { @@ -291,23 +279,35 @@ task_next->spawn(); } -#if 0 void -post2runMove(void *viewer_) +Viewer::run_loop(HTaskPtr task_next) { - Viewer *viewer = (Viewer*)viewer_; - HTaskPtr task_next = viewer->manager->create_task(Dummy); - viewer->run_move(task_next); + dev->clear_screen(); + + bool quit_flg; + quit_flg = quit_check(); + if (quit_flg == true) { + this_time = get_ticks(); + run_finish(); + return; + } + + dev->clean_pixels(); + + for (int i = 1; i <= spackList_length; i++) { + spackList[i-1].reinit(i*split_screen_h); + } + + sgroot->updateControllerState(); + sgroot->allExecute(width, height); + light_xyz_stock = sgroot->getLightVector(); + //sgroot->checkRemove(); + + // ここから下は Rendering という関数にする + rendering(task_next); } -#endif -void -Viewer::run_move(HTaskPtr task_next) -{ - sgroot->updateControllerState(); - sgroot->allExecute(width, height); -} void Viewer::run_collision() @@ -325,7 +325,7 @@ void Viewer::rendering(HTaskPtr task_next) { - common_rendering(task_next); + common_rendering(task_next, sgroot); // Barrier 同期 // run_draw() を呼ぶ post2runDraw @@ -345,32 +345,6 @@ psx_sync_n(); } -void -Viewer::run_loop(HTaskPtr task_next) -{ - bool quit_flg; - quit_flg = quit_check(); - if (quit_flg == true) { - this_time = get_ticks(); - run_finish(); - return; - } - - clean_pixels(); - - for (int i = 1; i <= spackList_length; i++) { - spackList[i-1].reinit(i*split_screen_h); - } - - //run_move(task_next); - sgroot->updateControllerState(); - sgroot->allExecute(width, height); - //sgroot->checkRemove(); - - // ここから下は Rendering という関数にする - rendering(task_next); -} - static void post2runDraw(SchedTask *s, void *viewer_, void *arg) { @@ -392,17 +366,6 @@ frames++; } -void -Viewer::run_finish(void) -{ - if (this_time != start_time) { - printf("%f FPS\n", (((float)frames)/(this_time-start_time))*1000.0); - } - - delete sgroot; -// delete sgroot_2; - quit(); -} static void post2speRendering(SchedTask *s, void *viewer_, void *arg) @@ -415,7 +378,7 @@ void Viewer::spe_rendering(HTaskPtr task_next) { - common_rendering(task_next); + common_rendering(task_next, sgroot); this->draw_dummy->wait_for(task_next); task_next->set_post(post2speDraw, (void*)this, 0); @@ -444,7 +407,7 @@ } void -Viewer::common_rendering(HTaskPtr task_next) +Viewer::common_rendering(HTaskPtr task_next, SceneGraphRoot *sgroot) { HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph); @@ -454,8 +417,9 @@ task_create_pp->set_param(1,(memaddr)ppack); task_next->wait_for(task_create_pp); - - int range_base = spe_num; + + int range_base = spe_num; + // 切り上げのつもり int range = (spackList_length + range_base - 1) / range_base; @@ -467,7 +431,7 @@ HTaskPtr task_create_sp = manager->create_task(CreateSpan); task_create_sp->set_param(0,index_start); - + /** * ex. screen_height が 480, spenum が 6 の場合、各SPEのy担当範囲 * [ 1.. 80] [ 81..160] [161..240] @@ -477,6 +441,7 @@ * [ 1..216] [217..432] [433..648] * [649..864] [865..1080] */ + task_create_sp->set_param(1,index_start*split_screen_h + 1); task_create_sp->set_param(2,index_end*split_screen_h); @@ -488,10 +453,11 @@ task_next->wait_for(task_create_sp); task_create_sp->wait_for(task_create_pp); - task_create_sp->set_cpu(SPE_ANY); + task_create_sp->set_cpu(SPE_ANY); task_create_sp->spawn(); } + task_create_pp->spawn(); } @@ -503,6 +469,35 @@ //task_next = manager->create_task(Dummy); //task_next->set_post(post2runLoop, (void*)this); + //Light info update + + HTaskPtr data_update; + HTaskPtr data_update_wait; + int size = sizeof(float)*4; + + light_xyz[0] = light_xyz_stock[0]; + light_xyz[1] = light_xyz_stock[1]; + light_xyz[2] = light_xyz_stock[2]; + light_xyz[3] = light_xyz_stock[3]; + + data_update_wait = manager->create_task(DataUpdate); + data_update_wait->add_inData(light_xyz,size); + data_update_wait->set_param(0,size); + data_update_wait->set_param(1,Light); + data_update_wait->set_cpu((CPU_TYPE)((int)SPE_0)); + + for (int i = 1; i < spe_num; i++) { + data_update = manager->create_task(DataUpdate); + data_update->add_inData(light_xyz,sizeof(float)*size); + data_update->set_param(0,size); + data_update->set_param(1,Light); + data_update->set_cpu((CPU_TYPE)((int)SPE_0 + i)); + data_update_wait->wait_for(data_update); + data_update->spawn(); + } + + data_update_wait->spawn(); + ppack->clear(); for (int i = 0; i < spackList_length; i++) { SpanPack *spack = &spackList[i]; @@ -542,8 +537,9 @@ break; } - task_draw->set_cpu(SPE_ANY); + task_draw->set_cpu(SPE_ANY); task_next->wait_for(task_draw); + task_draw->wait_for(data_update_wait); task_draw->spawn(); startx += split_screen_w; @@ -554,6 +550,20 @@ } } } + +} + +void +Viewer::run_finish() +{ + dev->free_device(); + if (this_time != start_time) { + printf("%f FPS\n", (((float)frames)/(this_time-start_time))*1000.0); + } + + delete sgroot; +// delete sgroot_2; + quit(); } /* end */