# HG changeset patch # User yutaka@localhost.localdomain # Date 1272741454 -32400 # Node ID f2497e0ecd7ccd485eb1d7afb1019de06cee36fa # Parent ab12634e6c5163b6da0fb474f768d16fe94bf911 add light switch diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/RenderingGlobal.h --- 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, diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/SceneGraphRoot.cc --- 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 */ diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/SceneGraphRoot.h --- 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); diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/global_alloc.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, }; diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/spe/DataLoad.cc --- 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; diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/spe/DrawSpan.cc --- 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); + } } diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/spe/Load_Texture.cc --- 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; } diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/viewer.cc --- 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(); } diff -r ab12634e6c51 -r f2497e0ecd7c Renderer/Engine/viewer.h --- 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(); diff -r ab12634e6c51 -r f2497e0ecd7c TaskManager/Cell/spe/main.cc --- 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; } diff -r ab12634e6c51 -r f2497e0ecd7c TaskManager/kernel/schedule/Scheduler.cc --- 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]; }