changeset 792:f2497e0ecd7c

add light switch
author yutaka@localhost.localdomain
date Sun, 02 May 2010 04:17:34 +0900
parents ab12634e6c51
children c260205d3185
files Renderer/Engine/RenderingGlobal.h Renderer/Engine/SceneGraphRoot.cc Renderer/Engine/SceneGraphRoot.h Renderer/Engine/global_alloc.h Renderer/Engine/spe/DataLoad.cc Renderer/Engine/spe/DrawSpan.cc Renderer/Engine/spe/Load_Texture.cc Renderer/Engine/viewer.cc Renderer/Engine/viewer.h TaskManager/Cell/spe/main.cc TaskManager/kernel/schedule/Scheduler.cc
diffstat 11 files changed, 134 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/RenderingGlobal.h	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/RenderingGlobal.h	Sun May 02 04:17:34 2010 +0900
@@ -1,1 +0,0 @@
-   Light,
--- a/Renderer/Engine/SceneGraphRoot.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.cc	Sun May 02 04:17:34 2010 +0900
@@ -45,6 +45,10 @@
       light[i]->xyz[0] = 0;
       light[i]->xyz[1] = 0;
       light[i]->xyz[2] = 0;
+
+      light_switch[i] = 1;
+      light_sysswitch = 0;
+
     }
 
     move_finish_flag = 0;
@@ -648,4 +652,16 @@
   return light_vector;
 }
 
+int*
+SceneGraphRoot::getLightSwitch()
+{
+  return light_switch;
+}
+
+int
+SceneGraphRoot::getLightSysSwitch()
+{
+  return light_sysswitch;
+}
+
 /* end */
--- a/Renderer/Engine/SceneGraphRoot.h	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.h	Sun May 02 04:17:34 2010 +0900
@@ -57,11 +57,15 @@
 
     // 光源のオブジェクト
     SceneGraphPtr light[4];
+    int light_switch[4];
+    int light_sysswitch;
     // 光源の疑似 xml file
     // 光源は4つで決め打ち。                                                         
     // 4 * lightnum (4) = 16;
     float light_vector[16];
 
+
+
     // SceneGraphIterator
     SceneGraphIteratorPtr iterator;
 
@@ -100,6 +104,8 @@
     CameraPtr getCamera();
     SceneGraphPtr getLight(int id);
     float* getLightVector();
+    int* getLightSwitch();
+    int getLightSysSwitch();
 
     /* Other System API */
     void allExecute(int screen_w, int screen_h);
--- a/Renderer/Engine/global_alloc.h	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/global_alloc.h	Sun May 02 04:17:34 2010 +0900
@@ -12,6 +12,9 @@
   GLOBAL_TILE_LIST,
   KEY_STATUS,
   LOAD_ID,
+  Light,
+  LightSwitch,
+  LightSysSwitch,
 
 };
 
--- a/Renderer/Engine/spe/DataLoad.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/spe/DataLoad.cc	Sun May 02 04:17:34 2010 +0900
@@ -13,7 +13,6 @@
   int size = (int)s->get_param(0);
   int load_id = (int)s->get_param(1);
 
-
   s->global_alloc(load_id, size);
 
   return 0;
--- a/Renderer/Engine/spe/DrawSpan.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/spe/DrawSpan.cc	Sun May 02 04:17:34 2010 +0900
@@ -226,10 +226,13 @@
 #endif
     /*完全に透けているか判断*/
     int flag = (alpha != 0);
+    int *light_sys_switch = (int*)smanager->global_get(LightSysSwitch);
 
-    color = infinity_light_calc(color,normal_x,normal_y,normal_z,
-                                smanager,localx,localy,zpos,
-                                world_x,world_y,world_z);
+    if ( *light_sys_switch == 1) {
+        color = infinity_light_calc(color,normal_x,normal_y,normal_z,
+				    smanager,localx,localy,zpos,
+				    world_x,world_y,world_z);
+    }
 
     g->zRow[localx + (rangex*localy)] = zpos*flag + g->zRow[localx + (rangex*localy)]*(1-flag);
     int *point = &g->linebuf[localy][localx] ;
@@ -453,14 +456,17 @@
     vector float vtmp_rgb __attribute__((aligned(16))) = {0,0,0,0};
 
     int light_num = 4;
