Mercurial > hg > Members > kono > Cerium
view TaskManager/Test/simple_render/main.cpp @ 105:3e331f7576a1
*** empty log message ***
author | gongo |
---|---|
date | Mon, 03 Mar 2008 18:55:28 +0900 |
parents | 588ab5f0e659 |
children | 5c194c71eca8 |
line wrap: on
line source
#include <iostream> #include "viewer.h" #include "Func.h" #include "polygon.h" #include "demonstration.h" #include "pad.h" #include "TaskManager.h" using namespace std; #include "error.h" int init(void*, void*); int sdl_init(void*, void*); int run_init(void*, void*); int finish(void*, void*); extern void task_initialize(); TaskManager *manager; Viewer *screen; struct init_arg { int bpp; int w; int h; }; struct init_arg *initArg; int init(void *r, void *w) { HTaskPtr task_sdl_init, task_run; __debug("[%s]\n", __FUNCTION__); screen = new Viewer(initArg->bpp, initArg->w, initArg->h); // obsolute API // シンボル名登録してほげほげと // ユーザが自分で ID つけるのどっちがいいかな。 // 現段階では、ppe と spe の func_list を共有できないので // シンボル名よりは ID の方が楽。 //fd_sdl_init = manager->open("sdl_init"); //fd_zrow_init = manager->open("zRow_init"); //fd_run = manager->open("run"); //task_sdl_init = manager->create_task(fd_sdl_init, 0, 0, 0, NULL); //task_zrow_init = manager->create_task(fd_zrow_init, 0, 0, 0, NULL); //task_run = manager->create_task(fd_run, 0, 0, 0, NULL); task_sdl_init = manager->create_task(SDL_INIT, 0, 0, 0, NULL); task_run = manager->create_task(VIEWER_RUN_INIT, 0, 0, 0, NULL); task_run->set_depend(task_sdl_init); task_sdl_init->spawn(); task_run->spawn(); free(initArg); return 0; } // クラス関数は単純にポインタで扱えないので // 現状は間接的に呼ぶことに int sdl_init(void *r, void *w) { __debug("[%s]\n", __FUNCTION__); screen->sdl_init(); return 0; } int run_init(void *r, void *w) { __debug("[%s]\n", __FUNCTION__); screen->run_init(); return 0; } int run_loop(void *r, void *w) { __debug("[%s] start\n", __FUNCTION__); screen->run_loop(); __debug("[%s] end\n", __FUNCTION__); return 0; } int run_draw(void *r, void *w) { __debug("[%s] start\n", __FUNCTION__); screen->run_draw(); __debug("[%s] end\n", __FUNCTION__); return 0; } int run_finish(void *r, void *w) { __debug("[%s]\n", __FUNCTION__); screen->run_finish(); return 0; } int finish(void *w, void *r) { __debug("[%s]\n", __FUNCTION__); delete screen; delete manager; return 0; } int main(int argc, char *argv[]) { manager = new TaskManager(1); manager->init(); task_initialize(); // 本当は、dlsym みたいなものを使いたいんだけど // 静的なやつはできないん? #if 0 manager->set_symbol("init", (void*)init); manager->set_symbol("sdl_init", (void*)sdl_init); manager->set_symbol("zRow_init", (void*)zRow_init); manager->set_symbol("run", (void*)run); manager->set_symbol("finish", (void*)finish); manager->set_symbol("ViewerRunLoop", (void*)run_loop); manager->set_symbol("ViewerRunDraw", (void*)run_draw); manager->set_symbol("ViewerRunFinish", (void*)run_finish); #else manager->set_func(INIT, init); manager->set_func(SDL_INIT, sdl_init); manager->set_func(FINISH, finish); manager->set_func(VIEWER_RUN_INIT, run_init); manager->set_func(VIEWER_RUN_LOOP, run_loop); manager->set_func(VIEWER_RUN_DRAW, run_draw); manager->set_func(VIEWER_RUN_FINISH, run_finish); #endif int bpp = 0; int width = 640; int height = 480; for(int i = 1; argv[i]; ++i) { if (strcmp(argv[i], "-bpp") == 0) { bpp = atoi(argv[++i]); } if (strcmp(argv[i], "-width") == 0) { width = atoi(argv[++i]); } if (strcmp(argv[i], "-height") == 0) { height = atoi(argv[++i]); } } // 一番最初に行われる init 専用の task_run があってもいいけど。。 // その場合は引数とか固定か。まあ引数は argc, argv を持つ // 構造体で固定しても問題はない・・・か? HTaskPtr task_init; initArg = new struct init_arg; initArg->bpp = bpp; initArg->w = width; initArg->h = height; //fd_init = manager->open("init"); //task_init = manager->create_task(fd_init, 0, 0, 0, NULL); task_init = manager->create_task(INIT, 0, 0, 0, NULL); task_init->spawn(); manager->run(); finish(NULL, NULL); return 0; }