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 */