+    int *light_switch = (int*)smanager->global_get(LightSwitch);
 
     for (int i = 0; i < light_num; i++) {
 
-      light_vector = spu_sub(v_world[i],light_xyz[i]);
-      normalize(light_vector, light_vector);
-      inner_product = innerProduct1(normal_vector,light_vector);
-      v_inner = spu_splats(inner_product);
-      vtmp_rgb = spu_madd(v_rgb,v_inner,vtmp_rgb);
+      if (light_switch[i] == 1) {
+          light_vector = spu_sub(v_world[i],light_xyz[i]);
+	  normalize(light_vector, light_vector);
+	  inner_product = innerProduct1(normal_vector,light_vector);
+	  v_inner = spu_splats(inner_product);
+	  vtmp_rgb = spu_madd(v_rgb,v_inner,vtmp_rgb);
+      }
 
     }
 
--- a/Renderer/Engine/spe/Load_Texture.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/spe/Load_Texture.cc	Sun May 02 04:17:34 2010 +0900
@@ -22,5 +22,7 @@
     MemList *ml = smanager->createMemList(sizeof(uint32) * TEXTURE_BLOCK_SIZE, MAX_TILE);
     smanager->global_set(GLOBAL_TILE_LIST, (void *)ml);
 
+    smanager->printf("%d\n",GLOBAL_TILE_LIST);
+
     return 0;
 }
--- a/Renderer/Engine/viewer.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Sun May 02 04:17:34 2010 +0900
@@ -104,32 +104,52 @@
 
     sgroot = new SceneGraphRoot(this->width, this->height);
     sgroot->tmanager = manager;
-    
-    int size = sizeof(float)*4*4; //xyz+alfa(4) * light_num(4)
+
+
+    int light_num = 4;
+    int size = sizeof(float)*4*light_num; //xyz+alfa(4) * light_num(4)
     int light_size = size / sizeof(float);
 
     light_xyz_stock = (float *)manager->allocate(size);
     light_xyz = (float *)manager->allocate(size);
 
+
     for (int i = 0; i < light_size ; i++) {
       light_xyz[i] = 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);
+    for(int i = 0; i < spe_num; i++) {
+	HTaskPtr 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();
     }
 
+    size = light_num * sizeof(int);
+    light_switch = (int*)manager->allocate(size);
+    for (int i = 0; i < light_num; i++) {
+        light_switch[i] = 0;
+    }
+
+    for(int i = 0; i < spe_num; i++) {
+	HTaskPtr data_load = manager->create_task(DataLoad);
+	data_load->set_param(0,(memaddr)size);
+	data_load->set_param(1,(memaddr)LightSwitch);
+	data_load->set_cpu((CPU_TYPE)((int)SPE_0 + i));
+	data_load->spawn();
+    }
+
+    size = 16; // LightSysSwitch は 4byte. 残り 12byte は DMA転送の為のパディング
+
+    for(int i = 0; i < spe_num; i++) {
+	HTaskPtr data_load = manager->create_task(DataLoad);
+	data_load->set_param(0,(memaddr)size);
+	data_load->set_param(1,(memaddr)LightSysSwitch);
+	data_load->set_cpu((CPU_TYPE)((int)SPE_0 + i));
+	data_load->spawn();
+    }
+    
     MainLoop *mainloop = app->init(this, this->width, this->height);
     mainloop->mainLoop();
 }
@@ -181,6 +201,7 @@
 	task_tex->spawn();	
     }
 
+
     return task_next;
 }
 
@@ -302,6 +323,7 @@
     sgroot->updateControllerState();
     sgroot->allExecute(width, height);
     light_xyz_stock = sgroot->getLightVector();
+    light_switch_stock = sgroot->getLightSwitch();
     //sgroot->checkRemove();
 
     // ここから下は Rendering という関数にする
@@ -462,6 +484,25 @@
     task_create_pp->spawn();
 }
 
