Mercurial > hg > Game > Cerium
changeset 1072:262d9367848d draft
merge
author | yutaka@localhost.localdomain |
---|---|
date | Fri, 17 Dec 2010 00:18:36 +0900 |
parents | 19a1769343d6 (current diff) 5fda85b39dc2 (diff) |
children | 6a9f02fa8e74 |
files | Renderer/Engine/sys.cc Renderer/Engine/sys.h SceneGraph/BlenderScript/export_xml.py TaskManager/Cell/spe/MailQueue.h |
diffstat | 120 files changed, 2044 insertions(+), 1596 deletions(-) [+] |
line wrap: on
line diff
--- a/Renderer/Engine/Application.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Application.cc Fri Dec 17 00:18:36 2010 +0900 @@ -3,5 +3,3 @@ Application::Application(){} Application::~Application(){} - -
--- a/Renderer/Engine/Application.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Application.h Fri Dec 17 00:18:36 2010 +0900 @@ -14,7 +14,9 @@ public: Application(); virtual ~Application(); - + + virtual bool app_loop(Viewer *viewer){ return 1; /* use all execute */ }; + virtual HTaskPtr application_task(HTaskPtr next, Viewer* viewer){return next;}; virtual MainLoopPtr init(Viewer *viewer, int w, int h) = 0; };
--- a/Renderer/Engine/Button.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Button.cc Fri Dec 17 00:18:36 2010 +0900 @@ -25,6 +25,17 @@ } /** + * ボタンの状態を初期化する + */ +void +Button::reset(void) +{ + push = 0; + hold = 0; + release = 0; +} + +/** * @retval 1 ボタンが押された(このフレームのみ) * @retval 0 押されていない */
--- a/Renderer/Engine/Button.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Button.h Fri Dec 17 00:18:36 2010 +0900 @@ -11,6 +11,7 @@ void push_work(void); void release_work(void); + void reset(void); int isPush(void); int isHold(void); int isRelease(void);
--- a/Renderer/Engine/Camera.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Camera.cc Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ #include <math.h> #include "SceneGraphRoot.h" #include "Camera.h" -#include "sys.h" +#include "matrix_calc.h" #include "Scheduler.h" #include "TaskManager.h" @@ -157,6 +157,7 @@ } } + update(w,h); // to make matrix[] } Camera::~Camera(void)
--- a/Renderer/Engine/Light.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Light.cc Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ #include <math.h> #include "SceneGraphRoot.h" #include "Light.h" -#include "sys.h" +#include "matrix_calc.h" #include "Scheduler.h" #include "TaskManager.h"
--- a/Renderer/Engine/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) $(wildcard Application/*.cc) $(wildcard ps3fb/*.cc) -SRCS_EXCLUDE = # +SRCS_EXCLUDE = # 除外 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/Renderer/Engine/Makefile.def Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Makefile.def Fri Dec 17 00:18:36 2010 +0900 @@ -2,10 +2,10 @@ CERIUM = ../.. -ABIBIT = 32 +ABIBIT = 64 ABI = -m$(ABIBIT) CC = g++ -OPT = -g -O9 #-DSPE_CREATE_POLYGON_CHECK -DSPE_CREATE_POLYGON=1 +OPT = -g # -O9 #-DSPE_CREATE_POLYGON_CHECK -DSPE_CREATE_POLYGON=1 CFLAGS = -Wall $(ABI) $(OPT) # -DDEBUG INCLUDE = -I$(CERIUM)/include/TaskManager -I.
--- a/Renderer/Engine/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) $(wildcard Application/*.cc) -SRCS_EXCLUDE = # +SRCS_EXCLUDE = # 除外 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/Renderer/Engine/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) $(wildcard Application/*.cc) -SRCS_EXCLUDE = # +SRCS_EXCLUDE = # 除外 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/Renderer/Engine/SceneGraph.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/SceneGraph.cc Fri Dec 17 00:18:36 2010 +0900 @@ -3,9 +3,10 @@ #include <SDL_opengl.h> #include <SDL_image.h> #include <libxml/parser.h> +#include <string.h> #include "SceneGraph.h" #include "xml.h" -#include "sys.h" +#include "matrix_calc.h" #include "TextureHash.h" #include "texture.h" #include "TaskManager.h" @@ -60,24 +61,44 @@ * @param[in] scale テクスチャの最大縮小率 (= 2^n) * @return (1) のアドレス */ + + +uint32 white[256] __attribute__((aligned(16))); + static uint32* -makeTapestry(TaskManager *manager, int tex_w, int tex_h, uint32 *tex_src, +makeTapestry(TaskManager *manager, uint32 tex_w, uint32 tex_h, uint32 *tex_src, int all_pixel_num, int scale_cnt) { + if (tex_w==0 && tex_h==0) { + // non texture case + uint32 pattern = SDL_BYTEORDER == SDL_LIL_ENDIAN? 0x00ffffff : 0xffffff00; /* OpenGL RGBA masks */ + if (white[0]!=pattern) { // dumb! +#if 1 + for(int i=0;i<256;i++) + white[i] = pattern; +#else + memset_pattern4(white,&pattern,256); +#endif + } + return white; + } - int t = 0; - int diff = TEXTURE_SPLIT_PIXEL; - int p_diff = 1; + uint32 t = 0; + uint32 diff = TEXTURE_SPLIT_PIXEL; + uint32 p_diff = 1; uint32 *tex_dest = (uint32*)manager->allocate(sizeof(int)*all_pixel_num); + uint32 alpha = SDL_BYTEORDER == SDL_LIL_ENDIAN? 0xff000000 : 0xff; /* OpenGL RGBA masks */ + while (scale_cnt) { - for (int y = 0; y < tex_h; y += diff) { - for (int x = 0; x < tex_w; x += diff) { - for (int j = 0; j < diff; j += p_diff) { - for (int i = 0; i < diff; i += p_diff) { - tex_dest[t++] - = tex_src[(x+i) + tex_w*(y+j)]; + // we should use average, except clear one + for (uint32 y = 0; y < align(tex_h,diff); y += diff) { + for (uint32 x = 0; x < align(tex_w,diff); x += diff) { + for (uint32 j = 0; j < diff; j += p_diff) { + for (uint32 i = 0; i < diff; i += p_diff) { + tex_dest[t++] = + (x+i<=tex_h && y+j<=tex_w) ? tex_src[(x+i) + tex_w*(y+j)]: alpha; } } } @@ -207,7 +228,7 @@ #endif - texture_id = -1; + texture_info.texture_id = -1; move = no_move; collision = no_collision; @@ -483,6 +504,8 @@ int tex_w = texture_image->w; int tex_h = texture_image->h; int all_pixel_num = 0; + int nw = tex_w; + int nh = tex_h; /** * テクスチャの w or h が 8 pixel で分割できる間、 @@ -494,23 +517,28 @@ * scale = 16 * (128, 64) => 64,32 : 32,16: 16,8 * scale = 8 + * 8 pixcel align してない場合は、透明に 8 pixcel に拡張する + * (200, 57) => 200,64 : 100,32 : 56,16: 32,8 (16,1 : 8,1 まで落すべき? 32byte) + * scale = 32 */ - while (tex_w % TEXTURE_SPLIT_PIXEL == 0 && - tex_h % TEXTURE_SPLIT_PIXEL == 0) { - all_pixel_num += tex_w*tex_h; + + do { + tex_w = align(tex_w,8); + tex_h = align(tex_h,8); + all_pixel_num += tex_w * tex_h; tex_w >>= 1; /* tex_w /= 2 */ tex_h >>= 1; scale <<= 1; /* scale *= 2 */ - } + } while( tex_w >8 || tex_h > 8 ); - scale >>= 1; + scale >>= 1; // 必ず 1 以上になる tapestry = makeTapestry(manager, texture_image->w, texture_image->h, (uint32*)texture_image->pixels, all_pixel_num, scale); - list[id].t_w = texture_image->w; - list[id].t_h = texture_image->h; + list[id].t_w = nw; + list[id].t_h = nh; list[id].pixels_orig = (Uint32*)texture_image->pixels; list[id].pixels = tapestry; list[id].scale_max = scale; @@ -541,7 +569,8 @@ exit(0); } - texture_id = makeTapestries(manager, texture_image, tex_id); + texture_info.texture_id = makeTapestries(manager, texture_image, tex_id); + tex_id = texture_info.texture_id; if (unlink(image_name)) { cout << "unlink error\n"; @@ -550,17 +579,17 @@ /** * 以前に Load されている Texture を共用 */ - texture_id = tex_id; + texture_info.texture_id = tex_id; } // こんなことすると list[] のいみあるのかなーと // 微妙に思う、自分で書き換えた感想 by gongo - texture_info.t_w = list[texture_id].t_w; - texture_info.t_h = list[texture_id].t_h;; - texture_info.pixels_orig = list[texture_id].pixels_orig; - texture_info.pixels = list[texture_id].pixels; - texture_info.scale_max = list[texture_id].scale_max; - texture_info.texture_image = list[texture_id].texture_image; + texture_info.t_w = list[tex_id].t_w; + texture_info.t_h = list[tex_id].t_h;; + texture_info.pixels_orig = list[tex_id].pixels_orig; + texture_info.pixels = list[tex_id].pixels; + texture_info.scale_max = list[tex_id].scale_max; + texture_info.texture_image = list[tex_id].texture_image; } @@ -601,6 +630,17 @@ (*create_sg)(this->sgroot, property, update_property); } +void +SceneGraph::set_move_collision(move_func new_move) +{ + this->move = new_move; +} + +void +SceneGraph::set_move_collision(collision_func new_collision) +{ + this->collision = new_collision; +} void SceneGraph::set_move_collision(move_func new_move,
--- a/Renderer/Engine/SceneGraph.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/SceneGraph.h Fri Dec 17 00:18:36 2010 +0900 @@ -35,11 +35,11 @@ // とりあえず動かしたいので追加 int seq, seq_rd, resend_flag; + // task 生成用の情報 int property_size; void *propertyptr; int move_id; int coll_id; - PostFunction post_func; memaddr property; memaddr update_property; @@ -92,6 +92,8 @@ SceneGraphPtr clone(void); SceneGraphPtr clone(void *buf); SceneGraphPtr searchSceneGraph(const char *name); + void set_move_collision(move_func new_move); + void set_move_collision(collision_func new_collision); void set_move_collision(move_func new_move, collision_func new_collision); void set_move_collision(move_func new_move, collision_func new_collision, void *sgroot); void set_move_collision(move_func new_move, collision_func new_collision, create_sg_func new_create_sg);
--- a/Renderer/Engine/SceneGraphRoot.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/SceneGraphRoot.cc Fri Dec 17 00:18:36 2010 +0900 @@ -3,12 +3,11 @@ #include <libxml/parser.h> #include "SceneGraphRoot.h" #include "xml.h" -#include "sys.h" +#include "matrix_calc.h" #include "TextureHash.h" #include "texture.h" #include "Application.h" - static int cnt = 0; static const int SGLIST_LENGTH = 138; static int sg_src_size = SGLIST_LENGTH ; @@ -284,14 +283,35 @@ return p; } + void -SceneGraphRoot::speExecute(int screen_w, int screen_h) +SceneGraphRoot::lightCalc() { + int light_num = 4; + for (int i = 0; i < light_num; i++) { + + get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, light[i]->scale, camera->matrix); + + light_vector[i*4] = 0.0f; + light_vector[i*4+1] = 0.0f; + light_vector[i*4+2] = 0.0f; + light_vector[i*4+3] = 1.0f; - SceneGraphPtr list = sg_available_list; - // SceneGraphPtr t = sg_exec_tree; - // SceneGraphPtr cur_parent = camera; + ApplyMatrix(&light_vector[i*4], light[i]->matrix); + + light_vector[i*4] /= light_vector[i*4+2]; + light_vector[i*4+1] /= light_vector[i*4+2]; + /*SIMD演算のため*/ + light_vector[i*4+2] *= -1; + light_vector[i*4+3] *= -1; + + } +} + +void +SceneGraphRoot::flip() +{ // 前フレームで描画した SceneGraph は削除 allRemove(sg_remove_list); @@ -303,65 +323,14 @@ // 現フレームで新しく SceneGraph がコピーされるので初期化 sg_exec_tree = NULL; sg_available_list = NULL; - - camera->move_execute(screen_w, screen_h); - camera->update(screen_w, screen_h); - - camera->children = NULL; - camera->lastChild = NULL; - - list->move_execute(screen_w, screen_h); - list->collision_check(screen_w, screen_h, list); - - list->frame++; - list = list->next; - - if(sg_exec_tree != NULL) { - return; - } - - /*removeのflagをもとにtreeを形成*/ - /* spe から送り返されてきた property の配列を見て生成する for()*/ - /* - for (Property *t = (Property*)app->property[0]; is_end(t); t++){ - SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る - t->scenegraph = s; // property list には SceneGraphへのポインタが入っている - app->scenegraph_connector(property[0], s); // add する - } - */ - - - // 現在、allExecute が終わった時点では - // camera->children が User SceneGraph の root になる - - /** - * NULL じゃなかったら、setSceneData が呼ばれてるから - * そっちを次の Scene にする - */ - - sg_exec_tree = camera->children; } - - void SceneGraphRoot::allExecute(int screen_w, int screen_h) { SceneGraphPtr list = sg_available_list; - SceneGraphPtr t = sg_exec_tree; - SceneGraphPtr cur_parent = camera; - // 前フレームで描画した SceneGraph は削除 - allRemove(sg_remove_list); - - // 前フレームに作られた SceneGraph は描画用に移行 - // 現フレームでの操作は以下の tree,list には適用されない - sg_draw_tree = sg_exec_tree; - sg_remove_list = sg_available_list; - - // 現フレームで新しく SceneGraph がコピーされるので初期化 - sg_exec_tree = NULL; - sg_available_list = NULL; + flip(); camera->move_execute(screen_w, screen_h); camera->update(screen_w, screen_h); @@ -379,44 +348,42 @@ list = list->next; } - int light_num = 4; - for (int i = 0; i < light_num; i++) { - - get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix); - - light_vector[i*4] = 0.0f; - light_vector[i*4+1] = 0.0f; - light_vector[i*4+2] = 0.0f; - light_vector[i*4+3] = 1.0f; + lightCalc(); - ApplyMatrix(&light_vector[i*4], light[i]->matrix); - - light_vector[i*4] /= light_vector[i*4+2]; - light_vector[i*4+1] /= light_vector[i*4+2]; - - /*SIMD演算のため*/ - light_vector[i*4+2] *= -1; - light_vector[i*4+3] *= -1; - - } - - if(sg_exec_tree != NULL) { return; } + copyTree(sg_draw_tree, camera); + + // 現在、allExecute が終わった時点では + // camera->children が User SceneGraph の root になる + + /** + * NULL じゃなかったら、setSceneData が呼ばれてるから + * そっちを次の Scene にする + */ + + sg_exec_tree = camera->children; +} + +void +SceneGraphRoot::copyTree(SceneGraphPtr t, SceneGraphPtr cur_parent) +{ + // SceneGraphPtr t = sg_draw_tree; + /*removeのflagをもとにtreeを形成*/ while (t) { SceneGraphPtr c = NULL; if (!t->isRemoved()) { - c = t->clone(); + c = t->clone(); addNext(c); cur_parent->addChild(c); c->frame = t->frame; /*親の回転、座標から、子の回転、座標を算出*/ - get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix); + get_matrix(c->matrix, c->angle, c->xyz, c->scale, cur_parent->matrix); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ - get_matrix(c->real_matrix, c->angle, c->xyz, cur_parent->real_matrix); + get_matrix(c->real_matrix, c->angle, c->xyz, c->scale, cur_parent->real_matrix); //get_matrix(c->real_matrix, c->angle, c->xyz, camera->real_matrix); } @@ -444,82 +411,8 @@ } } - - - // 現在、allExecute が終わった時点では - // camera->children が User SceneGraph の root になる - - /** - * NULL じゃなかったら、setSceneData が呼ばれてるから - * そっちを次の Scene にする - */ - - sg_exec_tree = camera->children; } -void -SceneGraphRoot::oneExecute(int screen_w, int screen_h) -{ - SceneGraphPtr list = sg_available_list; - //SceneGraphPtr t = sg_exec_tree; - //SceneGraphPtr cur_parent = camera; - - // 前フレームで描画した SceneGraph は削除 - allRemove(sg_remove_list); - - // 前フレームに作られた SceneGraph は描画用に移行 - // 現フレームでの操作は以下の tree,list には適用されない - sg_draw_tree = sg_exec_tree; - sg_remove_list = sg_available_list; - - // 現フレームで新しく SceneGraph がコピーされるので初期化 - sg_exec_tree = NULL; - sg_available_list = NULL; - - camera->move_execute(screen_w, screen_h); - camera->update(screen_w, screen_h); - - camera->children = NULL; - camera->lastChild = NULL; - - /* ここから */ - list->move_execute(screen_w, screen_h); - // ここで move_execute から実行される move_task の処理が終わるまで待ちたい - //while(move_finish_flag == 0) {} - //move_finish_flag = 0; - - list->create_sg_execute(); - - list->collision_check(screen_w, screen_h, list); - /* ここまで exec_task にする */ - - - /* ここから下を exec_task の post_func に*/ - list->frame++; - list = list->next; - - - int light_num = 4; - for (int i = 0; i < light_num; i++) { - - get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix); - - light_vector[i*4] = 0.0f; - light_vector[i*4+1] = 0.0f; - light_vector[i*4+2] = 0.0f; - light_vector[i*4+3] = 1.0f; - - ApplyMatrix(&light_vector[i*4], light[i]->matrix); - - light_vector[i*4] /= light_vector[i*4+2]; - light_vector[i*4+1] /= light_vector[i*4+2]; - - } - - if(sg_exec_tree != NULL) { - return; - } -} /* ExecMove task の post func として呼んでやる @@ -535,7 +428,7 @@ int light_num = 4; for (int i = 0; i < light_num; i++) { - get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix); + get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, light[i]->scale, camera->matrix); light_vector[i*4] = 0.0f; light_vector[i*4+1] = 0.0f; @@ -603,6 +496,37 @@ return sg_exec_tree; } + +void +printSceneGraph(SceneGraphPtr t) +{ + while (t) { + if (!t->isRemoved()) { + if (t->name) printf("name: %s ",t->name); + printf("x=%g y=%g z=%g\n",t->xyz[0],t->xyz[1],t->xyz[2]); + } + if (t->children != NULL) { + t = t->children; + } else if (t->brother != NULL) { + t = t->brother; + } else { + while (t) { + if (t->brother != NULL) { + t = t->brother; + break; + } else { + if (t->parent == NULL) { + t = NULL; + break; + } else { + t = t->parent; + } + } + } + } + } +} + SceneGraphPtr SceneGraphRoot::getDrawSceneGraph() { @@ -723,7 +647,7 @@ } void -SceneGraphRoot::set_game_task(int id, void *property, int size, PostFunction post_func) +SceneGraphRoot::set_gtask_array(int id, void *property, int size, PostFunction post_func) { gtask_array->next_task_array(id); @@ -733,7 +657,7 @@ } void -SceneGraphRoot::set_game_task(int id, void *property, void *pad, int size, PostFunction post_func) +SceneGraphRoot::set_gtask_array(int id, void *property, void *pad, int size, PostFunction post_func) { gtask_array->next_task_array(id); @@ -744,20 +668,40 @@ } void +SceneGraphRoot::set_game_task(int id, void *property, int size) +{ + HTask *task = sgroot->tmanager->create_task(id); + task->set_cpu(SPE_ANY); + task->add_inData(property, size); + task->add_outData(property, size); + task->spawn(); +} + +void +SceneGraphRoot::set_game_task(int id, void *property, void *pad, int size) +{ + HTask *task = sgroot->tmanager->create_task(id); + task->set_cpu(SPE_ANY); + task->add_inData(property, size); + task->add_inData(pad, sizeof(Pad)); + task->add_outData(property, size); + task->spawn(); +} + + +void main_task_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { int size = node->property_size; void *e = node->propertyptr; int move = node->move_id; - PostFunction post_func = node->post_func; + SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_; /* - ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr; - property->root = node; + ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr; + node->xyz[0] = property->x; + node->xyz[1] = property->y; */ - - SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_; - - sgroottmp->set_game_task(move, (void*)e, size, post_func); + sgroottmp->set_game_task(move, (void*)e, size); } void @@ -766,35 +710,32 @@ int size = node->property_size; void *e = node->propertyptr; int move = node->move_id; - PostFunction post_func = node->post_func; -/* - ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr; - property->root = node; -*/ - SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_; void *pad = (void*)sgroottmp->getController(); - sgroottmp->set_game_task(move, (void*)e, pad, size, post_func); +/* + ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr; + property->root = node; + node->xyz[0] = property->x; + node->xyz[1] = property->y; +*/ + + sgroottmp->set_game_task(move, (void*)e, pad, size); } void -SceneGraphRoot::set_move_task(SceneGraphPtr node, int move, void *property, int size, - PostFunction post_func) +SceneGraphRoot::set_move_task(SceneGraphPtr node, int move, void *property, int size) { node->move = main_task_move; - node->post_func = post_func; node->move_id = move; node->propertyptr = property; node->property_size = size; } void -SceneGraphRoot::set_pad_task(SceneGraphPtr node, int move, void *property, int size, - PostFunction post_func) +SceneGraphRoot::set_pad_task(SceneGraphPtr node, int move, void *property, int size) { node->move = pad_task_move; - node->post_func = post_func; node->move_id = move; node->propertyptr = property; node->property_size = size;
--- a/Renderer/Engine/SceneGraphRoot.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/SceneGraphRoot.h Fri Dec 17 00:18:36 2010 +0900 @@ -112,14 +112,20 @@ void task_array_init(int id, int task_num, int param, int inData_num, int outData_num); void create_task_array(); void task_array_finish(); - void set_game_task(int id, void *property, int size, PostFunction post_func); - void set_game_task(int id, void *property, void* pad, int size, PostFunction post_func); - void set_move_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func); - void set_pad_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func); + void set_gtask_array(int id, void *property, int size, PostFunction post_func); + void set_gtask_array(int id, void *property, void* pad, int size, PostFunction post_func); + void set_game_task(int id, void *property, int size); + void set_game_task(int id, void *property, void *pad, int size); + void set_move_task(SceneGraphPtr node, int move, void *property, int size); + void set_pad_task(SceneGraphPtr node, int move, void *property, int size); /* Other System API */ void allExecute(int screen_w, int screen_h); - void oneExecute(int screen_w, int screen_h); + void lightCalc(); + void flip(); + void copyTree(SceneGraphPtr from, SceneGraphPtr to); + + // void oneExecute(int screen_w, int screen_h); void checkRemove(); SceneGraphPtr getExecuteSceneGraph(); SceneGraphPtr getDrawSceneGraph(); @@ -130,8 +136,8 @@ int* getLightSwitch(); int getLightSysSwitch(); - void speExecute(int screen_w, int screen_h); - void speExecute(int screen_w, int screen_h, Application *app); + // void speExecute(int screen_w, int screen_h); + // void speExecute(int screen_w, int screen_h, Application *app); /* System API */ void registSceneGraph(SceneGraphPtr sg);
--- a/Renderer/Engine/SgChange.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/SgChange.cc Fri Dec 17 00:18:36 2010 +0900 @@ -4,7 +4,7 @@ #include "SceneGraph.h" #include "SceneGraphRoot.h" #include "scene_graph_pack.h" -#include "sys.h" +#include "matrix_calc.h" #include "Func.h" #include "error.h" #include "TaskManager.h"
--- a/Renderer/Engine/TextureHash.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/TextureHash.h Fri Dec 17 00:18:36 2010 +0900 @@ -16,6 +16,7 @@ ~TextureHash(void); int hash_function(const char* image_name); int hash_regist(const char* image_name, int &tx_id); + void remove(int id) { table[id].tx_id = -1; } }; #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/matrix.cc Fri Dec 17 00:18:36 2010 +0900 @@ -0,0 +1,160 @@ +#include "matrix.h" + +// 完全にMac仕様。。sg_matrix を allocate してやらないといけないよ。 +float* +copy_matrix(SceneGraphPtr sg, TaskManager *manager) { + + float *matrix = sg->matrix; + float *real_matrix = sg->real_matrix; + + //変換行列は4x4 なんで、16。が二つで32.と言い訳を書いてみる。 + float *sg_matrix = (float*)manager->allocate(sizeof(float)*32); + + for (int i = 0; i < 16; i++) { + sg_matrix[i] = matrix[i]; + sg_matrix[i+16] = real_matrix[i]; + } + + return sg_matrix; + +} + +void +print_matrix(float *matrix) { + + for (int i = 0; i < 32; i++) { + printf("%f\n",matrix[i]); + } + +} + +void +add_matrix_list(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) { + + MatrixList *matrix_list = (MatrixList*)manager->allocate(sizeof(MatrixList)); + +#if SPE_CREATE_POLYGON_CHECK + print_matrix(sg->sg_matrix); +#endif + + matrix_list->matrix = copy_matrix(sg, manager);; + matrix_list->next = NULL; + + + if (info->last != NULL) { + info->last->next = matrix_list; + } + + info->last = matrix_list; + info->list_length += 1; + +} + +void +new_matrix_info(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) { + + MatrixListInfo *next = NULL; + + if (info->id == -1) { + + info->id = sg->sgid; + info->list_length = 1; + info->coord_pack = sg->coord_pack; + info->coord_pack_size = sg->coord_pack_size; + next = info; + + } else { + + MatrixListInfo* t; + + for (t = info; t->next != NULL; t = t->next) { + } + + next = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo)); + next->id = sg->sgid; + next->list_length = 1; + next->coord_pack = sg->coord_pack; + next->coord_pack_size = sg->coord_pack_size; + next->next = NULL; + t->next = next; + + } + + MatrixList *new_list = (MatrixList*)manager->allocate(sizeof(MatrixList)); + new_list->matrix = copy_matrix(sg, manager); + +#if SPE_CREATE_POLYGON_CHECK + print_matrix(sg->sg_matrix); +#endif + + new_list->next = NULL; + + next->first = new_list; + next->last = new_list; + +} + +void +collect_matrix(SceneGraphPtr sg, MatrixListInfo *matrix_info, TaskManager *manager) { + + matrix_info->id = -1; + matrix_info->list_length = 0; + matrix_info->next = NULL; + matrix_info->first = NULL; + matrix_info->last = NULL; + + while (sg) { + + if (sg->flag_drawable) { + + int flag = 0; + + for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) { + if (sg->sgid == t->id) { + add_matrix_list(sg, manager, t); + flag = 1; + } + } + + if (flag != 1) { + new_matrix_info(sg, manager, matrix_info); + } + + // search SceneGraph. でも、ただのリストがあったハズだから、あとでそれに直す。はず・・ + if (sg->children != NULL) { + sg = sg->children; + } else if (sg->brother != NULL) { + sg = sg->brother; + } else { + while (sg) { + if (sg->brother != NULL) { + sg = sg->brother; + break; + } else { + if (sg->parent == NULL) { + sg = NULL; + break; + } else { + sg = sg->parent; + } + } + } + } + } + } +} + +void +check_matrix(MatrixListInfo *matrix_info,SceneGraphPtr sg) { + + for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) { + for (MatrixList* u = t->first; u != NULL; u = u->next) { + print_matrix(u->matrix); + } + } + +} + + + +/* end */
--- a/Renderer/Engine/matrix.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/matrix.h Fri Dec 17 00:18:36 2010 +0900 @@ -1,6 +1,9 @@ #ifndef INCLUDED_MATRIX #define INCLUDED_MATRIX +#include "TaskManager.h" +#include "SceneGraphRoot.h" + struct MatrixList { float *matrix; MatrixList *next; @@ -17,4 +20,22 @@ MatrixListInfo *next; }; + +extern float* copy_matrix(SceneGraphPtr sg, TaskManager *manager) ; + +extern void print_matrix(float *matrix) ; + + +extern void add_matrix_list(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) ; + + +extern void new_matrix_info(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) ; + + +extern void collect_matrix(SceneGraphPtr sg, MatrixListInfo *matrix_info, TaskManager *manager) ; + + +extern void check_matrix(MatrixListInfo *matrix_info,SceneGraphPtr sg) ; + #endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/matrix_calc.cc Fri Dec 17 00:18:36 2010 +0900 @@ -0,0 +1,285 @@ +#include <stdlib.h> +#include <iostream> +#include <string.h> +#include <math.h> +#include "matrix_calc.h" +using namespace std; + +void noMoreMemory() +{ + cout << "can't allocate memory\n"; + exit(1); +} + +void +transMatrix(float *m0, float *m1, float *v) +{ + memcpy(m0, m1, sizeof(float)*16); + + m0[12] = m1[12] + v[0]; + m0[13] = m1[13] + v[1]; + m0[14] = m1[14] + v[2]; + m0[15] = m1[15] + v[3]; +} + +void +unitMatrix(float *m) +{ + bzero(m, sizeof(float)*16); + + m[0] = 1.0f; + m[5] = 1.0f; + m[10] = 1.0f; + m[15] = 1.0f; +} + +void +inversMatrix(float *m0, float *m1) +{ + float m[16]; + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + m[i*4+j] = m1[j*4+i]; + } + } + + m[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]); + m[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]); + m[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]); + m[3] = m[7] = m[11] = 0.0f; + m[15] = 1.0f; + + memcpy(m0, m, sizeof(float)*16); +} + +/** + * マトリックス m にベクトル v1 を右から乗算して、v0に与える + * @param[out] v0 output vector (float[4]) + * @param[in] v1 input vector (float[4]) + * @param[in] m matrix (float[16]) + */ +void +applyMatrix(float *v0, float *m, float *v1) +{ + for (int i = 0; i < 4; i++) { + v0[i] = v1[0]*m[i] + v1[1]*m[i+4] + v1[2]*m[i+8] + v1[3]*m[i+12]; + } +} + +/** + * ベクトルの正規化 + * + * @param[out] v0 output vector + * @param[in] v1 input vector + */ +void +normalize(float *v0, float *v1) +{ + float norm, dnorm; + + norm = sqrt(v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]); + if (norm > 0) { + dnorm = 1.0/norm; + v0[0] = v1[0]*dnorm; + v0[1] = v1[1]*dnorm; + v0[2] = v1[2]*dnorm; + v0[3] = v1[3]*dnorm; + } +} + +/** + * ベクトルの減算 v0 = v1 - v2 + */ +void +subVector(float *v0, float *v1, float *v2) +{ + v0[0] = v1[0] - v2[0]; + v0[1] = v1[1] - v2[1]; + v0[2] = v1[2] - v2[2]; + v0[3] = v1[3] - v2[3]; +} + +/** + * ベクトルの外積 v0 = v1 x v2 + */ +void +outerProduct(float *v0, float *v1, float *v2) +{ + v0[0] = v1[1] * v2[2] - v1[2] * v2[1]; + v0[1] = v1[2] * v2[0] - v1[0] * v2[2]; + v0[2] = v1[0] * v2[1] - v1[1] * v2[0]; + v0[3] = 0; +} + +void +transposeMatrix(float *m0, float *m1) +{ + float t[16]; + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + t[i*4+j] = m1[j*4+i]; + } + } + + memcpy(m0, t, sizeof(float)*16); +} + +/** + * ベクトルの内積 f = v0 * v1 + */ +float +innerProduct(float *v0, float *v1) +{ + return (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]); +} + +void matrix4x4(float *xyz, float *xyz1, float *xyz2) //xyz[16] +{ + for(int t=0; t<16; t+=4) + { + for(int i=0; i<4; i++) + { + xyz[t+i] = xyz1[t]*xyz2[i] + xyz1[t+1]*xyz2[4+i] + xyz1[t+2]*xyz2[8+i] + xyz1[t+3]*xyz2[12+i]; + } + } +} + +/** + stack 上の変換行列に、相対的に、rxyz の回転、txyz の平行移動、scale の拡大を + 行ったものを matrix に代入する + */ +void +get_matrix( float *matrix, float *rxyz, float *txyz, float *scale, float *stack) +{ + float radx,rady,radz; + radx = rxyz[0]*3.14/180; + rady = rxyz[1]*3.14/180; + radz = rxyz[2]*3.14/180; + + float sinx = sin(radx); + float cosx = cos(radx); + float siny = sin(rady); + float cosy = cos(rady); + float sinz = sin(radz); + float cosz = cos(radz); + + float m1[16]; + float *m = stack? m1 : matrix; + + /* View Transform */ + m[0] = cosz*cosy+sinz*sinx*siny; + m[1] = sinz*cosx; + m[2] = -cosz*siny+sinz*sinx*cosy; + m[3] = 0; + m[4] = -sinz*cosy+cosz*sinx*siny; + m[5] = cosz*cosx; + m[6] = sinz*siny+cosz*sinx*cosy; + m[7] = 0; + m[8] = cosx*siny; + m[9] = -sinx; + m[10] = cosx*cosy; + m[11] = 0; + m[12] = txyz[0]; + m[13] = txyz[1]; + m[14] = txyz[2]; + m[15] = 1; + + if(stack) + { + matrix4x4(matrix, m, stack); + } + + matrix[0] *= scale[0]; + matrix[1] *= scale[0]; + matrix[2] *= scale[0]; + matrix[4] *= scale[1]; + matrix[5] *= scale[1]; + matrix[6] *= scale[1]; + matrix[8] *= scale[2]; + matrix[9] *= scale[2]; + matrix[10] *= scale[2]; + +} + +void rotate_x(float *xyz, float r) +{ + float rad = r*3.14/180; + + xyz[0] = xyz[0]; + xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad); + xyz[2] = xyz[1]*sin(rad) + xyz[2]*cos(rad); +} + +void rotate_y(float *xyz, float r) +{ + float rad = r*3.14/180; + + xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad); + xyz[1] = xyz[1]; + xyz[2] = -xyz[0]*sin(rad) + xyz[2]*cos(rad); +} + +void rotate_z(float *xyz, float r) +{ + float rad = r*3.14/180; + + xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad); + xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad); + xyz[2] = xyz[2]; +} + +void rotate(float *xyz, float *matrix) +{ + float abc[4]; + abc[0] = xyz[0]; + abc[1] = xyz[1]; + abc[2] = xyz[2]; + abc[3] = xyz[3]; + + for(int i=0; i<4; i++) + { + //xyz[i] = abc[0]*rot[i] + abc[1]*rot[i+4] + abc[2]*rot[i+8] + abc[3]*rot[i+12]; + xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12]; + } +} + + +void translate(float *xyz, float x, float y, float z) +{ + xyz[0] += x; + xyz[1] += y; + xyz[2] += z; +} + +/** + * ベクトルに行列を乗算する + * @param[out] v vector (float[4]) + * @param[in] m matrix (float[16]) + */ +void +ApplyMatrix(float *v, float *m) +{ + float t[4]; + + t[0] = v[0]; + t[1] = v[1]; + t[2] = v[2]; + t[3] = v[3]; + + for (int i = 0; i < 4; i++) { + v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12]; + } +} + +void +ScaleMatrixXYZ(float *m, float x, float y, float z) +{ + for(int i=0;i<3;i++) { + m[i] *= x; + m[i+4] *= y; + m[i+8] *= z; + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/matrix_calc.h Fri Dec 17 00:18:36 2010 +0900 @@ -0,0 +1,29 @@ +#ifndef CR_SYS_H +#define CR_SYS_H + +void noMoreMemory(); +void get_matrix(float *matrix, float *rxyz, float *txyz, float *scale, float *stack); +void rotate_x(float *xyz, float r); +void rotate_y(float *xyz, float r); +void rotate_z(float *xyz, float r); +//void rotate(float *xyz, float *matrix, float *rxyz, float *txyz, float *stack[]); +void rotate(float *xyz, float *matrix); +void translate(float *xyz, float x, float y, float z); +void matrix4x4(float *, float *, float *); + +void normalize(float *v0, float *v1); +void subVector(float *v0, float *v1, float *v2); +void outerProduct(float *v0, float *v1, float *v2); +float innerProduct(float *v0, float *v1); +void applyMatrix(float *v0, float *m, float *v1); +void inversMatrix(float *m0, float *m1); +void transposeMatrix(float *m0, float *m1); +void unitMatrix(float *m); +void transMatrix(float *m0, float *m1, float *v); +void ApplyMatrix(float *v1, float *v2); +void ScaleMatrix(float *m, float v); +void ScaleMatrixXYZ(float *m, float sx,float sy, float sz); +static inline unsigned long align(unsigned long x,unsigned long alig) { return ((x+(alig-1))&~(alig-1)); } + + +#endif
--- a/Renderer/Engine/polygon.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/polygon.cc Fri Dec 17 00:18:36 2010 +0900 @@ -4,7 +4,7 @@ #include <SDL_image.h> #include "polygon.h" #include "xml.h" -#include "sys.h" +#include "matrix_calc.h" #include "triangle.h" #include "vertex.h" #include "Span.h" @@ -14,34 +14,10 @@ #include "viewer_types.h" using namespace std; -//extern int decode(char *cont, char *file_name); -extern int decode(char *cont, FILE *outfile); - Polygon::Polygon(void) { - xyz[0] = 0; - xyz[1] = 0; - xyz[2] = 0; - xyz[3] = 1; - c_xyz[0] = 0; - c_xyz[1] = 0; - c_xyz[2] = 0; - c_xyz[3] = 1; - angle[0] = 0; - angle[1] = 0; - angle[2] = 0; - angle[3] = 1; - - -#if !SPE_CREATE_POLYGON - - for (int i = 0; i < 16; i++) { - matrix[i] = 0; - } - -#endif - + position_init(); } void @@ -59,6 +35,9 @@ angle[1] = 0; angle[2] = 0; angle[3] = 1; + scale[0] = 1; + scale[1] = 1; + scale[2] = 1; #if !SPE_CREATE_POLYGON @@ -71,122 +50,6 @@ } -#if 0 -void Polygon::draw(SceneGraphPack *sgp) -{ - float xyz1[4],xyz2[4],xyz3[4]; - - /***SceneGraphUpdate***/ - //sgp_update(); - for (int i = 0; i < sgp->info.size; i++) { - SceneGraphNode node = sgp->node[i]; - - /***draw***/ - int n,nt; - for(n=0,nt=0; n<node.size*3; n+=9,nt+=6) { - xyz1[0] = node.vertex[n]; - xyz1[1] = node.vertex[n+1]; - xyz1[2] = node.vertex[n+2]*-1; - xyz1[3] = 1; - xyz2[0] = node.vertex[n+3]; - xyz2[1] = node.vertex[n+3+1]; - xyz2[2] = node.vertex[n+3+2]*-1; - xyz2[3] = 1; - xyz3[0] = node.vertex[n+6]; - xyz3[1] = node.vertex[n+6+1]; - xyz3[2] = node.vertex[n+6+2]*-1; - xyz3[3] = 1; - - rotate(xyz1, node.translation); - rotate(xyz2, node.translation); - rotate(xyz3, node.translation); - - Vertex *ver1 = new Vertex(xyz1[0],xyz1[1],xyz1[2],node.texture[nt],node.texture[nt+1]); - Vertex *ver2 = new Vertex(xyz2[0],xyz2[1],xyz2[2],node.texture[nt+2],node.texture[nt+2+1]); - Vertex *ver3 = new Vertex(xyz3[0],xyz3[1],xyz3[2],node.texture[nt+4],node.texture[nt+4+1]); - - Triangle *tri = new Triangle(ver1,ver2,ver3); - Span_c *span = new Span_c(); - span->viewer = viewer; - span->p = this; - span->create_span(tri,texture_image); - delete ver1; - delete ver2; - delete ver3; - delete tri; - delete span; - } - } -} - - -void Polygon::draw(PolygonPack *pp) -{ - for(int n=0; n<pp->info.size; n++) - { - Vertex *ver1 = new Vertex(pp->tri[n].ver1.x,pp->tri[n].ver1.y,pp->tri[n].ver1.z,pp->tri[n].ver1.tex_x,pp->tri[n].ver1.tex_y); - Vertex *ver2 = new Vertex(pp->tri[n].ver2.x,pp->tri[n].ver2.y,pp->tri[n].ver2.z,pp->tri[n].ver2.tex_x,pp->tri[n].ver2.tex_y); - Vertex *ver3 = new Vertex(pp->tri[n].ver3.x,pp->tri[n].ver3.y,pp->tri[n].ver3.z,pp->tri[n].ver3.tex_x,pp->tri[n].ver3.tex_y); - - Triangle *tri = new Triangle(ver1,ver2,ver3); - Span_c *span = new Span_c(); - span->viewer = viewer; - span->p = this; - span->create_span(tri,texture_image); - delete ver1; - delete ver2; - delete ver3; - delete tri; - delete span; - } -} - -void Polygon::draw(SpanPack *sp) -{ - Span *span; - - for (int n = 0; n < sp->info.size; n++) { - span = &sp->span[n]; - - //int x = span->x; - //int y = span->y; - float z = span->start_z; - int end = span->length_x; - float zpos = span->end_z; - float tex1 = span->tex_x1; - float tex2 = span->tex_x2; - float tey1 = span->tex_y1; - float tey2 = span->tex_y2; - Uint32 rgb; - int tex_xpos; - int tex_ypos; - int tex_zpos; - float tex_x, tex_y, tex_z; - - if (end == 1) { - tex_xpos = (int)((span->tex_height-1) * tex1); - tex_ypos = (int)((span->tex_width-1) * tey1); - tex_zpos = (int)z; - rgb = get_rgb(tex_xpos, tex_ypos); - //viewer->write_pixel(x, y, zpos, rgb); - } else { - for (int j = 0; j < end; j++) { - tex_x = tex1*(end-1-j)/(end-1) + tex2*j/(end-1); - tex_y = tey1*(end-1-j)/(end-1) + tey2*j/(end-1); - tex_z = z*(end-1-j)/(end-1) + zpos*j/(end-1); - if (tex_x > 1) tex_x = 1; - if (tex_y > 1) tex_y = 1; - tex_xpos = (int)((span->tex_height-1) * tex_x); - tex_ypos = (int)((span->tex_width-1) * tex_y); - rgb = get_rgb(tex_xpos,tex_ypos); - //viewer->write_pixel(j + x, y, tex_z, rgb); - } - } - } -} - -#endif - void Polygon::pickup_coordinate(char *cont) { @@ -388,38 +251,17 @@ //Uint32 temp, pixel; Uint8 red, green, blue; - fmt = texture_image->format; + fmt = texture_info.texture_image->format; if (tx<0) tx = 0; - if (texture_image->w-1< tx) tx = texture_image->w-1 ; + if (texture_info.texture_image->w-1< tx) tx = texture_info.texture_image->w-1 ; if (ty<0) ty = 0; - if (texture_image->h-1< ty) ty = texture_image->h-1 ; + if (texture_info.texture_image->h-1< ty) ty = texture_info.texture_image->h-1 ; //SDL_LockSurface(texture_image); - char *p = get_pixel(tx,ty,texture_image); -#if 0 - pixel = my_ntohl(*(Uint32*)p); - //printf("pixel = %d\n", pixel); - //printf("pixel %x bpp = %d ",p, fmt->BytesPerPixel); - //SDL_UnlockSurface(texture_image); - - temp = pixel&fmt->Rmask; - temp = temp>>fmt->Rshift; - temp = temp<<fmt->Rloss; - red = (Uint8)temp; - - temp = pixel&fmt->Gmask; - temp = temp>>fmt->Gshift; - temp = temp<<fmt->Gloss; - green = (Uint8)temp; - - temp = pixel&fmt->Bmask; - temp = temp>>fmt->Bshift; - temp = temp<<fmt->Bloss; - blue = (Uint8)temp; -#endif + char *p = get_pixel(tx,ty,texture_info.texture_image); blue = (Uint8) p[0]; green = (Uint8) p[1]; red = (Uint8) p[2];
--- a/Renderer/Engine/polygon.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/polygon.h Fri Dec 17 00:18:36 2010 +0900 @@ -28,9 +28,7 @@ float angle[4]; // angle float c_xyz[4]; // center of rotation float *anim; - int texture_id; //texture id number - - SDL_Surface* texture_image; + float scale[3]; Polygon(void);
--- a/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc Fri Dec 17 00:18:36 2010 +0900 @@ -8,7 +8,7 @@ #include "polygon_pack.h" #include "scene_graph_pack.h" -SchedDefineTask(CreatePolygonFromSceneGraph); +SchedDefineTask1(CreatePolygonFromSceneGraph, createPolygonFromSceneGraph); #define SG_PACK_LOAD 10 #define SG_NODE_LOAD 11 @@ -50,20 +50,61 @@ } static int -run(SchedTask *smanager, void *rbuf, void *wbuf) +createPolygonFromSceneGraph(SchedTask *smanager, void *rbuf, void *wbuf) { float xyz1[4], xyz2[4], xyz3[4]; float normal1[4],normal2[4],normal3[4]; //coord_xyz, coord_tex, normal, matrix, real_matrix を受け取る - float *coord_xyz = (float)smanager->get_inData(0); - float *coord_tex = (float)smanager->get_inData(1); - float *normal = (float)smanager->get_inData(2); - float *matrix = (float)smanager->get_inData(3); - float *real_matrix = (float)smanager->get_inData(4); - TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_inData(5); + float *coord_xyz = (float*)smanager->get_input(rbuf, 0); + float *coord_tex = (float*)smanager->get_input(rbuf, 1); + float *normal = (float*)smanager->get_input(rbuf, 2); + float *matrix = (float*)smanager->get_input(rbuf, 3); + float *real_matrix = (float*)smanager->get_input(rbuf, 4); + uint32 *pixels = (uint32*)smanager->get_input(rbuf, 5); + + int sg_size = (int)smanager->get_param(0); + int width = (int)smanager->get_param(1); + int height = (int)smanager->get_param(2); + int scale_max = (int)smanager->get_param(3); + + // triangle を書き戻す + //TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_output(wbuf, 0); + + PolygonPackPtr pp + = (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack)); + PolygonPackPtr send_pp + = (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack)); + PolygonPackPtr pp_addr = (PolygonPackPtr)smanager->get_param(1); + PolygonPackPtr tmp_pp; + - for (int i = 0; i < sg->size; i += 3) { + for (int i = 0; i < sg_size; i += 3) { + if (pp->info.size >= MAX_SIZE_TRIANGLE) { + PolygonPackPtr next; + + smanager->mainMem_alloc(0, sizeof(PolygonPack)); + smanager->mainMem_wait(); + next = (PolygonPackPtr)smanager->mainMem_get(0); + + pp->next = next; + + tmp_pp = pp; + pp = send_pp; + send_pp = tmp_pp; + + smanager->dma_wait(PP_STORE); + smanager->dma_store(send_pp, (memaddr)pp_addr, + sizeof(PolygonPack), PP_STORE); + + pp_addr = next; + + smanager->dma_wait(PP_LOAD); + smanager->dma_load(pp, (memaddr)pp_addr, + sizeof(PolygonPack), PP_LOAD); + smanager->dma_wait(PP_LOAD); + pp->init(); + } xyz1[0] = coord_xyz[(i+0)*3]; xyz1[1] = coord_xyz[(i+0)*3+1]; @@ -92,6 +133,8 @@ xyz3[0] /= xyz3[2]; xyz3[1] /= xyz3[2]; + TrianglePack *triangle = &pp->tri[pp->info.size++]; + triangle->ver1.x = xyz1[0]; triangle->ver1.y = xyz1[1]; triangle->ver1.z = xyz1[2]; @@ -110,20 +153,20 @@ triangle->ver3.tex_x = coord_tex[(i+2)*3]; triangle->ver3.tex_y = coord_tex[(i+2)*3+1]; - normal1[0] = sg->normal[(i+0)*3]; - normal1[1] = sg->normal[(i+0)*3+1]; - normal1[2] = sg->normal[(i+0)*3+2]*-1.0f; + normal1[0] = normal[(i+0)*3]; + normal1[1] = normal[(i+0)*3+1]; + normal1[2] = normal[(i+0)*3+2]*-1.0f; //normal1[3] = 1.0f; normal1[3] = 0.0f; - normal2[0] = sg->normal[(i+1)*3]; - normal2[1] = sg->normal[(i+1)*3+1]; - normal2[2] = sg->normal[(i+1)*3+2]*-1.0f; + normal2[0] = normal[(i+1)*3]; + normal2[1] = normal[(i+1)*3+1]; + normal2[2] = normal[(i+1)*3+2]*-1.0f; //normal2[3] = 1.0f; normal2[3] = 0.0f; - normal3[0] = sg->normal[(i+2)*3]; - normal3[1] = sg->normal[(i+2)*3+1]; + normal3[0] = normal[(i+2)*3]; + normal3[1] = normal[(i+2)*3+1]; normal3[2] = normal[(i+2)*3+2]*-1.0f; //normal3[3] = 1.0f; normal3[3] = 0.0f; @@ -153,10 +196,18 @@ triangle->normal3.y = normal3[1]; triangle->normal3.z = normal3[2]; - triangle->tex_info.addr = sg->texture_info.pixels; - triangle->tex_info.width = sg->texture_info.t_w; - triangle->tex_info.height = sg->texture_info.t_h; - triangle->tex_info.scale_max = sg->texture_info.scale_max; + triangle->tex_info.addr = pixels; + triangle->tex_info.width = width; + triangle->tex_info.height = height; + triangle->tex_info.scale_max = scale_max; } + smanager->dma_wait(PP_STORE); + smanager->dma_store(pp, (memaddr)pp_addr, + sizeof(PolygonPack), PP_STORE); + smanager->dma_wait(PP_STORE); + + free(pp); + free(send_pp); + return 0; }
--- a/Renderer/Engine/spe/DrawSpan.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/spe/DrawSpan.cc Fri Dec 17 00:18:36 2010 +0900 @@ -1,11 +1,11 @@ #include <stdlib.h> #include <string.h> +#include "polygon_pack.h" #include "DrawSpan.h" -#include "polygon_pack.h" #include "task_texture.h" #include "viewer_types.h" #include "Func.h" -#include "sys.h" +#include "matrix_calc.h" #include "SchedTask.h" #include "Tapestry.h" #include "SpanPack.h" @@ -225,7 +225,7 @@ #endif //完全に透けているか判断 - int flag = (alpha != 0 && normal_z < 0); + int flag = (alpha != 0); int *light_sysswitch = (int*)smanager->global_get(LightSysSwitch); //smanager->printf("sys %d\n",light_sysswitch);
--- a/Renderer/Engine/spe/Makefile Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/spe/Makefile Fri Dec 17 00:18:36 2010 +0900 @@ -5,7 +5,8 @@ TOP = ../$(CERIUM) SRCS_TMP = $(wildcard *.cc) -#SRCS_EXCLUDE = CreatePolygon.cc +SRCS_EXCLUDE = CreatePolygonFromSceneGraph.cc #CreatePolygon.cc +#SRCS_EXCLUDE = CreatePolygon.cc SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/Renderer/Engine/sys.cc Fri Nov 05 22:43:25 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,264 +0,0 @@ -#include <stdlib.h> -#include <iostream> -#include <string.h> -#include <math.h> -#include "sys.h" -using namespace std; - -void noMoreMemory() -{ - cout << "can't allocate memory\n"; - exit(1); -} - -void -transMatrix(float *m0, float *m1, float *v) -{ - memcpy(m0, m1, sizeof(float)*16); - - m0[12] = m1[12] + v[0]; - m0[13] = m1[13] + v[1]; - m0[14] = m1[14] + v[2]; - m0[15] = m1[15] + v[3]; -} - -void -unitMatrix(float *m) -{ - bzero(m, sizeof(float)*16); - - m[0] = 1.0f; - m[5] = 1.0f; - m[10] = 1.0f; - m[15] = 1.0f; -} - -void -inversMatrix(float *m0, float *m1) -{ - float m[16]; - - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - m[i*4+j] = m1[j*4+i]; - } - } - - m[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]); - m[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]); - m[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]); - m[3] = m[7] = m[11] = 0.0f; - m[15] = 1.0f; - - memcpy(m0, m, sizeof(float)*16); -} - -/** - * マトリックス m にベクトル v1 を右から乗算して、v0に与える - * @param[out] v0 output vector (float[4]) - * @param[in] v1 input vector (float[4]) - * @param[in] m matrix (float[16]) - */ -void -applyMatrix(float *v0, float *m, float *v1) -{ - for (int i = 0; i < 4; i++) { - v0[i] = v1[0]*m[i] + v1[1]*m[i+4] + v1[2]*m[i+8] + v1[3]*m[i+12]; - } -} - -/** - * ベクトルの正規化 - * - * @param[out] v0 output vector - * @param[in] v1 input vector - */ -void -normalize(float *v0, float *v1) -{ - float norm, dnorm; - - norm = sqrt(v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]); - if (norm > 0) { - dnorm = 1.0/norm; - v0[0] = v1[0]*dnorm; - v0[1] = v1[1]*dnorm; - v0[2] = v1[2]*dnorm; - v0[3] = v1[3]*dnorm; - } -} - -/** - * ベクトルの減算 v0 = v1 - v2 - */ -void -subVector(float *v0, float *v1, float *v2) -{ - v0[0] = v1[0] - v2[0]; - v0[1] = v1[1] - v2[1]; - v0[2] = v1[2] - v2[2]; - v0[3] = v1[3] - v2[3]; -} - -/** - * ベクトルの外積 v0 = v1 x v2 - */ -void -outerProduct(float *v0, float *v1, float *v2) -{ - v0[0] = v1[1] * v2[2] - v1[2] * v2[1]; - v0[1] = v1[2] * v2[0] - v1[0] * v2[2]; - v0[2] = v1[0] * v2[1] - v1[1] * v2[0]; - v0[3] = 0; -} - -void -transposeMatrix(float *m0, float *m1) -{ - float t[16]; - - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - t[i*4+j] = m1[j*4+i]; - } - } - - memcpy(m0, t, sizeof(float)*16); -} - -/** - * ベクトルの内積 f = v0 * v1 - */ -float -innerProduct(float *v0, float *v1) -{ - return (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]); -} - -void matrix4x4(float *xyz, float *xyz1, float *xyz2) //xyz[16] -{ - for(int t=0; t<16; t+=4) - { - for(int i=0; i<4; i++) - { - xyz[t+i] = xyz1[t]*xyz2[i] + xyz1[t+1]*xyz2[4+i] + xyz1[t+2]*xyz2[8+i] + xyz1[t+3]*xyz2[12+i]; - } - } -} - -void get_matrix( float *matrix, float *rxyz, float *txyz, float *stack) -{ - float radx,rady,radz; - radx = rxyz[0]*3.14/180; - rady = rxyz[1]*3.14/180; - radz = rxyz[2]*3.14/180; - - float sinx = sin(radx); - float cosx = cos(radx); - float siny = sin(rady); - float cosy = cos(rady); - float sinz = sin(radz); - float cosz = cos(radz); - - /* View Transform */ - matrix[0] = cosz*cosy+sinz*sinx*siny; - matrix[1] = sinz*cosx; - matrix[2] = -cosz*siny+sinz*sinx*cosy; - matrix[3] = 0; - matrix[4] = -sinz*cosy+cosz*sinx*siny; - matrix[5] = cosz*cosx; - matrix[6] = sinz*siny+cosz*sinx*cosy; - matrix[7] = 0; - matrix[8] = cosx*siny; - matrix[9] = -sinx; - matrix[10] = cosx*cosy; - matrix[11] = 0; - matrix[12] = txyz[0]; - matrix[13] = txyz[1]; - matrix[14] = txyz[2]; - matrix[15] = 1; - - float m[16]; - - for(int i=0; i<16; i++) - { - m[i] = matrix[i]; - } - - if(stack) - { - matrix4x4(matrix, m, stack); - } - -} - -void rotate_x(float *xyz, float r) -{ - float rad = r*3.14/180; - - xyz[0] = xyz[0]; - xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad); - xyz[2] = xyz[1]*sin(rad) + xyz[2]*cos(rad); -} - -void rotate_y(float *xyz, float r) -{ - float rad = r*3.14/180; - - xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad); - xyz[1] = xyz[1]; - xyz[2] = -xyz[0]*sin(rad) + xyz[2]*cos(rad); -} - -void rotate_z(float *xyz, float r) -{ - float rad = r*3.14/180; - - xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad); - xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad); - xyz[2] = xyz[2]; -} - -void rotate(float *xyz, float *matrix) -{ - float abc[4]; - abc[0] = xyz[0]; - abc[1] = xyz[1]; - abc[2] = xyz[2]; - abc[3] = xyz[3]; - - for(int i=0; i<4; i++) - { - //xyz[i] = abc[0]*rot[i] + abc[1]*rot[i+4] + abc[2]*rot[i+8] + abc[3]*rot[i+12]; - xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12]; - } -} - - -void translate(float *xyz, float x, float y, float z) -{ - xyz[0] += x; - xyz[1] += y; - xyz[2] += z; -} - -/** - * ベクトルに行列を乗算する - * @param[out] v vector (float[4]) - * @param[in] m matrix (float[16]) - */ -void -ApplyMatrix(float *v, float *m) -{ - float t[4]; - - t[0] = v[0]; - t[1] = v[1]; - t[2] = v[2]; - t[3] = v[3]; - - for (int i = 0; i < 4; i++) { - v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12]; - } -} -
--- a/Renderer/Engine/sys.h Fri Nov 05 22:43:25 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -#ifndef CR_SYS_H -#define CR_SYS_H - -void noMoreMemory(); -void get_matrix(float *matrix, float *rxyz, float *txyz, float *stack); -void rotate_x(float *xyz, float r); -void rotate_y(float *xyz, float r); -void rotate_z(float *xyz, float r); -//void rotate(float *xyz, float *matrix, float *rxyz, float *txyz, float *stack[]); -void rotate(float *xyz, float *matrix); -void translate(float *xyz, float x, float y, float z); -void matrix4x4(float *, float *, float *); - -void normalize(float *v0, float *v1); -void subVector(float *v0, float *v1, float *v2); -void outerProduct(float *v0, float *v1, float *v2); -float innerProduct(float *v0, float *v1); -void applyMatrix(float *v0, float *m, float *v1); -void inversMatrix(float *m0, float *m1); -void transposeMatrix(float *m0, float *m1); -void unitMatrix(float *m); -void transMatrix(float *m0, float *m1, float *v); -void ApplyMatrix(float *v1, float *v2); - -#endif
--- a/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc Fri Dec 17 00:18:36 2010 +0900 @@ -34,7 +34,7 @@ v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12]; } } - +#if 0 static void ApplyNormalMatrix(float *v, float *m) { @@ -48,7 +48,7 @@ v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8]; } } - +#endif /** * 行列の積 @@ -186,9 +186,13 @@ //normal3[3] = 1.0f; normal3[3] = 0.0f; - ApplyNormalMatrix(normal1,sg->real_matrix); - ApplyNormalMatrix(normal2,sg->real_matrix); - ApplyNormalMatrix(normal3,sg->real_matrix); + //ApplyNormalMatrix(normal1,sg->real_matrix); + //ApplyNormalMatrix(normal2,sg->real_matrix); + //ApplyNormalMatrix(normal3,sg->real_matrix); + + ApplyMatrix(normal1,sg->real_matrix); + ApplyMatrix(normal2,sg->real_matrix); + ApplyMatrix(normal3,sg->real_matrix); normal1[0] /= normal1[2]; normal1[1] /= normal1[2];
--- a/Renderer/Engine/task/CreateSpan.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/task/CreateSpan.cc Fri Dec 17 00:18:36 2010 +0900 @@ -153,6 +153,7 @@ int base, tex_base; int scale = 1; + if (scale_max==0) return 1; // broken case /** * width と height で、長い方を基準に、 * texture の scale を決める
--- a/Renderer/Engine/task/DrawSpan.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/task/DrawSpan.cc Fri Dec 17 00:18:36 2010 +0900 @@ -5,10 +5,10 @@ #include "task_texture.h" #include "viewer_types.h" #include "Func.h" -#include "sys.h" #include "SchedTask.h" #include "Tapestry.h" #include "SpanPack.h" +#include "matrix_calc.h" #if (__LITTLE_ENDIAN__) #define LITTLEENDIAN 1 @@ -195,28 +195,23 @@ int alpha = color & 0xff000000; #endif - //int *light_sysswitch = (int*)smanager->global_get(LightSysSwitch); - - - /*完全に透けているか判断, 法線ベクトルが奥を向いてるかどうか*/ - int flag = (alpha != 0 && normal_z < 0); - - //printf("light_sysswitch %d\n",light_sysswitch); + + //完全に透けているか判断 + int flag = (alpha != 0); + int *light_sysswitch = (int*)smanager->global_get(LightSysSwitch); + //smanager->printf("sys %d\n",light_sysswitch); - //if ( *light_sysswitch == 1) { - if (flag) { - color = infinity_light_calc(color,normal_x,normal_y,normal_z, - smanager,localx,localy,zpos, - world_x,world_y,world_z); + if ( *light_sysswitch == 1 && flag) { + 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] ; + int *point = &g->linebuf[localy][localx]; *point = color*flag + *point *(1-flag); - - + } /** @@ -266,6 +261,7 @@ tex_ypos = (int)((span->tex_height-1) * tey); if (zpos < g->zRow[localx + (rangex*localy)]) { + if (!span->tex_addr) return -1; // broken case, I'd like to write some thing... tex_addr = getTile(tex_xpos, tex_ypos, span->tex_width, (memaddr)span->tex_addr); tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; @@ -373,6 +369,7 @@ int tex_localx; int tex_localy; + if (!span->tex_addr) continue; // broken case, I'd like to write some thing... tex_addr = getTile(tex_xpos, tex_ypos, span->tex_width, (memaddr)span->tex_addr); tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
--- a/Renderer/Engine/task/create_sgp.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/task/create_sgp.cc Fri Dec 17 00:18:36 2010 +0900 @@ -98,8 +98,8 @@ p->pn = nnpn; //node->tex_addr = t->texture_image->pixels; - p->tex_width = t->texture_image->w; - p->tex_height = t->texture_image->h; + p->tex_width = t->texture_info.texture_image->w; + p->tex_height = t->texture_info.texture_image->h; p = p->next; } while (p);
--- a/Renderer/Engine/task/update_sgp.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/task/update_sgp.cc Fri Dec 17 00:18:36 2010 +0900 @@ -3,7 +3,7 @@ #include <unistd.h> #include <math.h> #include "scene_graph_pack.h" -#include "sys.h" +#include "matrix_calc.h" #include "update_sgp.h" SchedDefineTask(Update_SGP); @@ -16,6 +16,7 @@ SceneGraphPack *_sgp = (SceneGraphPack*)s->get_output(wbuf, 0); //int screen_width = get_param(0); //int screen_height = get_param(1); + float scale[] = {1,1,1}; // 本当はここでやるもんじゃないんだが。。。 for (int i = 0; i < sgp->info.size && i < 3; i++) { @@ -24,11 +25,11 @@ do { if (node->pn != -1) { get_matrix(node->translation, - node->angle, node->obj_pos, + node->angle, node->obj_pos, scale, sgp->node[node->pn].translation); } else { get_matrix(node->translation, - node->angle, node->obj_pos, + node->angle, node->obj_pos, scale, NULL); }
--- a/Renderer/Engine/texture.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/texture.h Fri Dec 17 00:18:36 2010 +0900 @@ -17,7 +17,7 @@ int scale_max; SDL_Surface *texture_image; GLuint gl_tex; - int pad[1]; // 12 + int texture_id; } texture_list, *texture_list_ptr ; // 20 + pad(12) = 32 @@ -31,7 +31,7 @@ int scale_max; void *texture_image; void *gl_tex; - int pad[1]; // 12 + int texture_id; } texture_list, *texture_list_ptr ; // 20 + pad(12) = 32
--- a/Renderer/Engine/viewer.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/viewer.cc Fri Dec 17 00:18:36 2010 +0900 @@ -4,7 +4,7 @@ #include "SceneGraph.h" #include "SceneGraphRoot.h" #include "scene_graph_pack.h" -#include "sys.h" +#include "matrix_calc.h" #include "Func.h" #include "error.h" #include "TaskManager.h" @@ -142,6 +142,7 @@ this_time = 0; frames = 0; + this->app = app; MainLoop *mainloop = app->init(this, this->width, this->height); mainloop->mainLoop(); } @@ -299,6 +300,7 @@ void Viewer::run_loop(HTaskPtr task_next) { + task_next = app->application_task(task_next, this); dev->clear_screen(); bool quit_flg; @@ -312,16 +314,16 @@ dev->clean_pixels(); pixels = dev->flip_screen(pixels); - sgroot->updateControllerState(); - - //TaskArray を使うか使わないか - if (sgroot->gtask_array != NULL) { - sgroot->create_task_array(); - sgroot->allExecute(width, height); - sgroot->task_array_finish(); - } else { - sgroot->allExecute(width, height); + if (app->app_loop(this)) { + //TaskArray を使うか使わないか + if (sgroot->gtask_array != NULL) { + sgroot->create_task_array(); + sgroot->allExecute(width, height); + sgroot->task_array_finish(); + } else { + sgroot->allExecute(width, height); + } } light_xyz_stock = sgroot->getLightVector(); @@ -434,161 +436,6 @@ } -// 完全にMac仕様。。sg_matrix を allocate してやらないといけないよ。 -float* -copy_matrix(SceneGraphPtr sg, TaskManager *manager) { - - float *matrix = sg->matrix; - float *real_matrix = sg->real_matrix; - - //変換行列は4x4 なんで、16。が二つで32.と言い訳を書いてみる。 - float *sg_matrix = (float*)manager->allocate(sizeof(float)*32); - - for (int i = 0; i < 16; i++) { - sg_matrix[i] = matrix[i]; - sg_matrix[i+16] = real_matrix[i]; - } - - return sg_matrix; - -} - -void -print_matrix(float *matrix) { - - for (int i = 0; i < 32; i++) { - printf("%f\n",matrix[i]); - } - -} - -void -add_matrix_list(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) { - - MatrixList *matrix_list = (MatrixList*)manager->allocate(sizeof(MatrixList)); - -#if SPE_CREATE_POLYGON_CHECK - print_matrix(sg->sg_matrix); -#endif - - matrix_list->matrix = copy_matrix(sg, manager);; - matrix_list->next = NULL; - - - if (info->last != NULL) { - info->last->next = matrix_list; - } - - info->last = matrix_list; - info->list_length += 1; - -} - -void -new_matrix_info(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) { - - MatrixListInfo *next = NULL; - - if (info->id == -1) { - - info->id = sg->sgid; - info->list_length = 1; - info->coord_pack = sg->coord_pack; - info->coord_pack_size = sg->coord_pack_size; - next = info; - - } else { - - MatrixListInfo* t; - - for (t = info; t->next != NULL; t = t->next) { - } - - next = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo)); - next->id = sg->sgid; - next->list_length = 1; - next->coord_pack = sg->coord_pack; - next->coord_pack_size = sg->coord_pack_size; - next->next = NULL; - t->next = next; - - } - - MatrixList *new_list = (MatrixList*)manager->allocate(sizeof(MatrixList)); - new_list->matrix = copy_matrix(sg, manager); - -#if SPE_CREATE_POLYGON_CHECK - print_matrix(sg->sg_matrix); -#endif - - new_list->next = NULL; - - next->first = new_list; - next->last = new_list; - -} - -void -collect_matrix(SceneGraphPtr sg, MatrixListInfo *matrix_info, TaskManager *manager) { - - matrix_info->id = -1; - matrix_info->list_length = 0; - matrix_info->next = NULL; - matrix_info->first = NULL; - matrix_info->last = NULL; - - while (sg) { - - if (sg->flag_drawable) { - - int flag = 0; - - for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) { - if (sg->sgid == t->id) { - add_matrix_list(sg, manager, t); - flag = 1; - } - } - - if (flag != 1) { - new_matrix_info(sg, manager, matrix_info); - } - - // search SceneGraph. でも、ただのリストがあったハズだから、あとでそれに直す。はず・・ - if (sg->children != NULL) { - sg = sg->children; - } else if (sg->brother != NULL) { - sg = sg->brother; - } else { - while (sg) { - if (sg->brother != NULL) { - sg = sg->brother; - break; - } else { - if (sg->parent == NULL) { - sg = NULL; - break; - } else { - sg = sg->parent; - } - } - } - } - } - } -} - -void -check_matrix(MatrixListInfo *matrix_info,SceneGraphPtr sg) { - - for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) { - for (MatrixList* u = t->first; u != NULL; u = u->next) { - print_matrix(u->matrix); - } - } - -} - void coord_allocate(int &cur_point, float *coord_pack, int spe_num, @@ -627,12 +474,43 @@ } -void -create_pp_task(SceneGraphPtr sg, TaskManager *manager, int spe_num, HTaskPtr task_next) +/* flag_drawable な Scenegraph の総数を求める */ +int +sg_drawable_num(SceneGraphPtr scenegraph) { + SceneGraphPtr sg = scenegraph; - MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo)); - collect_matrix(sg, matrix_info, manager); + int sg_count = 0; + while (sg) { + if (sg->flag_drawable) { + sg_count++; + } + if (sg->children != NULL) { + sg = sg->children; + } else if (sg->brother != NULL) { + sg = sg->brother; + } else { + while (sg) { + if (sg->brother != NULL) { + sg = sg->brother; + break; + } else { + if (sg->parent == NULL) { + sg = NULL; + break; + } else { + sg = sg->parent; + } + } + } + } + } + return sg_count; +} + +void +create_pp_task(SceneGraphPtr sg, TaskManager *manager, int spe_num, HTaskPtr task_next, SceneGraphRootPtr sgroot) +{ /* * SceneGraph を辿って coord_xyz, coord_tex, normal, matrix, real_matrix 及び、 @@ -640,46 +518,78 @@ * */ - //HTaskPtr phase_wait = manager->create_task(Dummy); - - for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) { + int sg_num = sg_drawable_num(sg); + int sg_division = sg_num / spe_num; + int residue = sg_num % spe_num; - printf("list_length %d \n", t->list_length); + HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); + Task **pptask = (Task**)manager->allocate(sizeof(Task*)*spe_num); + + for (int k = 0; k < spe_num-1; k++) { + task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_division,4,6,1); + pptask[k] = 0; + } + + task_array[spe_num] = manager->create_task_array(CreatePolygonFromSceneGraph, + sg_division+residue,4,6,1); + pptask[spe_num] = 0; - int alloc_size = 16*1024; + int k = 0; - if (t->coord_pack_size < alloc_size) { - alloc_size = t->coord_pack_size; - } - + while (sg) { + if (sg->flag_drawable) { + if(k < spe_num * sg_division) { + k %= spe_num-1; + } else { + k = spe_num; + } + pptask[k] = task_array[k]->next_task_array(CreatePolygonFromSceneGraph,pptask[k]); - int division_num = (t->coord_pack_size + alloc_size - 1) / alloc_size; - int phase_num = (division_num + spe_num -1) / spe_num; - int cur_point = 0; + pptask[k]->set_inData(0, &sg->coord_xyz, sizeof(float)*sg->size); + pptask[k]->set_inData(1, &sg->coord_tex, sizeof(float)*sg->size); + pptask[k]->set_inData(2, &sg->normal , sizeof(float)*sg->size); + pptask[k]->set_inData(3, &sg->matrix , sizeof(float)*16); + pptask[k]->set_inData(4, &sg->real_matrix, sizeof(float)*12); + pptask[k]->set_inData(5, &sg->texture_info.pixels, sizeof(uint32)); // 4 byte - for (int i = 0; i < phase_num; i++) { + // 4 byte * 4 = 16 byte + pptask[k]->set_param(0,(memaddr)sg->size); // 4byte + pptask[k]->set_param(1,(memaddr)sg->texture_info.t_w); + pptask[k]->set_param(2,(memaddr)sg->texture_info.t_h); + pptask[k]->set_param(3,(memaddr)sg->texture_info.scale_max); - HTaskPtr alloc_wait = manager->create_task(Dummy); - coord_allocate(cur_point, t->coord_pack, spe_num, - alloc_size, alloc_wait, manager); - - - for (MatrixList* u = t->first; u != NULL; u = u->next) { - - //HTaskPtr free_wait = manager->create_task(Dummy); - - //phase_wait = manager->create_task(Dummy); - + } + if (sg->children != NULL) { + sg = sg->children; + } else if (sg->brother != NULL) { + sg = sg->brother; + } else { + while (sg) { + if (sg->brother != NULL) { + sg = sg->brother; + break; + } else { + if (sg->parent == NULL) { + sg = NULL; + break; + } else { + sg = sg->parent; + } + } } - - coord_free(spe_num, manager, alloc_wait); - alloc_wait->spawn(); } + k++; } - - printf("-----------------------\n"); - //return create_pp_wait; - + for (int k = 0; k < spe_num; k++) { + task_array[k]->spawn_task_array(pptask[k]->next()); + task_array[k]->set_cpu(SPE_ANY); + task_array[k]->spawn(); + if (sgroot->gtask_array != NULL) { + HTaskPtr game_task_array = sgroot->gtask_array->get_task_array(); + task_array[k]->wait_for(game_task_array); + } + task_next->wait_for(task_array[k]); + } } void @@ -690,16 +600,15 @@ SceneGraphPtr sg = sgroot->getDrawSceneGraph(); - create_pp_task(sg, manager, spe_num, task_next); + create_pp_task(sg, manager, spe_num, task_next, sgroot); #if SPE_CREATE_POLYGON_CHECK check_matrix(matrix_info,sg); #endif - - #else - + //SceneGraphPtr sg = sgroot->getDrawSceneGraph(); + //printf("sg->size = %lld\n", sizeof(pixels)); HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph); // SceneGraph(木構造) -> PolygonPack @@ -724,6 +633,10 @@ int index_start = range*i; int index_end = (index_start + range >= r[spi].spackList_length) ? r[spi].spackList_length : index_start + range; + int starty = index_start*split_screen_h + 1; + int endy = index_end*split_screen_h; + if (starty<=0) starty = 1; + if (endy>height) endy = height; HTaskPtr task_create_sp = manager->create_task(CreateSpan); @@ -739,8 +652,8 @@ * [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); + task_create_sp->set_param(1,starty); + task_create_sp->set_param(2,endy); task_create_sp->add_inData(r[ppi].ppack, sizeof(PolygonPack)); task_create_sp->add_inData(r[spi].spackList_ptr,
--- a/Renderer/Engine/viewer.h Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/viewer.h Fri Dec 17 00:18:36 2010 +0900 @@ -16,6 +16,27 @@ class Application; +typedef struct sg_pp { + //13088 + float *coord_xyz; // (361*3) * 4 + float *coord_tex; + float *normal; + + //8 * 16 + float *matrix; // 4 * 16 + float *real_matrix; // 4 * 12 + uint32 pixels; // addr + + int sg_size; // 4 + int width; // 4 + int height; // 4 + int scale_max; // 4 + + int length; // 4 + int start; // 4 + +} SceneGraph2PolygonPack ; + typedef struct rendering_data { PolygonPack *ppack; SpanPackPtr spackList; @@ -108,21 +129,13 @@ { sgroot->task_array_init(id, task_num, param, inData_num, outData_num); } - void set_game_task(int id, void *property, int size, PostFunction post_func) + void set_move_task(SceneGraphPtr node, int move, void *titlep, int size) { - sgroot->set_game_task(id, property, size, post_func); - } - void set_game_task(int id, void *property, void *pad, int size, PostFunction post_func) - { - sgroot->set_game_task(id, property, pad, size, post_func); + sgroot->set_move_task(node, move, titlep, size); } - void set_move_task(SceneGraphPtr node, int move, void *titlep, int size, PostFunction post_func) + void set_pad_task(SceneGraphPtr node, int move, void *property, int size) { - sgroot->set_move_task(node, move, titlep, size, post_func); - } - void set_pad_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func) - { - sgroot->set_pad_task(node, move, property, size, post_func); + sgroot->set_pad_task(node, move, property, size); } void createFromXMLmemory(SceneGraph * node, char *data, int len)
--- a/Renderer/Engine/viewerGL.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/viewerGL.cc Fri Dec 17 00:18:36 2010 +0900 @@ -15,7 +15,7 @@ v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12]; } } - +#if 0 static void ApplyNormalMatrix(float *v, float *m) { @@ -29,6 +29,7 @@ v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8]; } } +#endif ViewerGL::ViewerGL(TaskManager *m, int b, int w, int h, int _num) { @@ -127,7 +128,8 @@ glLoadIdentity( ); //正射影 - glOrtho( 0.0, width, height, 0.0, OPENGL_PARAM::near, OPENGL_PARAM::far ); + //glOrtho( 0.0, width, height, 0.0, OPENGL_PARAM::near, OPENGL_PARAM::far ); + glOrtho( 0.0, width, height, 0.0, OPENGL_PARAM::far, OPENGL_PARAM::near ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); @@ -145,7 +147,7 @@ glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0); glDepthFunc(GL_LESS); - glShadeModel(GL_SMOOTH); + //glShadeModel(GL_SMOOTH); } void @@ -210,16 +212,19 @@ xyz1[0] = sg->coord_xyz[(i+0)*3]; xyz1[1] = sg->coord_xyz[(i+0)*3+1]; xyz1[2] = sg->coord_xyz[(i+0)*3+2]*-1.0f; + //xyz1[2] = sg->coord_xyz[(i+0)*3+2]; xyz1[3] = 1.0f; xyz2[0] = sg->coord_xyz[(i+1)*3]; xyz2[1] = sg->coord_xyz[(i+1)*3+1]; xyz2[2] = sg->coord_xyz[(i+1)*3+2]*-1.0f; + //xyz2[2] = sg->coord_xyz[(i+1)*3+2]; xyz2[3] = 1.0f; xyz3[0] = sg->coord_xyz[(i+2)*3]; xyz3[1] = sg->coord_xyz[(i+2)*3+1]; xyz3[2] = sg->coord_xyz[(i+2)*3+2]*-1.0f; + //xyz3[2] = sg->coord_xyz[(i+2)*3+2]; xyz3[3] = 1.0f; // sg->matrix = 回転行列*透視変換行列 @@ -227,47 +232,42 @@ ApplyMatrix(xyz2, sg->matrix); ApplyMatrix(xyz3, sg->matrix); + xyz1[0] /= xyz1[2]; xyz1[1] /= xyz1[2]; xyz2[0] /= xyz2[2]; xyz2[1] /= xyz2[2]; xyz3[0] /= xyz3[2]; xyz3[1] /= xyz3[2]; - + tex_xy1[0] = sg->coord_tex[(i+0)*3]; tex_xy1[1] = sg->coord_tex[(i+0)*3+1]; tex_xy2[0] = sg->coord_tex[(i+1)*3]; tex_xy2[1] = sg->coord_tex[(i+1)*3+1]; tex_xy3[0] = sg->coord_tex[(i+2)*3]; tex_xy3[1] = sg->coord_tex[(i+2)*3+1]; - + normal1[0] = sg->normal[(i+0)*3]; normal1[1] = sg->normal[(i+0)*3+1]; normal1[2] = sg->normal[(i+0)*3+2]*-1.0f; + //normal1[2] = sg->normal[(i+0)*3+2]; normal1[3] = 0.0f; normal2[0] = sg->normal[(i+1)*3]; normal2[1] = sg->normal[(i+1)*3+1]; normal2[2] = sg->normal[(i+1)*3+2]*-1.0f; + //normal2[2] = sg->normal[(i+1)*3+2]; normal2[3] = 0.0f; normal3[0] = sg->normal[(i+2)*3]; normal3[1] = sg->normal[(i+2)*3+1]; normal3[2] = sg->normal[(i+2)*3+2]*-1.0f; + //normal3[2] = sg->normal[(i+2)*3+2]; normal3[3] = 0.0f; - ApplyNormalMatrix(normal1,sg->real_matrix); - ApplyNormalMatrix(normal2,sg->real_matrix); - ApplyNormalMatrix(normal3,sg->real_matrix); - - normal1[0] /= normal1[2]; - normal1[1] /= normal1[2]; - - normal2[0] /= normal2[2]; - normal2[1] /= normal2[2]; - - normal3[0] /= normal3[2]; - normal3[1] /= normal3[2]; + ApplyMatrix(normal1,sg->real_matrix); + ApplyMatrix(normal2,sg->real_matrix); + ApplyMatrix(normal3,sg->real_matrix); obj_draw(xyz1, tex_xy1, normal1); obj_draw(xyz2, tex_xy2, normal2); @@ -302,6 +302,8 @@ void ViewerGL::obj_draw(float *xyz, float *tex_xyz, float *normal_xyz) { + + glTexCoord2f(tex_xyz[0], tex_xyz[1]); glVertex3f(xyz[0], xyz[1], xyz[2]); glNormal3f(normal_xyz[0], normal_xyz[1], normal_xyz[2]);
--- a/Renderer/Engine/xml.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Engine/xml.cc Fri Dec 17 00:18:36 2010 +0900 @@ -26,7 +26,7 @@ cont = skip_to_number(cont); if (cont == NULL) return(NULL); - for (;*cont != ' ' && *cont != '\n' && *cont != '\t';cont++) + for (;*cont != ' ' && *cont != '\n' && *cont != '\t' && *cont != ',' ;cont++) { if (*cont == '-') {
--- a/Renderer/Test/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Test/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -14,7 +14,7 @@ %.pb.cc: $(PROTODIR)/%.proto $(PROTO) $(PROTOFLAGS) $< -ALL = spe-main ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum dynamic viewer SgRootChange property_test create_task property_universe chain_old property_chain aquarium network init_aquarium +ALL = spe-main ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum dynamic viewer SgRootChange property_test create_task property_universe chain_old property_chain aquarium network init_aquarium all: $(ALL)
--- a/Renderer/Test/Makefile.def Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Test/Makefile.def Fri Dec 17 00:18:36 2010 +0900 @@ -1,10 +1,10 @@ CERIUM = ../.. -ABIBIT = 32 +ABIBIT = 64 ABI = -m$(ABIBIT) CC = g++ -CFLAGS = -g -Wall $(ABI) -O9 # -O -DDEBUG +CFLAGS = -g -Wall $(ABI) # -O9 # -O -DDEBUG INCLUDE = -I$(CERIUM)/include/TaskManager -I$(CERIUM)/Renderer/Engine -I. -I$(CERIUM)/include/Cerium LIBS = -L$(CERIUM)/TaskManager -L$(CERIUM)/Renderer/Engine $(ABI)
--- a/Renderer/Test/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Test/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -13,7 +13,7 @@ %.pb.cc: $(PROTODIR)/%.proto $(PROTO) $(PROTOFLAGS) $< -ALL = ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum property_test send_linda dynamic writer chain_old SgRootChange viewer aquarium network init_aquarium test_linda +ALL = ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum property_test send_linda dynamic writer chain_old SgRootChange viewer aquarium network init_aquarium test_linda oFLAGS=-g -O2 CFLAGt=-g -O2 @@ -103,6 +103,7 @@ test_linda : $(TEST_LINDA_OBJ) $(CC) -o $@ $? $(LIBS) $(PROTOLIBS) + run: $(TARGET) sudo ./$(TARGET) -width 576 -height 384 -bpp 32
--- a/Renderer/Test/ball_bound.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Test/ball_bound.cc Fri Dec 17 00:18:36 2010 +0900 @@ -81,8 +81,8 @@ static void ball_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { - vy += g * dt; - node->xyz[1] += vy * dt; + vy += g * dt; + node->xyz[1] += vy * dt; // node->xyz[0] += 10.0f; } @@ -95,15 +95,15 @@ ball_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree) { - if (node->xyz[1] > screen_h - ball_radius) { - node->xyz[1] = screen_h - ball_radius; - - vy *= e; - if (vy > -g && vy < 0) { - vy = 0.0; - node->set_move_collision(ball_move_idle, ball_collision_idle); - } - } + if (node->xyz[1] > screen_h - ball_radius) { + node->xyz[1] = screen_h - ball_radius; + + vy *= e; + if (vy > -g && vy < 0) { + vy = 0.0; + node->set_move_collision(ball_move_idle, ball_collision_idle); + } + } } MainLoopPtr
--- a/Renderer/Test/create_task.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Test/create_task.cc Fri Dec 17 00:18:36 2010 +0900 @@ -4,8 +4,8 @@ #include "MainLoop.h" #include "create_task.h" #include "types.h" -#include "Func.h" -#include "sys.h" +#include "MyFunc.h" +#include "matrix_calc.h" #include "SgChange.h" Property *property, *update_property; @@ -58,9 +58,11 @@ node->xyz[1] = update_property->xyz[1]; node->xyz[2] = update_property->xyz[2]; + float scale[] = {1,1,1}; + // get matrix - get_matrix(node->matrix, node->angle, node->xyz, sgroot->camera->matrix); - get_matrix(node->real_matrix, node->angle, node->xyz, sgroot->camera->real_matrix); + get_matrix(node->matrix, node->angle, node->xyz, scale, sgroot->camera->matrix); + get_matrix(node->real_matrix, node->angle, node->xyz, scale, sgroot->camera->real_matrix); sgroot->setSceneData(node);
--- a/Renderer/Test/property_chain.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Test/property_chain.cc Fri Dec 17 00:18:36 2010 +0900 @@ -4,8 +4,8 @@ #include "MainLoop.h" #include "property_chain.h" #include "types.h" -#include "Func.h" -#include "sys.h" +#include "MyFunc.h" +#include "matrix_calc.h" #include "SgChange.h" #define FALSE 0 @@ -101,14 +101,15 @@ for (int j = 0; j < PROPERTY_LENGTH; j++) { p = &update_property[j]; p_node = (SceneGraphPtr)p->node; + float scale[] = {1,1,1}; if (p->have_parent) { SceneGraphPtr parent = (SceneGraphPtr)update_property[p->parent_index].node; parent->addChild(p_node); - get_matrix(p_node->matrix, p_node->angle, p_node->xyz, parent->matrix); - get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, parent->real_matrix); + get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, parent->matrix); + get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, parent->real_matrix); } else { - get_matrix(p_node->matrix, p_node->angle, p_node->xyz, camera->matrix); - get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, camera->real_matrix); + get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, camera->matrix); + get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, camera->real_matrix); } }
--- a/Renderer/Test/property_universe.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/Renderer/Test/property_universe.cc Fri Dec 17 00:18:36 2010 +0900 @@ -4,8 +4,8 @@ #include "MainLoop.h" #include "property_universe.h" #include "types.h" -#include "Func.h" -#include "sys.h" +#include "MyFunc.h" +#include "matrix_calc.h" #include "SgChange.h" static const int PROPERTY_LENGTH = 2; @@ -62,14 +62,15 @@ for (int j = 0; j < PROPERTY_LENGTH; j++) { p = &update_property[j]; p_node = (SceneGraphPtr)p->node; + float scale[] = {1,1,1}; if (p->have_parent) { SceneGraphPtr parent = (SceneGraphPtr)update_property[p->parent_index].node; parent->addChild(p_node); - get_matrix(p_node->matrix, p_node->angle, p_node->xyz, parent->matrix); - get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, parent->real_matrix); + get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, parent->matrix); + get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, parent->real_matrix); } else { - get_matrix(p_node->matrix, p_node->angle, p_node->xyz, camera->matrix); - get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, camera->real_matrix); + get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, camera->matrix); + get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, camera->real_matrix); } }
--- a/SceneGraph/BlenderScript/export_xml.py Fri Nov 05 22:43:25 2010 +0900 +++ b/SceneGraph/BlenderScript/export_xml.py Fri Dec 17 00:18:36 2010 +0900 @@ -1,6 +1,6 @@ #!BPY """Registration info for Blender menus: -Name: 'Libps3 (.xml)' +Name: 'Libps+x (.xml)' Blender: 240 Group: 'Export' Tooltip: 'Export to (.xml) for libps3' @@ -144,7 +144,7 @@ #str = "" file.write("") matrix = obj.getMatrix() - + big = 6 for mindex in range(len(flist)): fl = flist[mindex] if fl != []: @@ -166,9 +166,9 @@ tri_second = vlist[f[1]] tri_third = vlist[f[2]] - file.write("\t\t\t%f %f %f\n" %(tri_first[0][0] + matrix[3][0], tri_first[0][1] + matrix[3][1], tri_first[0][2] + matrix[3][2]) ) - file.write("\t\t\t%f %f %f\n" %(tri_second[0][0] + matrix[3][0], tri_second[0][1] + matrix[3][1], tri_second[0][2] + matrix[3][2]) ) - file.write("\t\t\t%f %f %f\n" %(tri_third[0][0] + matrix[3][0], tri_third[0][1] + matrix[3][1], tri_third[0][2] + matrix[3][2]) ) + file.write("\t\t\t%f %f %f\n" %(big*(tri_first[0][0] + matrix[3][0]), big*(tri_first[0][1] + matrix[3][1]), big*(tri_first[0][2] + matrix[3][2])) ) + file.write("\t\t\t%f %f %f\n" %(big*(tri_second[0][0] + matrix[3][0]), big*(tri_second[0][1] + matrix[3][1]), big*(tri_second[0][2] + matrix[3][2])) ) + file.write("\t\t\t%f %f %f\n" %(big*(tri_third[0][0] + matrix[3][0]), big*(tri_third[0][1] + matrix[3][1]), big*(tri_third[0][2] + matrix[3][2])) ) file.write("\t\t</coordinate>\n") file.write("\t\t<normal>\n") @@ -177,9 +177,9 @@ tri_second = vlist[f[1]] tri_third = vlist[f[2]] - file.write("\t\t\t%f %f %f\n" %(tri_first[1][0], tri_first[1][1], tri_first[1][2]) ) - file.write("\t\t\t%f %f %f\n" %(tri_second[1][0], tri_second[1][1], tri_second[1][2]) ) - file.write("\t\t\t%f %f %f\n" %(tri_third[1][0], tri_third[1][1], tri_third[1][2]) ) + file.write("\t\t\t%f %f %f\n" %(big*(tri_first[1][0]), big*(tri_first[1][1]), big*(tri_first[1][2])) ) + file.write("\t\t\t%f %f %f\n" %(big*(tri_second[1][0]), big*(tri_second[1][1]), big*(tri_second[1][2])) ) + file.write("\t\t\t%f %f %f\n" %(big*(tri_third[1][0]), big*(tri_third[1][1]), big*(tri_third[1][2])) ) file.write("\t\t</normal>\n" ) file.write("\t\t<model>\n" ) @@ -193,28 +193,26 @@ tri_first = vlist[f[0]] tri_second = vlist[f[1]] tri_third = vlist[f[2]] - - file.write("\t\t\t%f %f\n" %(tri_first[2][0], tri_first[2][1]) ) - file.write("\t\t\t%f %f\n" %(tri_second[2][0], tri_second[2][1]) ) - file.write("\t\t\t%f %f\n" %(tri_third[2][0], tri_third[2][1]) ) + file.write("\t\t\t%f %f\n" %(tri_first[2][0], (-1*(tri_first[2][1])+1 ))) + file.write("\t\t\t%f %f\n" %(tri_second[2][0], (-1*(tri_second[2][1])+1 ))) + file.write("\t\t\t%f %f\n" %(tri_third[2][0], (-1*(tri_third[2][1])+1 ))) file.write("\t\t</texture>\n") else: - file.write("\t\t<texture/>\n") - - + file.write("\t\t<texture>\n") + for f in fl: + file.write("\t\t\t0.000000 0.000000\n") + file.write("\t\t\t0.000000 0.000000\n") + file.write("\t\t\t0.000000 0.000000\n") + file.write("\t\t</texture>\n") ### get texture_image and change base64 data texture = mesh.faces[0].image if texture: - file.write(loadTexture(texture)) - + file.write(loadTexture(texture)) else: - file.write("\t\t<image name=\"%s\">\n" %("sample_white.png") ) - - file.write("\t\t\tiVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAAAAADhZOFXAAAAEElEQVQImWP8zwABTAwUMQBJQQEP\n"); - file.write("\t\t\tlYH+agAAAABJRU5ErkJggg==\n"); - + file.write("\t\t<image name=\"%s\">\n" %("dummy.png") ) + file.write("\t\t\tiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVQokWP8/fs3AymAiSTVoxpG\n"); + file.write("\t\t\tNQwpDQAwxQMRlevqcQAAAABJRU5ErkJggg==\n"); file.write("\t\t</image>\n") - #return str vdata = [] @@ -447,8 +445,8 @@ def loadTexture(texture): global images, imageCount name = texture.getName() - if name in images: - return "\t\t<image name=\"" + name + "\"/>\n" + #if name in images: + # return "\t\t<image name=\"" + name + "\"/>\n" out = "\t\t<image name=\"" + name + "\">\n" imageCount += 1 images[name] = imageCount
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SceneGraph/BlenderScript/script_copy.sh Fri Dec 17 00:18:36 2010 +0900 @@ -0,0 +1,3 @@ +#!/bin/sh + +cp $1 /Applications/*blender*/blender.app/Contents/MacOS/.blender/scripts/
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Fri Dec 17 00:18:36 2010 +0900 @@ -22,9 +22,10 @@ } void -CellTaskManagerImpl::init() +CellTaskManagerImpl::init(int spuIdle_) { spe_running = 0; + spuIdle = spuIdle_; // 実行可能な HTask のリスト。 FifoTaskManager と共有される activeTaskQueue = new QueueInfo<HTask>(htaskPool); @@ -107,13 +108,14 @@ { for (int id = 0; id < machineNum; id++) { mail_check(id); - if (!speTaskList[id]->empty()) + if (!speTaskList[id]->empty()) { continue; // まだ、走ってる + } if (! taskListInfo[id]->empty() ) { // SPE に送る TaskList の準備 send_taskList(id); spe_running++; - } + } } } @@ -125,9 +127,25 @@ sendTaskList(); } + +void +CellTaskManagerImpl::debug_check_spe_idle(QueueInfo<HTask> * activeTaskQueue, int spe_running_) +{ + printf("spu_idle! spe_running = %d : activeTaskQueue->length = %d \n" + , spe_running_, activeTaskQueue->length()); + HTask *task = activeTaskQueue->getFirst(); + + do { + printf("task_name = %s ,",ppeManager->get_task_name(task)); + printf("cpu = [%d]", task->cpu_type); + } while ((task = activeTaskQueue->getNext(task)) != 0); + printf("\n"); +} + void CellTaskManagerImpl::run() { +int spu_limit = spuIdle; do { // PPE side ppeManager->poll(); @@ -135,11 +153,14 @@ do { poll(); } while (ppeManager->activeTaskQueue->empty() && spe_running >0 ); + if (spe_running < spu_limit) { + debug_check_spe_idle(ppeManager->activeTaskQueue, spe_running); + } } while (!ppeManager->activeTaskQueue->empty() || - !activeTaskQueue->empty() || - spe_running >0); + !activeTaskQueue->empty() || + spe_running >0); if (!waitTaskQueue->empty()) { - show_dead_lock_info(); + show_dead_lock_info(); } } @@ -301,6 +322,12 @@ } } +void CellTaskManagerImpl::print_arch() +{ + printf("CellTaskManager\n"); +} + + #ifdef __CERIUM_CELL__ TaskManagerImpl*
--- a/TaskManager/Cell/CellTaskManagerImpl.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Fri Dec 17 00:18:36 2010 +0900 @@ -18,10 +18,11 @@ SpeThreads *speThreads; FifoTaskManagerImpl *ppeManager; int spe_running; + int spuIdle; /* functions */ // system - void init(); + void init(int spuIdle); void run(); void poll(); void mail_check(int id); @@ -31,7 +32,8 @@ void show_profile() ; void start_profile() ; void polling(); - + void debug_check_spe_idle(QueueInfo<HTask> * activeTaskQueue, int spe_running_); + void print_arch(); private: void send_taskList(int id); void show_dead_lock_info();
--- a/TaskManager/Cell/spe/CellDmaManager.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Cell/spe/CellDmaManager.cc Fri Dec 17 00:18:36 2010 +0900 @@ -5,8 +5,6 @@ unsigned long long alloc_flag = 0; -// singleton -QueueInfo<MailQueue> *MailPool = new QueueInfo<MailQueue>() ; /** * DMA Load @@ -90,21 +88,22 @@ void CellDmaManager::mail_write_queue(memaddr data) { (this->*start_dmawait_profile)(); + if (0 != spu_readchcnt(SPU_WrOutMbox)) { - if (mail_queue->empty()) { + if (mail_queue->count()) { spu_write_out_mbox((uint32)data); } else { - MailQueuePtr mail = mail_queue->poll(); - spu_write_out_mbox((uint32)mail->data); - mail_queue->free_(mail); - mail = mail_queue->create(); - mail->data = data; - mail_queue->addLast(mail); + + //mail_queue から poll する + spu_write_out_mbox((uint32)mail_queue->recv()); + //mail_queue に加える + mail_queue->send(data); + } } else { - MailQueuePtr mail = mail_queue->create(); - mail->data = data; - mail_queue->addLast(mail); + + mail_queue->send(data); + } (this->*end_dmawait_profile)(&global_mail_time); } @@ -115,31 +114,55 @@ (this->*start_dmawait_profile)(); - while (!mail_queue->empty()) { - MailQueuePtr mail = mail_queue->poll(); - spu_write_out_mbox((uint32)mail->data); - mail_queue->free_(mail); + while (mail_queue->count()) { + + spu_write_out_mbox((uint32)mail_queue->recv()); + } spu_write_out_mbox((uint32)data); - //mail_queue.freePool(); (this->*end_dmawait_profile)(&global_mail_time); + + } memaddr CellDmaManager::mail_read() { + + (this->*start_dmawait_profile)(); memaddr data = (memaddr)spu_read_in_mbox(); + #if 0 if (ABIBIT>32) { data += (spu_read_in_mbox()<<32); } #endif (this->*end_dmawait_profile)(&global_mail_time); + + + return data; } +memaddr CellDmaManager::task_list_mail_read() +{ + + unsigned long long wait = 0; + + (this->*start_dmawait_profile)(); + memaddr data = (memaddr)spu_read_in_mbox(); + (this->*end_dmawait_profile)(&wait); + + task_list_mail_time += wait; + global_mail_time += wait; + + return data; +} + + + void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) { mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, @@ -156,7 +179,7 @@ CellDmaManager::CellDmaManager() { - mail_queue = new QueueInfo<MailQueue>(MailPool); + mail_queue = new MailManager(); stop_profile(); } void @@ -166,6 +189,7 @@ global_mail_time = 0; global_wait_time = 0; task_array_load_time = 0; + task_list_mail_time = 0; start_dmawait_profile = &CellDmaManager::do_start_dmawait_profile; end_dmawait_profile = &CellDmaManager::do_end_dmawait_profile; @@ -186,8 +210,10 @@ void CellDmaManager::do_start_dmawait_profile() { + wait_time = spu_readch(SPU_RdDec); global_busy_time += busy_time - wait_time; + //printf("busy_time = %d, wait_time = %d\n", busy_time, wait_time); spu_writech(SPU_WrDec, 0xffffffff); // Measurement of mainMem_alloc @@ -199,6 +225,7 @@ CellDmaManager::do_end_dmawait_profile(unsigned long long *counter) { wait_time = spu_readch(SPU_RdDec); + //printf("wait_time = %d", wait_time); *counter += 0xffffffff - wait_time; busy_time = wait_time; @@ -225,14 +252,21 @@ global_busy_time+global_wait_time+global_mail_time ))*100.0; + double t = ((double)task_list_mail_time)/((double)( + global_busy_time+global_wait_time+global_mail_time + ))*100.0; + + s->printf("spu%d: busy_time = %lld" " wait_time = %lld(%.3g%%), " " mail_time = %lld(%.3g%%), " - " busy_ratio = %.3g%%" - " array_load_time = %lld\n" + " task_list_mail_time = %lld(%.3g%%), " + " busy_ratio = %.3g%%, " + " array_load_time = %lld, " " mainMem_alloc_time = %lld\n" ,cpu, global_busy_time, - global_wait_time, d, global_mail_time, m, r, + global_wait_time, d, global_mail_time, m, + task_list_mail_time, t, r, task_array_load_time, mainMemalloc_time); @@ -240,6 +274,7 @@ global_mail_time = 0; global_wait_time = 0; task_array_load_time = 0; + task_list_mail_time = 0; mainMemalloc_time = 0; alloc_flag = 0; }
--- a/TaskManager/Cell/spe/CellDmaManager.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Cell/spe/CellDmaManager.h Fri Dec 17 00:18:36 2010 +0900 @@ -4,8 +4,7 @@ #include "base.h" #include "types.h" #include "DmaManager.h" -#include "QueueInfo.h" -#include "MailQueue.h" +#include "MailManager.h" #include <spu_mfcio.h> #include <spu_intrinsics.h> @@ -23,7 +22,6 @@ uint32 size; } __attribute__ ((aligned (DEFAULT_ALIGNMENT))) DmaList, *DmaListPtr; - QueueInfo<MailQueue> *mail_queue; CellDmaManager() ; @@ -31,6 +29,7 @@ unsigned int wait_time, busy_time, alloc_busy_time; unsigned long long global_busy_time, global_wait_time, global_mail_time, mainMemalloc_time; unsigned long long task_array_load_time; + unsigned long long task_list_mail_time; /* functions */ void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask); @@ -49,6 +48,7 @@ void mail_write_queue(memaddr data); void mail_write_finish_list(memaddr data); memaddr mail_read(); + memaddr task_list_mail_read(); void dma_loadList(ListDataPtr list, void *buff, uint32 mask); void dma_storeList(ListDataPtr, void *buff, uint32 mask); @@ -59,6 +59,8 @@ void null_start_dmawait_profile(); void null_end_dmawait_profile(unsigned long long *counter); + MailManagerPtr mail_queue; + /* end */ } ;
--- a/TaskManager/Cell/spe/MailQueue.h Fri Nov 05 22:43:25 2010 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -#ifndef INCLUDED_MAILQUEUE -#define INCLUDED_MAILQUEUE - -class MailQueue { -public: - memaddr data; - MailQueue *next; // 4 byte - MailQueue *prev; // 4 byte - MailQueue *waiter; // 4 byte - - void init() { data = 0; } - void initOnce() {} - void freeOnce() {} - -} ; - -typedef MailQueue* MailQueuePtr; - -#endif
--- a/TaskManager/Cell/spe/SpeTaskManagerImpl.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.cc Fri Dec 17 00:18:36 2010 +0900 @@ -5,7 +5,7 @@ SpeTaskManagerImpl::SpeTaskManagerImpl() {} SpeTaskManagerImpl::~SpeTaskManagerImpl() {} -void SpeTaskManagerImpl::init() {} +void SpeTaskManagerImpl::init(int spuIdle_) {} void SpeTaskManagerImpl::run() {} HTaskPtr SpeTaskManagerImpl::create_task(int cmd) {return 0;} @@ -17,6 +17,8 @@ void SpeTaskManagerImpl::show_profile() {} void SpeTaskManagerImpl::start_profile() {} +void SpeTaskManagerImpl::print_arch() { printf("SpeTaskManagerImpl\n"); } + // Odd TaskManagerImpl::TaskManagerImpl(int i) {}
--- a/TaskManager/Cell/spe/SpeTaskManagerImpl.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.h Fri Dec 17 00:18:36 2010 +0900 @@ -15,7 +15,7 @@ /* functions */ // call by system - void init(); + void init(int spuIdle); void run(); void start_profile(); void show_profile(); @@ -27,6 +27,7 @@ void set_task_cpu(HTaskPtr, CPU_TYPE); void polling() {} void free_htask(HTaskPtr htask) {} + void print_arch(); } ;
--- a/TaskManager/ChangeLog Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/ChangeLog Fri Dec 17 00:18:36 2010 +0900 @@ -1,536 +1,578 @@ +2010-12-10 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + task_list を PPE の main memory において、それを get_segment で取って来る。 + 実行する object は、PPE 側の main memory 上に置く。それを get_segment で + copy して実行する。 + + taskのindata/outdata/get_segment を実際にはコピーしないようにすると良いのだが... + そうすれば、実行時のアドレスが変わらないのでデバッグが容易。 + そういうオプション? いや、get_segment をそういうようにする? + + task_list 上に固定アドレス task かどうかの選択を入れれば良いのか。 + + とりあえず、task_list を get_segment するところから書くのが良さそう。 + + task_list のaddress を SPE にどうやって教えるかと言う問題がある。 + mail かな。 + + tag 使う? argv で渡すってあり? envp で送れるのではないか? + envp はダメだが、argv では渡せるらしい。 + + まず、ppe と spe の task_list を作る API の設計と実装をするべきらしい。 + + Task 側のは無視 (おぉ?!) SPE 側の SchedRegister も不要。 + + get_segment だけでできる? + + PPE側で、 + + TaskRegister(Task ID, 0 file, entry symbol); // PPE fixed task + SpeTaskRegister(Task ID, object file, entry symbol); // SPE dynamic task + SpeTaskRegister(Task ID, 0, entry symbol); // SPE fixed task + + を指定することになる。 PPE 側は自動的に登録される ( -cpu 0 があるから ) + task_list と spu_task_list が同時に初期化される + + object file は、.a でも良い。(良いの?) embed しても良い。 + + と言うことは、今までのように run を使い回しっ手のいうは許されないってこと? + その方が良いでしょう。変更大きいけど。 + + SPE側に固定する Task はどうするの? + 2010-8-7 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - get_segmentのinlineは、その場に static に置いて、default のものを置いておく。 - size のcheckはしない。 - - MemList は廃止。QueueInfo に。 - - Data 領域は、2^n 管理で、move/compaction を行なう。(が、今は書かない) - - とりあえず、SPUのobject管理だが... + get_segmentのinlineは、その場に static に置いて、default のものを置いておく。 + size のcheckはしない。 + + MemList は廃止。QueueInfo に。 + + Data 領域は、2^n 管理で、move/compaction を行なう。(が、今は書かない) + + とりあえず、SPUのobject管理だが... 2010-8-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - Bulk, Simple, basic は一つにするべきだよな。many_task は、sort と言う名前に変えるべき。 + Bulk, Simple, basic は一つにするべきだよな。many_task は、sort と言う名前に変えるべき。 2010-7-31 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - なんと、simple task を SchedTaskManager 経由で作ると、 - PPE task しか作れなくなっていたらしい。それな遅いよ。 - SchedTaskManagerのtask managerがFifoManagerだったのが - 原因。CellTaskManager を使う時には、FifoManagerは消せる? - - その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が - あるらしい。 - - やっぱり、既に終了した task に対して wait for してしまうのが - まずいらしい。自分で HTask をfree してやれば良いわけだが.. + なんと、simple task を SchedTaskManager 経由で作ると、 + PPE task しか作れなくなっていたらしい。それは遅いよ。 + SchedTaskManagerのtask managerがFifoManagerだったのが + 原因。CellTaskManager を使う時には、FifoManagerは消せる? + + その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が + あるらしい。 + + やっぱり、既に終了した task に対して wait for してしまうのが + まずいらしい。自分で HTask をfree してやれば良いわけだが.. 2010-7-30 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - TASK_LIST_MAIL でない方が高速なみたい - sort (many_task) が、とっても遅くなっている + TASK_LIST_MAIL でない方が高速なみたい + sort (many_task) が、とっても遅くなっている 2010-7-24 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - やっぱり、load module のlinkの解決はやらないといけないので、 - 無理に、SchedTaskのAPI全部を virtual にする必要はないらしい。 - spu-gcc spe/ChainCal.o -Wl,-R,spe-main -o tmp.o - と言う形で、link してやれば良い。(ただし、必要なものが参照されている場合) + やっぱり、load module のlinkの解決はやらないといけないので、 + 無理に、SchedTaskのAPI全部を virtual にする必要はないらしい。 + spu-gcc spe/ChainCal.o -Wl,-R,spe-main -o tmp.o + と言う形で、link してやれば良い。(ただし、必要なものが参照されている場合) 2010-7-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SimpleTask のsizeを16の倍数に。そうしないと、Taskのaligmentが16に - ならないので、gcc -O9 で破綻する。 + SimpleTask のsizeを16の倍数に。そうしないと、Taskのaligmentが16に + ならないので、gcc -O9 で破綻する。 2010-7-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。 - SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。 - cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。 + SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。 + SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。 + cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。 2010-5-25 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう - のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、 - check_task_list_finishとかが再帰的に呼びされるのがやっかい。 - - Task 実行ループは Scheduler にpoling routineを登録するのが良さそう。 - post_func は、SchedTask 経由で poling すれば良い。 + PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう + のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、 + check_task_list_finishとかが再帰的に呼びされるのがやっかい。 + + Task 実行ループは Scheduler にpoling routineを登録するのが良さそう。 + post_func は、SchedTask 経由で poling すれば良い。 2010-5-22 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。 - CpuManager みたいなものを用意しないとダメか。 - - HTask から、waitfor/create_task とかは、TaskManager を呼んでいる。 - そのたびに CAS (Check and set) するのはばかげているよな〜 - TaskManager にメールで送る方が良いのではないか。 - - wait_for する Task が既に終了していると、存在しないTaskあるいは、 - 別な Task を wait_for する場合がある。いわゆるゾンビだけど、これは - どうしよう? 生きているかどうかを識別するように id を付けるか? - - どうも、TaskManager.{h,cc} は要らないっぽい。TMmain に渡されるのも - SchedTask である方が自然。 - - TaskListInfo は循環リストなので、SPU/PPU scheduler に渡す前に、 - getLast()->next = 0 する必要がある。freeAll() する前に、直さないと - だめ。getList() みたいなものを用意しても良いが... - - Scheduler のconnector(DMA) / Memory 関連は Scheduler.{h,cc} から - 追い出すべき。connector/memory とかを SchedTask に持たせれば良い。 - そうすると、API追加でScheduelr.{h,cc} / TaskManagerImple とかを修正する - 必要がなくなる。 + CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。 + CpuManager みたいなものを用意しないとダメか。 + + HTask から、waitfor/create_task とかは、TaskManager を呼んでいる。 + そのたびに CAS (Check and set) するのはばかげているよな〜 + TaskManager にメールで送る方が良いのではないか。 + + wait_for する Task が既に終了していると、存在しないTaskあるいは、 + 別な Task を wait_for する場合がある。いわゆるゾンビだけど、これは + どうしよう? 生きているかどうかを識別するように id を付けるか? + + どうも、TaskManager.{h,cc} は要らないっぽい。TMmain に渡されるのも + SchedTask である方が自然。 + + TaskListInfo は循環リストなので、SPU/PPU scheduler に渡す前に、 + getLast()->next = 0 する必要がある。freeAll() する前に、直さないと + だめ。getList() みたいなものを用意しても良いが... + + Scheduler のconnector(DMA) / Memory 関連は Scheduler.{h,cc} から + 追い出すべき。connector/memory とかを SchedTask に持たせれば良い。 + そうすると、API追加でScheduelr.{h,cc} / TaskManagerImple とかを修正する + 必要がなくなる。 2010-5-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - speTaskList_bg は追放するべきだと思われる。(done) - - PPE task はTaskList をすべて実行するまで戻って来ない。 - なので、spe のmail checkが疎かになっている。 - PPE task の実行途中で SPEのmail checkを行なうべき。 - - Fifo/Cell TaskManagerImpl は統一できるのではないか? (done) - - SchedTask は今は各Taskのselfを返しているがTaskListにするべき - spe からのメールはTaskListが空になった時で良い。早めに、 - - PPE Taskを早めに起動する義理はある? あるかも知れない。Quick Reply Property。 - - TaskList もDataSegement化するべきだと思われる。(done) - - Scheduler::task_list もDataSegment化して、メインメモリ上に置く。 + speTaskList_bg は追放するべきだと思われる。(done) + + PPE task はTaskList をすべて実行するまで戻って来ない。 + なので、spe のmail checkが疎かになっている。 + PPE task の実行途中で SPEのmail checkを行なうべき。 + + Fifo/Cell TaskManagerImpl は統一できるのではないか? (done) + + SchedTask は今は各Taskのselfを返しているがTaskListにするべき + spe からのメールはTaskListが空になった時で良い。早めに、 + + PPE Taskを早めに起動する義理はある? あるかも知れない。Quick Reply Property。 + + TaskList もDataSegement化するべきだと思われる。(done) + + Scheduler::task_list もDataSegment化して、メインメモリ上に置く。 2010-4-28 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SchedTaskBase のみにインスタンス変数を書かせて、 - SchedTask*.h には method のみを書かせる。 - そうすると、デバッグが楽だし、object のallocateも楽。(done) - - HTask(list) -> TaskList(array) -> SchedTask - - というcopyだが、SchedTask で最初から作る方が良いのかも。 - それを DataSegment で共有する。 - - SimpleTask のMailを、 - if (mail_is_not_full) send_mail() ; - else if (queue is not full) enqueuue() ; - else wait_mail(); - ってな感じに出来ないの? - - Multi thread にすると、PPEのmail loop が暴走する可能性がある。 - このあたりなんか方法があるはずだが... + SchedTaskBase のみにインスタンス変数を書かせて、 + SchedTask*.h には method のみを書かせる。 + そうすると、デバッグが楽だし、object のallocateも楽。(done) + + HTask(list) -> TaskList(array) -> SchedTask + + というcopyだが、SchedTask で最初から作る方が良いのかも。 + それを DataSegment で共有する。 + + SimpleTask のMailを、 + if (mail_is_not_full) send_mail() ; + else if (queue is not full) enqueuue() ; + else wait_mail(); + ってな感じに出来ないの? + + Multi thread にすると、PPEのmail loop が暴走する可能性がある。 + このあたりなんか方法があるはずだが... 2010-4-24 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - write T3 T2 T1 TL TA0 TA1 - exec T2 T1 TL TA0 TA1 TA2 - read T1 TL TA TA1 TA2 T2 - next T1 TL TA TA1 TA2* T2 - - *のところで終了mailが出てTaskArrayのデータがfreeされてしまうので、よくない - そうならないように、一段TAN(SchedTaskArrayNop)を挟む。 - - write T3 T2 T1 TL TA0 TA1 TA2 TAN% - exec T2 T1 TL TA0 TA1 TA2 TAN T2 - read T1 TL TA TA1 TA2 TAN T2 T3 - next T1 TL TA TA1 TA2 TAN T2 T3 - - %のところで終了mailを送る。T2のreadのところで、TaskArrayのデータはreadbuff上にあるので - 破壊されてしまう。なので、savedTask->task->self の値はTANにコピーして持っていく必要がある + write T3 T2 T1 TL TA0 TA1 + exec T2 T1 TL TA0 TA1 TA2 + read T1 TL TA TA1 TA2 T2 + next T1 TL TA TA1 TA2* T2 + + *のところで終了mailが出てTaskArrayのデータがfreeされてしまうので、よくない + そうならないように、一段TAN(SchedTaskArrayNop)を挟む。 + + write T3 T2 T1 TL TA0 TA1 TA2 TAN% + exec T2 T1 TL TA0 TA1 TA2 TAN T2 + read T1 TL TA TA1 TA2 TAN T2 T3 + next T1 TL TA TA1 TA2 TAN T2 T3 + + %のところで終了mailを送る。T2のreadのところで、TaskArrayのデータはreadbuff上にあるので + 破壊されてしまう。なので、savedTask->task->self の値はTANにコピーして持っていく必要がある 2009-12-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - そうか、TaskList->next は、SPE 側で自分で呼び出しているわけね。 - と言うことは、schdule(list) が終るまでは、mail check に戻って - こない... それだと、ちょっとまずいね。 - - となると、TaskList のfree(clear)のtimingは? schdule から抜けた - 時と言うことになるわけだけど。 - - waitQueue は、実は不要。しかし、終了条件、dead lock detection には - 必要らしい。 + そうか、TaskList->next は、SPE 側で自分で呼び出しているわけね。 + と言うことは、schdule(list) が終るまでは、mail check に戻って + こない... それだと、ちょっとまずいね。 + + となると、TaskList のfree(clear)のtimingは? schdule から抜けた + 時と言うことになるわけだけど。 + + waitQueue は、実は不要。しかし、終了条件、dead lock detection には + 必要らしい。 2009-12-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - CellTaskManagerのTaskList_bg は変だよ。TaskList 自体が - queue なんだから、トップ二つを特別扱いしているだけでしょう。 - - TaskList をread()しているのと同時にnext()されてしまうので、 - next()の中で、TaskList の中身に触るのは良くない。SchedTask - は微妙に大丈夫らしい。TLのdma waitは、write になっていた。 - - TaskArray/TaskArray1 は、TAの中身をnext()で判断しているので、 - これはただしくない。TaskListLoad を間にはさむ手もあるが... - - write T3 T2 T1 TL TA0 ! TL の dma wait - exec T2 T1 TL! TA0 TA1 - read T1 TL* TA TA1 TA2 * TL の dma start - next T1 TL% TA TA1 TA2 % TAの作成判断 - - TaskListLoad をはさむ、安全だけど遅い方法 - - write T3 T2 T1 TLL TL - exec T2 T1 TLL! TL TA0 - read T1 TLL*TL TA0 TA1 - next T1 TLL TL% TA0 TA1 - - なんだけど、pointer の下位ビットで送ると、前者で実行できる。 - next で、TaskList のloadを始めてしまうという手もあるな... - - write T3 T2 T1 TL TA0 ! TL の dma wait - exec T2 T1 TL TA0 TA1 - read T1 TL! TA TA1 TA2 * TL の dma start - next T1* TL% TA TA1 TA2 - - こっっちかな... + CellTaskManagerのTaskList_bg は変だよ。TaskList 自体が + queue なんだから、トップ二つを特別扱いしているだけでしょう。 + + TaskList をread()しているのと同時にnext()されてしまうので、 + next()の中で、TaskList の中身に触るのは良くない。SchedTask + は微妙に大丈夫らしい。TLのdma waitは、write になっていた。 + + TaskArray/TaskArray1 は、TAの中身をnext()で判断しているので、 + これはただしくない。TaskListLoad を間にはさむ手もあるが... + + write T3 T2 T1 TL TA0 ! TL の dma wait + exec T2 T1 TL! TA0 TA1 + read T1 TL* TA TA1 TA2 * TL の dma start + next T1 TL% TA TA1 TA2 % TAの作成判断 + + TaskListLoad をはさむ、安全だけど遅い方法 + + write T3 T2 T1 TLL TL + exec T2 T1 TLL! TL TA0 + read T1 TLL*TL TA0 TA1 + next T1 TLL TL% TA0 TA1 + + なんだけど、pointer の下位ビットで送ると、前者で実行できる。 + next で、TaskList のloadを始めてしまうという手もあるな... + + write T3 T2 T1 TL TA0 ! TL の dma wait + exec T2 T1 TL TA0 TA1 + read T1 TL! TA TA1 TA2 * TL の dma start + next T1* TL% TA TA1 TA2 + + こっっちかな... 2009-12-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SimpleTask の実装が出来たので、TaskArray からは、 - PPU側に詳細な情報を返せる。と言うことは、SPU側から - PPU Task を投入出来る。実装すればだけど。 - - Task 側から書き出し情報を設定するAPIが必要。 - マニュアルも書くか。 - - Down cast をすべてなくしたい。Sched*.cc からは取れました。 - - まだ、いらないものが結構あるらしい... + SimpleTask の実装が出来たので、TaskArray からは、 + PPU側に詳細な情報を返せる。と言うことは、SPU側から + PPU Task を投入出来る。実装すればだけど。 + + Task 側から書き出し情報を設定するAPIが必要。 + マニュアルも書くか。 + + Down cast をすべてなくしたい。Sched*.cc からは取れました。 + + まだ、いらないものが結構あるらしい... 2009-12-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - ようやっと動きました。SIMPLE_TASK でないのとの互換性 - を維持するべきか? 頑張れば出来ると思うけど... - - 方法は二つ。TaskList に無理矢理 Task を詰め込むか、 - 今までのHTaskを、TaskArray に読み変えるか。前者は変更が - 多い。後者は、wait_for が微妙。 - - 前者で実装しました。そのうち落すかも。エラーチェックと、 - エラー処理関数が必要。コメントを書かないと。 + ようやっと動きました。SIMPLE_TASK でないのとの互換性 + を維持するべきか? 頑張れば出来ると思うけど... + + 方法は二つ。TaskList に無理矢理 Task を詰め込むか、 + 今までのHTaskを、TaskArray に読み変えるか。前者は変更が + 多い。後者は、wait_for が微妙。 + + 前者で実装しました。そのうち落すかも。エラーチェックと、 + エラー処理関数が必要。コメントを書かないと。 2009-12-12 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - SchedTask::next で、TaskArray を認識して、そこで、 - SchedTaskArrayLoad を作る。次のSchedTask を用意して、 - SchedTaskArrayLoad にsavedSchedTaskとして引き渡す。 - - SchedTaskArrayLoad::read は、TaskArray をload する。 - SchedTaskArrayLoad::next は、SchedTaskArray を返す。 - この時に、saveedSchedTask を引き継ぐ。 - write/exec は何もしない。(これで、pipe line を空ける) - - SchedTaskArray::read は、List DMA をload する。 - SchedTaskArrayLoad::next は、TaskArray 上のTaskを返す。 - exec/write は、List DMA 対応で動作する。 - もうない場合には、SchedTaskArrayLoad から伝えられた - saveされた SchedTask を返す。mail も送る。 + SchedTask::next で、TaskArray を認識して、そこで、 + SchedTaskArrayLoad を作る。次のSchedTask を用意して、 + SchedTaskArrayLoad にsavedSchedTaskとして引き渡す。 + + SchedTaskArrayLoad::read は、TaskArray をload する。 + SchedTaskArrayLoad::next は、SchedTaskArray を返す。 + この時に、saveedSchedTask を引き継ぐ。 + write/exec は何もしない。(これで、pipe line を空ける) + + SchedTaskArray::read は、List DMA をload する。 + SchedTaskArrayLoad::next は、TaskArray 上のTaskを返す。 + exec/write は、List DMA 対応で動作する。 + もうない場合には、SchedTaskArrayLoad から伝えられた + saveされた SchedTask を返す。mail も送る。 2009-12-7 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - pipeline stageは、loop local だから、instance 変数である必 - 要はない。途中で中断することはない。これを一時変数にして、 - 再帰的にpipeline stage を呼び出せば良いらしい。 - - pipeline stage のtask1に引数で new SchedTaskList を渡すと、 - run()でtask1 = new SchedNop() するよりループ二回ぐらい高速 - になるらしい。が、おそらく、ほとんど影響はない。 - - pipelineで既に走っている次のTaskのreadを停める必要があるら - しい。前もってNopを入れて置く方法もあるが、TaskListの境界が - 問題になる。停めないとパイプラインバッファを新たに取る必要 - があり連鎖的にはまる。 - - writeしている奴もいるしな。スケジューラは一段しかネストしな - いから新しくバッファ取るか? いや、やっぱり許されないか。い - や、取るか。うーん、悩ましい。どうせ、Task list は確保しな - いとだめだから… 再帰しないで、もとのスケジューラで動かした - い - - そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask - を投入して、間に TaskList read が入ってもなんとかなるように - 工夫するのが良いっぽい - - なんか、Renew Task の道を歩んでいる気もするが... + pipeline stageは、loop local だから、instance 変数である必 + 要はない。途中で中断することはない。これを一時変数にして、 + 再帰的にpipeline stage を呼び出せば良いらしい。 + + pipeline stage のtask1に引数で new SchedTaskList を渡すと、 + run()でtask1 = new SchedNop() するよりループ二回ぐらい高速 + になるらしい。が、おそらく、ほとんど影響はない。 + + pipelineで既に走っている次のTaskのreadを停める必要があるら + しい。前もってNopを入れて置く方法もあるが、TaskListの境界が + 問題になる。停めないとパイプラインバッファを新たに取る必要 + があり連鎖的にはまる。 + + writeしている奴もいるしな。スケジューラは一段しかネストしな + いから新しくバッファ取るか? いや、やっぱり許されないか。い + や、取るか。うーん、悩ましい。どうせ、Task list は確保しな + いとだめだから… 再帰しないで、もとのスケジューラで動かした + い + + そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask + を投入して、間に TaskList read が入ってもなんとかなるように + 工夫するのが良いっぽい + + なんか、Renew Task の道を歩んでいる気もするが... 2009-12-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている - かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの - が必要。deubg 用のデータ書き出しツールがいるな。 - - log header - command(16) cpu-id(16) event(32) time(64) - struct debug_log { - uint16 command; - uint16 cpu-id; - uint32 event; - uint32 time; - } - ぐらい? get_segment 使うべきか。連続領域に使える get_segement があると - 良いわけね。write とも言うが。 - - sort で、memcpy しているのは変。read/write buffer をflipしてやると - 良い。両方とも握っているんだから問題ない。ただし、read/write buffer - の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か? - sort ちゃんとは動いているんだよ。 - - word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが - あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに - なっている。PPUネックになっているっぽい。 - - TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを - 用意する感じか。inData/outData の処理も。 + やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている + かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの + が必要。deubg 用のデータ書き出しツールがいるな。 + + log header + command(16) cpu-id(16) event(32) time(64) + struct debug_log { + uint16 command; + uint16 cpu-id; + uint32 event; + uint32 time; + } + ぐらい? get_segment 使うべきか。連続領域に使える get_segement があると + 良いわけね。write とも言うが。 + + sort で、memcpy しているのは変。read/write buffer をflipしてやると + 良い。両方とも握っているんだから問題ない。ただし、read/write buffer + の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か? + sort ちゃんとは動いているんだよ。 + + word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが + あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに + なっている。PPUネックになっているっぽい。 + + TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを + 用意する感じか。inData/outData の処理も。 2009-12-5 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - なんかなぁ。一つの機能を付け加えようとすると、 - - TaskManager/Cell/CellTaskManagerImpl.cc - TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Cell/spe/CellDmaManager.cc - TaskManager/Cell/spe/CellDmaManager.h TaskManager/Cell/spe/ShowTime.cc TaskManager/Cell/spe/ShowTime.h - TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h - TaskManager/Cell/spe/main.cc TaskManager/Fifo/FifoTaskManagerImpl.cc - TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Makefile.cell TaskManager/kernel/ppe/TaskManager.h - TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/DmaManager.h - TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h - TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/SysTasks.h - example/word_count_test/main.cc - - こんなにファイルをいじらないと出来ない。それって、全然、ダメじゃん。 - - なんでかなぁ。 + なんかなぁ。一つの機能を付け加えようとすると、 + + TaskManager/Cell/CellTaskManagerImpl.cc + TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Cell/spe/CellDmaManager.cc + TaskManager/Cell/spe/CellDmaManager.h TaskManager/Cell/spe/ShowTime.cc TaskManager/Cell/spe/ShowTime.h + TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h + TaskManager/Cell/spe/main.cc TaskManager/Fifo/FifoTaskManagerImpl.cc + TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Makefile.cell TaskManager/kernel/ppe/TaskManager.h + TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/DmaManager.h + TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h + TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/SysTasks.h + example/word_count_test/main.cc + + こんなにファイルをいじらないと出来ない。それって、全然、ダメじゃん。 + + なんでかなぁ。 SchedTask -> Scheduler -> Connector TaskManagerImpl -> {CellTaskManager,FifoTaskManager/SpeTaskManager} - を全部、いじる羽目になる。 - SchedTask から system call するより、Task を定義して、 - それを呼び出すって方がましかも。 + を全部、いじる羽目になる。 + SchedTask から system call するより、Task を定義して、 + それを呼び出すって方がましかも。 2009-11-23 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - list.bound は廃止。list element から計算可能。 + list.bound は廃止。list element から計算可能。 2009-11-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - mail_sendQueue の実装がだめ。こういう実装をすると、queue の - 正しさを関数の中に閉じ込められない。なんか、無限リストにな - っているらしい。参照が、渡り歩いているどこかの場所でダメに - なっているらしい。 - - 実際、mail_sendQueue は、free list に置き換わってしまう。 - これまで、これがおかしくならなかった理由は不明。 - - connector に外から手を入れないで、ちゃんとfunction callするべし。 - - わかりました。 - if (list) { - ... - mainScheduler->send_mailList(in_mail_list); - } - out_mail_list = mainScheduler->recv_mailList(); - - としてしまったが、recv_mailList() でなく、send_mailList で、 - mail_sendQueue をクリアしていたので、 - } else { - mainScheduler->send_mailList(in_mail_list); - } - とする必要があったらしい。if (list) を入れたせいで、こうなった。 - でも、当然、recv_mailList() で clear するべき。atomicity の意味でも。 - なので、send_mailList() での clear は必要ない。 + mail_sendQueue の実装がだめ。こういう実装をすると、queue の + 正しさを関数の中に閉じ込められない。なんか、無限リストにな + っているらしい。参照が、渡り歩いているどこかの場所でダメに + なっているらしい。 + + 実際、mail_sendQueue は、free list に置き換わってしまう。 + これまで、これがおかしくならなかった理由は不明。 + + connector に外から手を入れないで、ちゃんとfunction callするべし。 + + わかりました。 + if (list) { + ... + mainScheduler->send_mailList(in_mail_list); + } + out_mail_list = mainScheduler->recv_mailList(); + + としてしまったが、recv_mailList() でなく、send_mailList で、 + mail_sendQueue をクリアしていたので、 + } else { + mainScheduler->send_mailList(in_mail_list); + } + とする必要があったらしい。if (list) を入れたせいで、こうなった。 + でも、当然、recv_mailList() で clear するべき。atomicity の意味でも。 + なので、send_mailList() での clear は必要ない。 2009-11-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - finish_task を全員が待つ設定で、finish_task を終了判定に - 使っている。それだと、すべてのtaskが、finish_task のwait queue - を*必ず*触りにいってしまう。 - - finish_task への待ちを取り除くと、CellTaskManagerImpl::run() - が、 + finish_task を全員が待つ設定で、finish_task を終了判定に + 使っている。それだと、すべてのtaskが、finish_task のwait queue + を*必ず*触りにいってしまう。 + + finish_task への待ちを取り除くと、CellTaskManagerImpl::run() + が、 do { ppeMail = ppeManager->schedule(ppeTaskList); cont: ppeTaskList = mail_check(ppeMail); } while (ppeTaskList); - とかやっているので、ここで抜けてしまう。 - - 要するに、SPUの状態を見て、running がなくなるのを調べるべき - なんだが、SpeTheads は「一つしかない」らしい。spe_running - で、走っているものがあるかどうか見るか? - - Cell だと、MainScheduler と FifoScheduler の二種類の - スケジューラがあるのか。 + とかやっているので、ここで抜けてしまう。 + + 要するに、SPUの状態を見て、running がなくなるのを調べるべき + なんだが、SpeTheads は「一つしかない」らしい。spe_running + で、走っているものがあるかどうか見るか? + + Cell だと、MainScheduler と FifoScheduler の二種類の + スケジューラがあるのか。 MainScheduler --- task list -----> FifoScheduler MainScheduler <-- finish task ---- FifoScheduler - というわけね。 + というわけね。 2009-11-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - List DMAって、32bit address を使っているらしい。それは、ちょっと - ひどいなぁ。 + List DMAって、32bit address を使っているらしい。それは、ちょっと + ひどいなぁ。 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - やっぱり、TaskList の存在が許せない。あったとしても不定長でしょう。 - 無駄なコピーが多すぎる。 + やっぱり、TaskList の存在が許せない。あったとしても不定長でしょう。 + 無駄なコピーが多すぎる。 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - Scheduler / TaskManger / TaskManagerImpl の区別が不明 - HTask は、TaskManagerImpl を持ってる。 - - Scheduler は SchedTask から直接見えないはずだが、SchedTask は、 - Scheduler は知っているが、TaskManager は知らない。これがかなりの - 混乱を生んでいる。 - - SPU上では、TaskManager が存在しないのが原因らしいが、allcoate とかは、 - TaskManager が行うはず。なので、SPU上にもTaskManagerがある方が自然。 - - SchedTask が自分自身で scheduling してしまっているので、Scheduler - には、ほとんど仕事がない。なので、大半の処理を scheduler -> manager - 経由で行うことになる。 + Scheduler / TaskManger / TaskManagerImpl の区別が不明 + HTask は、TaskManagerImpl を持ってる。 + + Scheduler は SchedTask から直接見えないはずだが、SchedTask は、 + Scheduler は知っているが、TaskManager は知らない。これがかなりの + 混乱を生んでいる。 + + SPU上では、TaskManager が存在しないのが原因らしいが、allcoate とかは、 + TaskManager が行うはず。なので、SPU上にもTaskManagerがある方が自然。 + + SchedTask が自分自身で scheduling してしまっているので、Scheduler + には、ほとんど仕事がない。なので、大半の処理を scheduler -> manager + 経由で行うことになる。 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - 要するに、SPE task 側から addOutData できればよい。 - でも、別に、PPE側から計算してもよいはずだけどね。 - そうすれば、renew task は取り外せる。 + 要するに、SPE task 側から addOutData できればよい。 + でも、別に、PPE側から計算してもよいはずだけどね。 + そうすれば、renew task は取り外せる。 SchedDefineTask1(DrawSpanEnd,draw_span_end); - で、名前を指定させておいて、さらに、 - SchedExternTask(DrawSpanEnd); - SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd); - で、新しく名前を要求するのって、なんとかならんの? 読みづらいんだよ。 - DrawSpanEnd を、そのまま使ってもよさそうだけど? - - せっかく、renew task を外したのに、HD crash で失ってしまいました。 - - add_param が順序を持っているのは見づらい。数字で指定する方が合理的。 + で、名前を指定させておいて、さらに、 + SchedExternTask(DrawSpanEnd); + SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd); + で、新しく名前を要求するのって、なんとかならんの? 読みづらいんだよ。 + DrawSpanEnd を、そのまま使ってもよさそうだけど? + + せっかく、renew task を外したのに、HD crash で失ってしまいました。 + + add_param が順序を持っているのは見づらい。数字で指定する方が合理的。 2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - 単純な、rbuf, wbuf + write return size の task のAPI - List DMA の API - 投入 cpu 別の spawn method - Redering 時の内部からの DMA への直接アクセスへの禁止等など - - set_post で登録する関数も、task のrun関数と同じ型にした方が便利そう。 - - SPU側でも配列(TaskList)ではなく、TaskQueue で管理すれば、 - renew task は簡単に実装できる。 - - SchedTask の renew かそうでないかの区別は全部なくす。ex_init とかは、 - なくなるはず。その代わり TaskQueue で管理する。 - - TaskList に inListData/outListData が入っているのは、やはりおかしい。 - もっとコンパクトであるべき。 - - TaskList は、こまめに終了をPPE側へ知らせるのではなく、TaskListの - 書き換えで知らせる方が良い。 - - SPUからPPUへ、create task 出来た方が良い。それはTaskList の書き出し - で行なう。 + 単純な、rbuf, wbuf + write return size の task のAPI + List DMA の API + 投入 cpu 別の spawn method + Redering 時の内部からの DMA への直接アクセスへの禁止等など + + set_post で登録する関数も、task のrun関数と同じ型にした方が便利そう。 + + SPU側でも配列(TaskList)ではなく、TaskQueue で管理すれば、 + renew task は簡単に実装できる。 + + SchedTask の renew かそうでないかの区別は全部なくす。ex_init とかは、 + なくなるはず。その代わり TaskQueue で管理する。 + + TaskList に inListData/outListData が入っているのは、やはりおかしい。 + もっとコンパクトであるべき。 + + TaskList は、こまめに終了をPPE側へ知らせるのではなく、TaskListの + 書き換えで知らせる方が良い。 + + SPUからPPUへ、create task 出来た方が良い。それはTaskList の書き出し + で行なう。 2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - ようやっと直せました。inListData/outListData は別に転送しないで、 - 一緒に転送してしまった方が良い。どうせ、いつも転送しているのだから。 - - word_count が fifo の方が高速なのは、どうにかしてください。 - - Renew Task の addInData は、メインメモリからDMAするので正しいらしい。 - 直し方を間違えた。 - - Task をmemcpyして、TaskList に入れているが、List DMA に直すべき。 - Simple Task を常に起動して、List DMA task は、その中で、Renew Task - として起動するのが良いのでは? そうすれば、Task Load 自体を Task に - 出来る。 - - Renew Task の実行順序が filo になっている。このあたり変なので、 - 修正するべきでしょう。Renew用の TaskList を持てば良いんじゃないか? - task->self の ad-hoc な使い方が泣ける。ひどすぎます。 + ようやっと直せました。inListData/outListData は別に転送しないで、 + 一緒に転送してしまった方が良い。どうせ、いつも転送しているのだから。 + + word_count が fifo の方が高速なのは、どうにかしてください。 + + Renew Task の addInData は、メインメモリからDMAするので正しいらしい。 + 直し方を間違えた。 + + Task をmemcpyして、TaskList に入れているが、List DMA に直すべき。 + Simple Task を常に起動して、List DMA task は、その中で、Renew Task + として起動するのが良いのでは? そうすれば、Task Load 自体を Task に + 出来る。 + + Renew Task の実行順序が filo になっている。このあたり変なので、 + 修正するべきでしょう。Renew用の TaskList を持てば良いんじゃないか? + task->self の ad-hoc な使い方が泣ける。ひどすぎます。 2009-10-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - Task 内の create_task は、SchedTask に対してで、 - PPE 上では、Manager に対してだよね。だから、出来る - ことがかなり異なる。これは、まずいだろ? - - 特に、PPE task に明示的に manager を渡すってのは、 - とっても変。 - - Renew Task の特別扱いが、いろいろ歪めているんだが、 - view.cc で使っているので落せない。 + Task 内の create_task は、SchedTask に対してで、 + PPE 上では、Manager に対してだよね。だから、出来る + ことがかなり異なる。これは、まずいだろ? + + 特に、PPE task に明示的に manager を渡すってのは、 + とっても変。 + + Renew Task の特別扱いが、いろいろ歪めているんだが、 + view.cc で使っているので落せない。 2009-10-05 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - TaskQueue のfree list の管理はシステムで一つであるべき。 - TaskQueue は double linked list が当然らしい。 + TaskQueue のfree list の管理はシステムで一つであるべき。 + TaskQueue は double linked list が当然らしい。 2009-10-02 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT - して、free しているが、これは、抽象化違反。Task で明示的に - DMAするのは禁止。Task 内で、add_outData 出来れば良い。 - - renew が正しいような気がするが... - - Task 内で大域変数は使えない。なので、smanager からallocateする - 必要がある。Task の解放のタイミングではなくて、パイプラインの - タイミングでDMA waitとfreeを行なう必要がある。DrawSpan の場合は、 - add_outData で良いが、内部で allocate/free は行なう必要がある。 - put_segement がパイプライン動作するべきなのか? - - 固定のDMA tagが邪魔。 - - DrawSpan は全般的にダメだな〜 - - でも、その変更は大きいので、とりあえず動くようにしたい。 - - memset 0 は、7.7.3 SL1 Data Cache Range Set to Zero コマンド - つかうべき。SPE側でやっても良い。でも、本来は全面埋まるのが - 普通なのでどうでも良いけど。 + DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT + して、free しているが、これは、抽象化違反。Task で明示的に + DMAするのは禁止。Task 内で、add_outData 出来れば良い。 + + renew が正しいような気がするが... + + Task 内で大域変数は使えない。なので、smanager からallocateする + 必要がある。Task の解放のタイミングではなくて、パイプラインの + タイミングでDMA waitとfreeを行なう必要がある。DrawSpan の場合は、 + add_outData で良いが、内部で allocate/free は行なう必要がある。 + put_segement がパイプライン動作するべきなのか? + + 固定のDMA tagが邪魔。 + + DrawSpan は全般的にダメだな〜 + + でも、その変更は大きいので、とりあえず動くようにしたい。 + + memset 0 は、7.7.3 SL1 Data Cache Range Set to Zero コマンド + つかうべき。SPE側でやっても良い。でも、本来は全面埋まるのが + 普通なのでどうでも良いけど。 2009-08-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - で、MemList/MemHash が TaskManager 側に移ったので、 - これで、code の management を書くことが出来る。 - そうすれば、SPEのメモリの限界をほんと気にする必要がなくなるはず。 - - その前に、get_segment の例題を直さないと。 - - DrawSpanRnew/reboot は使ってないらしい。 - - Tree は、配列にしないでlinkをSPE側からたどるようになっている。 - それは良いのだが、Task 側で dma_wait するような実装は望ましくない。 - この部分も書き直す必要がある。list 構造の SPE上の Iterator を - 実装すれば良い。 - - memory 関係のコードが scheduler の下にあるのは面白くない。 - - Scheduler で実装(__scheduler)に移譲している部分は、headerに - 移した方が良い。 + で、MemList/MemHash が TaskManager 側に移ったので、 + これで、code の management を書くことが出来る。 + そうすれば、SPEのメモリの限界をほんと気にする必要がなくなるはず。 + + その前に、get_segment の例題を直さないと。 + + DrawSpanRnew/reboot は使ってないらしい。 + + Tree は、配列にしないでlinkをSPE側からたどるようになっている。 + それは良いのだが、Task 側で dma_wait するような実装は望ましくない。 + この部分も書き直す必要がある。list 構造の SPE上の Iterator を + 実装すれば良い。 + + memory 関係のコードが scheduler の下にあるのは面白くない。 + + Scheduler で実装(__scheduler)に移譲している部分は、headerに + 移した方が良い。 2009-08-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - うーん、get_segemnt で、dma_wait のtagをなんとかする - 必要があるらしい。get_tag() でなんとかなるけど、 - 他のtag との関係があるかな。 - - 完全に見えなくするべきでしょうけど... 今はいい。 + うーん、get_segemnt で、dma_wait のtagをなんとかする + 必要があるらしい。get_tag() でなんとかなるけど、 + 他のtag との関係があるかな。 + + 完全に見えなくするべきでしょうけど... 今はいい。 2009-08-01 Shinji KONO <kono@ie.u-ryukyu.ac.jp> - MemList は動いたので、今度は TileHash を TaskManager 側に移動する - 必要がある。 - - その後、コードのLRUを書けば、Cerium は一通り出来上がり。 - - TaskManager と Scheduler の関係が一貫してない。複雑すぎる。 + MemList は動いたので、今度は TileHash を TaskManager 側に移動する + 必要がある。 + + その後、コードのLRUを書けば、Cerium は一通り出来上がり。 + + TaskManager と Scheduler の関係が一貫してない。複雑すぎる。 2009-07-24 Kaito TAGANO <tkaito@cr.ie.u-ryukyu.ac.jp> @@ -547,7 +589,7 @@ } class MemList { - MemorySegment* first; + MemorySegment* first; MemorySegment* last; MemList* createMemList(uint32 size, uint32 count); @@ -983,7 +1025,7 @@ --- 記述例 --- printf("the number of available entries = %d\n", - spe_in_mbox_status(spe_ctx)); + spe_in_mbox_status(spe_ctx)); --- 実行結果 --- the number of available entries = 4 @@ -1059,13 +1101,13 @@ 使っているので、SchedTask にそって実行する場合、 __scheduler->dma_load(__inListData, (uint32)__task->inData, - sizeof(ListData), DMA_READ_IN_LIST); + sizeof(ListData), DMA_READ_IN_LIST); __scheduler->dma_load(__outListData, (uint32)__task->outData, - sizeof(ListData), DMA_READ_OUT_LIST); + sizeof(ListData), DMA_READ_OUT_LIST); の代わりに - memcpy(__inListData, __task->inData, sizeof(ListData)); + memcpy(__inListData, __task->inData, sizeof(ListData)); memcpy(__outListData, __task->outData, sizeof(ListData)); free(__task->inData); free(__task->outData); @@ -1088,8 +1130,8 @@ test_cpy(int flag, int *src) { if (flag) { - memcpy(data, src, sizeof(int)*length); - free(src); + memcpy(data, src, sizeof(int)*length); + free(src); } } @@ -1100,13 +1142,13 @@ test_nocpy(int flag, int *src) { if (flag) { - data = src; + data = src; } // この部分を SchedTask::~SchedTask() と // 思ってください if (flag) { - free(data); + free(data); } } @@ -1116,7 +1158,7 @@ flag は 1 or 0 の繰り返しです。 - 実行結果 (1) - :no copy + :no copy SPE time by SPU Decrementer: 0.035500 :copy SPE time by SPU Decrementer: 0.057500 @@ -1141,7 +1183,7 @@ test_nocpy(int flag, int *src) { if (flag) { - data = src; + data = src; } free((void*)(flag*(int)data)); @@ -1213,11 +1255,11 @@ free((TaskListPtr)(__flag_renewTask*(int)(__list))); #else if (__flag_renewTask) { - free(__inListData); - free(__outListData); - free(__list); + free(__inListData); + free(__outListData); + free(__list); } - #endif + #endif こんな感じで、いくつかか if 文を消してみた。 そして、PPE側の main.cc で gettimeofday で計測してみた (各10回) @@ -1332,7 +1374,7 @@ free((void*)(flag_renewTask*(int)(list))); #else if (flag_renewTask) { - free(list); + free(list); } #endif @@ -1611,7 +1653,7 @@ * add (API): set_post - create_task(id, 0); + create_task(id, 0); とかわざわざ 0 付けるのもアレなので、もうそれように @@ -1838,9 +1880,9 @@ 今までは if (spe_out_mbox_read(spe_ctx[speid], &ret, 1) < 0) { - return ret; + return ret; else - return -1; + return -1; とやっていた。これは @@ -1996,7 +2038,7 @@ セマフォの P 動作は、基本的に --------------------- - pthread_mutex_lock(&sem->mutex); + pthread_mutex_lock(&sem->mutex); while(sem->value == 0) { // 資源が無い // 条件付き変数に自分を登録して、ロックを解放して、他の @@ -2166,7 +2208,7 @@ 必要がある。その計算をミスってました。 1 ////////// - <- なぜか書き込まれていない + <- なぜか書き込まれていない ////////// //////////
--- a/TaskManager/Fifo/FifoDmaManager.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Fifo/FifoDmaManager.h Fri Dec 17 00:18:36 2010 +0900 @@ -34,6 +34,7 @@ void mail_write_queue(memaddr data) { mail_queue1->send(data); } void mail_write_finish_list(memaddr data) { mail_queue1->send(data); } memaddr mail_read() { return mail_queue2->recv(); } + memaddr task_list_mail_read() { return mail_queue2->recv(); } void mail_write_from_host(memaddr data) { mail_queue2->send(data); } memaddr mail_read_from_host() { return mail_queue1->recv(); }
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Fri Dec 17 00:18:36 2010 +0900 @@ -30,7 +30,7 @@ * FifoScheduler は PPE 側のスケジューラ */ void -FifoTaskManagerImpl::init() +FifoTaskManagerImpl::init(int spuIdle_) { // TaskManager から呼ばれるので、かなりの部分は初期化されている。 @@ -200,6 +200,12 @@ others->polling(); } +void +FifoTaskManagerImpl::print_arch() +{ + printf("FifoTaskManagerImpl\n"); +} + /** * # # # # # # # # * Abstract Factory Pattern
--- a/TaskManager/Fifo/FifoTaskManagerImpl.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.h Fri Dec 17 00:18:36 2010 +0900 @@ -21,7 +21,7 @@ /* functions */ // call by system - void init(); + void init(int spuIdle); void init(MainScheduler*, TaskManagerImpl*); void poll(); // called from CellTaskManagerImpl void run(); @@ -35,6 +35,8 @@ void set_runTaskList(); void sendTaskList(); + void print_arch(); + // call by user };
--- a/TaskManager/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -17,7 +17,8 @@ $(CELL_SPE_DIR)/Scheduler.cc\ $(CELL_SPE_DIR)/SchedNop.cc \ $(CELL_SPE_DIR)/MemList.cc \ - $(CELL_SPE_DIR)/MemHash.cc + $(CELL_SPE_DIR)/MemHash.cc \ + $(CELL_SPE_DIR)/MailManager.cc CELL_SPE_SCHEDULE_OBJ = $(CELL_SPE_SCHEDULE_SRC:.cc=.o) CELL_SPE_SRCS = \ @@ -60,7 +61,7 @@ $(CELL_SPE_SCHEDULE_SRC): kernel/schedule/*.cc kernel/memory/*.cc kernel/ppe/*.cc cp kernel/schedule/*.cc $(CELL_SPE_DIR)/ cp kernel/memory/*.cc $(CELL_SPE_DIR)/ - cp kernel/ppe/{TaskQueue.cc,Task.cc} $(CELL_SPE_DIR)/ + cp kernel/ppe/{TaskQueue.cc,Task.cc,MailManager.cc} $(CELL_SPE_DIR)/ $(CELL_SPE_OBJS): %.o : %.cc $(SPUCC) $(SPE_CFLAGS) $(INCLUDE) -c $< -o $@
--- a/TaskManager/kernel/main.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/main.cc Fri Dec 17 00:18:36 2010 +0900 @@ -34,17 +34,19 @@ main(int argc, char *argv[]) { int machineNum = 1; - + int speIdle = 0; for (int i = 1; argv[i]; ++i) { if (strcmp(argv[i], "-cpu") == 0) { machineNum = atoi(argv[++i]); } else if (strcmp(argv[i], "-p") == 0) { profile = 1; - } + } else if (strcmp(argv[i], "-speidle") == 0) { + speIdle = atoi(argv[++i]); + } } TaskManager *manager = new TaskManager(machineNum); - manager->init(); + manager->init(speIdle); manager->set_TMend(defaultTMend);
--- a/TaskManager/kernel/ppe/TaskManager.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.cc Fri Dec 17 00:18:36 2010 +0900 @@ -32,10 +32,10 @@ extern TaskManagerImpl* create_impl(int); void -TaskManager::init() +TaskManager::init(int spuIdle) { m_impl = create_impl(machineNum); - m_impl->init(); + m_impl->init(spuIdle); m_impl->systask_init(); }
--- a/TaskManager/kernel/ppe/TaskManager.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.h Fri Dec 17 00:18:36 2010 +0900 @@ -39,7 +39,7 @@ } /* functions */ - void init(); + void init(int spuIdle); void finish(); private:
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Fri Dec 17 00:18:36 2010 +0900 @@ -118,6 +118,58 @@ return ta; } +/* call get_task_name from ppu only */ +const char * +TaskManagerImpl::get_task_name(int cmd) { + if (0 <= cmd && cmd < MAX_TASK_OBJECT) + return task_list[cmd].name; + else + return NULL; +} +const char * +TaskManagerImpl::get_task_name(TaskPtr task) { + return task != NULL ? get_task_name(task->command) : NULL; +} +const char * +TaskManagerImpl::get_task_name(SimpleTaskPtr simple_task) { + return simple_task != NULL ? get_task_name(simple_task->command) : NULL; +} +const char * +TaskManagerImpl::get_task_name(SchedTaskBase *sched_task) { + if (sched_task == NULL) return NULL; + if (sched_task->task != NULL) { + return get_task_name(sched_task->task->command); + } else if (sched_task->atask != NULL) { + return get_task_name(sched_task->atask->command); + } + return NULL; +} +const char * +TaskManagerImpl::get_task_name(HTaskPtr htask) { + return get_task_name(htask, 0); +} +const char * +TaskManagerImpl::get_task_name(HTaskPtr htask, int index) { + if (!htask) return NULL; + switch (htask->command) { + case TaskArray1: + return get_task_name((TaskPtr)htask->rbuf); + break; + case TaskArray: { + HTaskPtr t = htask->next; + for (int i = 0; i < index; i++) { + if (!t->next) return NULL; + t = t->next; + } + return get_task_name(t->command); + break; + } + default: + return get_task_name(htask->command); + } + return NULL; +} + /** * task の依存関係を設定 * master task が終わってから、slave task を実行するように
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Fri Dec 17 00:18:36 2010 +0900 @@ -37,13 +37,14 @@ /* functions */ // system - virtual void init() = 0; + virtual void init(int) = 0; virtual void run() = 0; virtual void start_profile() = 0; virtual void show_profile() = 0; virtual void append_activeTask(HTaskPtr); virtual void append_waitTask(HTaskPtr); virtual void polling() = 0; + virtual void print_arch() = 0; void check_task_finish(HTaskPtr task, QueueInfo<HTask> *wait_queue); void check_task_list_finish(SchedTask *s, TaskListPtr list, QueueInfo<HTask> *wait_queue); @@ -54,10 +55,16 @@ virtual HTaskPtr create_task(int cmd,void *from); virtual HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size,void *from); virtual HTaskPtr create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData,void *from); + const char *get_task_name(int cmd); + const char *get_task_name(TaskPtr task); + const char *get_task_name(SimpleTaskPtr simpletask); + const char *get_task_name(SchedTaskBase *schedtask); + const char *get_task_name(HTaskPtr htask); + const char *get_task_name(HTaskPtr htask, int index); virtual void set_task_depend(HTaskPtr master, HTaskPtr slave); virtual void spawn_task(HTaskPtr); virtual void set_task_cpu(HTaskPtr, CPU_TYPE); - void set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList) ; + void set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList); void free_htask(HTaskPtr htask) { #if !defined(__SPU__)
--- a/TaskManager/kernel/schedule/DmaManager.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/schedule/DmaManager.h Fri Dec 17 00:18:36 2010 +0900 @@ -35,6 +35,7 @@ virtual void mail_write_queue(memaddr data) {} virtual void mail_write_finish_list(memaddr data) {} virtual memaddr mail_read() { return 0; } + virtual memaddr task_list_mail_read() { return 0; } // API for MFC list DMA transfer virtual void dma_loadList(ListDataPtr list, void *,uint32 mask) {}
--- a/TaskManager/kernel/schedule/SchedMail.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedMail.cc Fri Dec 17 00:18:36 2010 +0900 @@ -7,7 +7,7 @@ SchedMail::next(Scheduler *scheduler, SchedTaskBase *p) { - params_addr = scheduler->mail_read(); + params_addr = scheduler->task_list_mail_read(); __debug("[SchedMail:%s]\n", __FUNCTION__);
--- a/TaskManager/kernel/schedule/Scheduler.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Fri Dec 17 00:18:36 2010 +0900 @@ -174,6 +174,12 @@ return connector->mail_read(); } +memaddr +Scheduler::task_list_mail_read() +{ + return connector->task_list_mail_read(); +} + /* @@ -290,17 +296,19 @@ } extern void -register_task(int cmd, TaskObjectRun run) +register_task(int cmd, TaskObjectRun run, const char *str) { task_list[cmd].run = run; task_list[cmd].load = null_loader; task_list[cmd].wait = null_waiter; + task_list[cmd].name = str; } extern void register_dynamic_task(int cmd, memaddr start, int size, - TaskObjectRun run, int entry_offset) + TaskObjectRun run, int entry_offset, + const char *str) { task_list[cmd].run = run; task_list[cmd].location = start; @@ -309,6 +317,7 @@ task_list[cmd].entry_offset = entry_offset; task_list[cmd].load = load_task; task_list[cmd].wait = wait_load; + task_list[cmd].name = str; #if 0 this->printf("cmd = %d\n",cmd); this->printf("locatation = 0x%x\n",start);
--- a/TaskManager/kernel/schedule/Scheduler.h Fri Nov 05 22:43:25 2010 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Fri Dec 17 00:18:36 2010 +0900 @@ -37,6 +37,7 @@ memaddr end; uint32 entry_offset; // offset for create(); MemorySegment *segment; + const char *name; void (*load)(Scheduler *,int); void (*wait)(Scheduler *,int); } __attribute__ ((aligned (DEFAULT_ALIGNMENT))) @@ -126,6 +127,7 @@ void mail_write_queue(memaddr data); void mail_write_finish_list(memaddr data); memaddr mail_read(); + memaddr task_list_mail_read(); void dma_loadList(ListDataPtr list, void *, uint32 mask); void dma_storeList(ListDataPtr list, void *, uint32 mask); @@ -144,10 +146,11 @@ } ; -extern void register_task(int cmd, TaskObjectRun run); +extern void register_task(int cmd, TaskObjectRun run, const char *str); extern void register_dynamic_task(int cmd, memaddr start, int size, TaskObjectRun run, - int entry_offset); + int entry_offset, + const char *str); struct tbl { unsigned int vma; @@ -189,10 +192,10 @@ } #define SchedRegisterTask(cmd, str) \ - register_task(cmd, runTask_##str); + register_task(cmd, runTask_##str, #str); #define SchedRegister(str) \ - register_task(str, runTask_##str); + register_task(str, runTask_##str, #str); #define SchedDefineDynamicTask(str,segment) \ SchedDefineTask(str) @@ -214,7 +217,8 @@ register_dynamic_task(cmd, (memaddr)(_EAR_+_ovly_table[segment].file_offset), \ _ovly_table[segment].size, \ runTask_##str, \ - runTask_##str##_offset); + runTask_##str##_offset, \ + #str); #define SchedRegisterDynamic(str, segment) SchedRegisterDynamicTask(str, str, segment) #else #define SchedRegisterDynamicTask(cmd, str, segment) SchedRegisterTask(cmd, str)
--- a/example/Bulk/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Bulk/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Bulk/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Bulk/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Bulk/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Bulk/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/HelloWorld/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/HelloWorld/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -4,7 +4,7 @@ CFLAGS += -m$(ABIBIT) -D__CERIUM_CELL__ SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/HelloWorld/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/HelloWorld/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/HelloWorld/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/HelloWorld/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/HelloWorld/main.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/example/HelloWorld/main.cc Fri Dec 17 00:18:36 2010 +0900 @@ -7,8 +7,10 @@ extern void task_init(void); static int count = 1; +static int spe_num = 1; extern TaskManager *manager; +int use_task_creater = 0; const char *usr_help_str = "Usage: ./hello [-cpu spe_num] [-count N]\n\ -cpu Number of SPE (default 1) \n\ @@ -20,24 +22,136 @@ for (int i = 1; argv[i]; ++i) { if (strcmp(argv[i], "-count") == 0) { count = atoi(argv[++i]); - } + } else if (strcmp(argv[i], "-cpu") == 0) { + spe_num = atoi(argv[i+1]); + } else if (strcmp(argv[i], "-t") == 0) { + use_task_creater = 1; + } + + } return 0; } + +static void simple_task_creater(int in_total_size, int out_total_size, + int command, int in_data_size, int out_data_size, + void *in_data, void *out_data, TaskManager *manager, + HTask *wait_i, HTask *wait_me) { + + + int in_task_size = 0; + int out_task_size = 0; + + if (in_total_size != 0) { + in_task_size = in_total_size / in_data_size; + if (in_total_size != in_task_size * in_data_size) { + printf("mismatch of in_total_size and in_data_size\n"); + } + } + + if (out_total_size != 0) { + out_task_size = out_total_size / out_data_size; + if (out_total_size != out_task_size * out_data_size) { + printf("mismatch of out_total_size and out_data_size\n"); + } + } + + /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/ + int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size; + + if (task_num == 0) task_num = 1; + + /*spe分あればいいのかな?*/ + + int array_num = spe_num; + if (task_num < array_num) { + array_num = task_num; + } + + + int array_length = task_num / array_num; + int rest = task_num % array_num; + + HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num); + TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_length*array_num); + + int index = 0; + + for (int k = 0; k < array_num; k++) { + + task_array[k] = manager->create_task_array(command,array_length,0,1,1); + t_exec[k] = 0; + + if (wait_me != 0) { + wait_me->wait_for(task_array[k]); + } + if (wait_i != 0) { + task_array[k]->wait_for(wait_i); + } + + } + + for (int j = 0; j < array_length; j++) { + for (int k = 0; k < array_num; k++) { + + t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]); + t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + } + } + + for (int k = 0; k < array_num; k++) { + task_array[k]->spawn_task_array(t_exec[k]->next()); + task_array[k]->set_cpu(SPE_ANY); + task_array[k]->spawn(); + } + + for (int k = 0; k < rest; k++) { + HTaskPtr t_exec = manager->create_task(command); + + t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + if (wait_me != 0) { + wait_me->wait_for(t_exec); + } + if (wait_i != 0) { + t_exec->wait_for(wait_i); + } + + t_exec->set_cpu(SPE_ANY); + t_exec->spawn(); + + } + + +} + void hello_init(TaskManager *manager) { - for (int i = 0; i < count; i++) { /** * Create Task * create_task(Task ID); */ + + if (use_task_creater) { + + simple_task_creater(0,0,Hello,0,0,0,0,manager,0,0); + + } else { + HTask *hello = manager->create_task(Hello); /** @@ -54,7 +168,10 @@ hello->set_param(0,(memaddr)i); hello->spawn(); + } } + + } int
--- a/example/HelloWorld/spe/Hello.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/example/HelloWorld/spe/Hello.cc Fri Dec 17 00:18:36 2010 +0900 @@ -3,10 +3,10 @@ #include "Func.h" /* これは必須 */ -SchedDefineTask(Hello); +SchedDefineTask1(Hello,hello); static int -run(SchedTask *smanager, void *rbuf, void *wbuf) +hello(SchedTask *smanager, void *rbuf, void *wbuf) { long task_id = (long)smanager->get_param(0);
--- a/example/HelloWorld/spe/spe-main.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/example/HelloWorld/spe/spe-main.cc Fri Dec 17 00:18:36 2010 +0900 @@ -10,5 +10,5 @@ void task_init(Scheduler *s) { - SchedRegisterTask(HELLO_TASK, Hello); + SchedRegister(Hello); }
--- a/example/MemList/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/MemList/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/MemList/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/MemList/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Pipeline/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Pipeline/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -3,7 +3,7 @@ ABIBIT = 32 SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Pipeline/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Pipeline/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Pipeline/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Pipeline/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Simple/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Simple/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -3,7 +3,7 @@ ABIBIT = 32 SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Simple/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Simple/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/Simple/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/Simple/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/basic/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/basic/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/basic/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/basic/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/basic/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/basic/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/dependency_task/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/dependency_task/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/dependency_task/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/dependency_task/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/dependency_task/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/dependency_task/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/get_segment/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/get_segment/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/get_segment/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/get_segment/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -3,7 +3,7 @@ CC += -m64 SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/hello_array/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/hello_array/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/hello_array/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/hello_array/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/hello_array/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/hello_array/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/mainMem/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/mainMem/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/mainMem/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/mainMem/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/mainMem/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/mainMem/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/many_task/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/many_task/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/many_task/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/many_task/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/many_task/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/many_task/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -2,7 +2,7 @@ SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/post_function/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/post_function/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/post_function/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/post_function/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/post_function/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/post_function/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/renew_task/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/renew_task/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/renew_task/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/renew_task/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/renew_task/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/renew_task/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/share_task/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/share_task/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/share_task/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/share_task/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/share_task/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/share_task/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/task_queue/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/task_queue/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/task_queue/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/task_queue/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/task_queue/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/task_queue/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/word_count/Makefile.cell Fri Nov 05 22:43:25 2010 +0900 +++ b/example/word_count/Makefile.cell Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/word_count/Makefile.linux Fri Nov 05 22:43:25 2010 +0900 +++ b/example/word_count/Makefile.linux Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/word_count/Makefile.macosx Fri Nov 05 22:43:25 2010 +0900 +++ b/example/word_count/Makefile.macosx Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o)
--- a/example/word_count/main.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/example/word_count/main.cc Fri Dec 17 00:18:36 2010 +0900 @@ -15,6 +15,7 @@ int all = 0; int use_task_array = 1; +int use_task_creater = 0; int use_compat = 0; int array_task_num = 8; int spe_num = 1; @@ -27,6 +28,105 @@ } st_mmap_t; +static void simple_task_creater(int in_total_size, int out_total_size, + int command, int in_data_size, int out_data_size, + void *in_data, void *out_data, SchedTask *manager, + HTask *wait_i, HTask *wait_me) { + + + int in_task_size = 0; + int out_task_size = 0; + + if (in_total_size != 0) { + in_task_size = in_total_size / in_data_size; + if (in_total_size != in_task_size * in_data_size) { + printf("mismatch of in_total_size and in_data_size\n"); + } + } + + if (out_total_size != 0) { + out_task_size = out_total_size / out_data_size; + if (out_total_size != out_task_size * out_data_size) { + printf("mismatch of out_total_size and out_data_size\n"); + } + } + + /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/ + int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size; + + if (task_num == 0) task_num = 1; + + /*spe分あればいいのかな?*/ + + int array_num = spe_num; + if (task_num < array_num) { + array_num = task_num; + } + + + HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num); + TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_num); + + int array_length = task_num / array_num; + int rest = task_num % array_num; + + int index = 0; + + for (int k = 0; k < array_num; k++) { + + task_array[k] = manager->create_task_array(command,array_length,0,1,1); + t_exec[k] = 0; + + if (wait_me != 0) { + wait_me->wait_for(task_array[k]); + } + if (wait_i != 0) { + task_array[k]->wait_for(wait_i); + } + + } + + for (int j = 0; j < array_length; j++) { + for (int k = 0; k < array_num; k++) { + + t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]); + t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + } + } + + for (int k = 0; k < array_num; k++) { + task_array[k]->spawn_task_array(t_exec[k]->next()); + task_array[k]->set_cpu(SPE_ANY); + task_array[k]->spawn(); + } + + for (int k = 0; k < rest; k++) { + HTaskPtr t_exec = manager->create_task(command); + + t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + if (wait_me != 0) { + wait_me->wait_for(t_exec); + } + if (wait_i != 0) { + t_exec->wait_for(wait_i); + } + + t_exec->spawn(); + t_exec->set_cpu(SPE_ANY); + + } + + +} + /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/ static int @@ -77,12 +177,23 @@ static void run_tasks(SchedTask *manager, WordCount *w, int task_count, HTaskPtr t_next, int size) { - + if (task_count < array_task_num) { array_task_num = task_count; if (task_count<=0) return; } - + + //static void simple_task_creater(int in_total_size, int out_total_size, + // int command, int in_data_size, int out_data_size, + // void *in_data, void *out_data, TaskManager *manager, + // HTask *wait_i, HTask *wait_me) + + + + if (use_task_creater) { + simple_task_creater(w->file_size, w->division_out_size * w->task_num, TASK_EXEC, w->division_size, w->division_out_size, + w->file_mmap, w->o_data, manager, w->t_print, 0); + } if (use_task_array) { @@ -172,7 +283,7 @@ for (int i = 0; i < task_count; i += array_task_num) { - HTask *h_exec = 0; + HTask *h_exec = 0; for (int j = 0; j < array_task_num; j++) { int i = w->task_spwaned++; if (w->size < size) size = w->size; @@ -183,6 +294,7 @@ h_exec->set_inData(0,w->file_mmap + i*w->division_size, size); h_exec->set_outData(0,w->o_data + i*w->out_size, w->division_out_size); + if (all) { w->t_print->wait_for(h_exec); } else { @@ -345,6 +457,10 @@ } else if (strcmp(argv[i], "-s") == 0) { use_task_array = 0; use_compat = 0; + } else if (strcmp(argv[i], "-t") == 0) { + use_task_creater = 1; + use_task_array = 0; + use_compat = 0; } else if (strcmp(argv[i], "-anum") == 0) { array_task_num = atoi(argv[i+1]); } else if (strcmp(argv[i], "-cpu") == 0) {
--- a/example/word_count/spe/Exec.cc Fri Nov 05 22:43:25 2010 +0900 +++ b/example/word_count/spe/Exec.cc Fri Dec 17 00:18:36 2010 +0900 @@ -17,7 +17,7 @@ int word_num = 0; int line_num = 0; int i = 0; - + head_tail_flag[0] = (i_data[0] != 0x20) && (i_data[0] != 0x0A); word_num -= 1-head_tail_flag[0];
--- a/old/simple_render/Makefile Fri Nov 05 22:43:25 2010 +0900 +++ b/old/simple_render/Makefile Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ TARGET = test_nogl SRCS_TMP = $(wildcard *.cpp) -SRCS_EXCLUDE = fb.cpp # +SRCS_EXCLUDE = fb.cpp # 除外 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cpp=.o)
--- a/old/simple_render/spe/Makefile Fri Nov 05 22:43:25 2010 +0900 +++ b/old/simple_render/spe/Makefile Fri Dec 17 00:18:36 2010 +0900 @@ -1,7 +1,7 @@ TARGET = ../spe-main SRCS_TMP = $(wildcard *.cpp) -SRCS_EXCLUDE = CreatePolygonPack.cpp # +SRCS_EXCLUDE = CreatePolygonPack.cpp # 除外 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cpp=.o)