Mercurial > hg > Members > kono > Cerium
diff Renderer/Engine/viewer.cc @ 792:f2497e0ecd7c
add light switch
author | yutaka@localhost.localdomain |
---|---|
date | Sun, 02 May 2010 04:17:34 +0900 |
parents | 4455e7b0caf3 |
children | c260205d3185 |
line wrap: on
line diff
--- 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(); }