+HTaskPtr
+Viewer::update_task_create(void *data, int size, 
+			   int load_id, int spe_id, HTaskPtr wait)
+{
+
+	HTaskPtr data_update = manager->create_task(DataUpdate);
+	data_update->add_inData(data,size);
+	data_update->set_param(0,size);
+	data_update->set_param(1,load_id);
+	data_update->set_cpu((CPU_TYPE)(spe_id));
+	if (wait != NULL) {
+	  wait->wait_for(data_update);
+	}
+	data_update->spawn();
+
+	return data_update;
+
+}
+
 void
 Viewer::common_draw(HTaskPtr task_next)
 {
@@ -470,34 +511,44 @@
     //task_next = manager->create_task(Dummy);
     //task_next->set_post(post2runLoop, (void*)this);
 
-   //Light info update
+    //Light info update
                                                                    
     HTaskPtr data_update;
     HTaskPtr data_update_wait;
-    int size = sizeof(float)*4*4; //xyz+alfa(4) * light_num(4) 
+    int light_num = 4;
+    int size = sizeof(float)*4*light_num; //xyz+alpha(4) * light_num(4) 
     int light_size = size / sizeof(float);
 
     for (int i = 0; i < light_size; i++) {
-      light_xyz[i] = light_xyz_stock[i]; 
+        light_xyz[i] = light_xyz_stock[i]; 
     }
-    
+
+    for (int i = 0; i < light_num; i++) {
+        light_switch[i] = light_switch_stock[i];
+    }
+ 
     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();
+      update_task_create(light_xyz,size,Light,(int)SPE_0+i,data_update_wait);
+    }
+
+    size = light_num * sizeof(int);
+
+    for (int i = 0; i < spe_num; i++) {
+      update_task_create(light_xyz,size,LightSwitch,(int)SPE_0+i,data_update_wait);
+    }
+
+    size = 16; // LightSysSwitch は 4byte. 残り 12byte は DMA転送の為のパディング
+
+    for (int i = 0; i < spe_num; i++) {
+      update_task_create(light_xyz,size,LightSysSwitch,(int)SPE_0+i,data_update_wait);
     }
     
-    data_update_wait->spawn();
 
     ppack->clear();
     for (int i = 0; i < spackList_length; i++) {
@@ -550,7 +601,9 @@
                 endx = this->width;
             }
         }
-    }   
+    } 
+
+    data_update_wait->spawn();  
 
 }
 
--- a/Renderer/Engine/viewer.h	Thu Apr 29 23:12:48 2010 +0900
+++ b/Renderer/Engine/viewer.h	Sun May 02 04:17:34 2010 +0900
@@ -39,10 +39,10 @@
     int width;
     int height;
 
-    //float light_xyz[4] __attribute__((aligned(16)));
     float *light_xyz;
     float *light_xyz_stock;
-
+    int *light_switch;
+    int *light_switch_stock;
 
     Uint32 video_flags;
     Uint32 *pixels;
@@ -73,6 +73,9 @@
     void spe_draw(HTaskPtr task_next);
     //  void exchange_sgroot(TaskManager *manager);
 
+    HTaskPtr update_task_create(void *data, int size, 
+				int load_id, int spe_id, HTaskPtr wait);
+
     void getKey();
     void get_send_controll();
 
--- a/TaskManager/Cell/spe/main.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/TaskManager/Cell/spe/main.cc	Sun May 02 04:17:34 2010 +0900
@@ -17,7 +17,7 @@
 main(unsigned long long speid,
      unsigned long long argc, unsigned long long argv)
 {
-    CellScheduler *manager;
+    CellScheduler *c_scheduler;
 
     //const unsigned ls_size   = (unsigned)&argc;
     //unsigned code_size = (unsigned)&_end;
@@ -27,20 +27,20 @@
     __debug("code_size:%10d bytes\n", code_size);
     __debug("heap_size:%10d bytes\n", heap_size);
 
-    TaskManagerImpl *tm = new SpeTaskManagerImpl();
+    TaskManagerImpl *manager = new SpeTaskManagerImpl();
 
     SchedRegister(ShowTime);
     SchedRegister(StartProfile);
 
-    manager = new CellScheduler();
-    manager->init(tm);
-    manager->id = (int)argc;
+    c_scheduler = new CellScheduler();
+    c_scheduler->init(manager);
+    c_scheduler->id = (int)argc;
 
-    tm->set_scheduler(manager);
+    manager->set_scheduler(c_scheduler);
 
-    manager->run(new SchedNop());
+    c_scheduler->run(new SchedNop());
     
-    manager->finish();
+    c_scheduler->finish();
 
     return 0;
 }
--- a/TaskManager/kernel/schedule/Scheduler.cc	Thu Apr 29 23:12:48 2010 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Sun May 02 04:17:34 2010 +0900
@@ -161,7 +161,9 @@
 void*
 Scheduler::global_alloc(int id, int size)
 {
+
     globalList[id] = allocate(size);
+
     return globalList[id];
 }