comparison TaskManager/Test/simple_render/main.cpp @ 109:028ffc9c0375 draft

Cerium cvs version
author gongo@gendarme.local
date Wed, 12 Nov 2008 17:39:33 +0900
parents 3e331f7576a1
children 768452fab95e
comparison
equal deleted inserted replaced
108:6f3b3dd3c095 109:028ffc9c0375
7 #include "TaskManager.h" 7 #include "TaskManager.h"
8 using namespace std; 8 using namespace std;
9 9
10 #include "error.h" 10 #include "error.h"
11 11
12 int init(void*, void*); 12 // あとで直す
13 // 引数からできるように
14 #define SPENUM 6
15
16 /* prototype */
17 void init(int argc, char *argc[]);
13 int sdl_init(void*, void*); 18 int sdl_init(void*, void*);
14 int run_init(void*, void*); 19 int run_init(void*, void*);
15 int finish(void*, void*); 20 int finish(void*, void*);
16 21
17 extern void task_initialize(); 22 extern void task_initialize();
25 int h; 30 int h;
26 }; 31 };
27 32
28 struct init_arg *initArg; 33 struct init_arg *initArg;
29 34
30 int init(void *r, void *w)
31 {
32 HTaskPtr task_sdl_init, task_run;
33
34 __debug("[%s]\n", __FUNCTION__);
35
36 screen = new Viewer(initArg->bpp, initArg->w, initArg->h);
37
38 // obsolute API
39 // シンボル名登録してほげほげと
40 // ユーザが自分で ID つけるのどっちがいいかな。
41 // 現段階では、ppe と spe の func_list を共有できないので
42 // シンボル名よりは ID の方が楽。
43 //fd_sdl_init = manager->open("sdl_init");
44 //fd_zrow_init = manager->open("zRow_init");
45 //fd_run = manager->open("run");
46 //task_sdl_init = manager->create_task(fd_sdl_init, 0, 0, 0, NULL);
47 //task_zrow_init = manager->create_task(fd_zrow_init, 0, 0, 0, NULL);
48 //task_run = manager->create_task(fd_run, 0, 0, 0, NULL);
49
50 task_sdl_init = manager->create_task(SDL_INIT, 0, 0, 0, NULL);
51 task_run = manager->create_task(VIEWER_RUN_INIT, 0, 0, 0, NULL);
52 task_run->set_depend(task_sdl_init);
53
54 task_sdl_init->spawn();
55 task_run->spawn();
56
57 free(initArg);
58 return 0;
59 }
60
61 35
62 // クラス関数は単純にポインタで扱えないので 36 // クラス関数は単純にポインタで扱えないので
63 // 現状は間接的に呼ぶことに 37 // 現状は間接的に呼ぶことに
64 int sdl_init(void *r, void *w)
65 {
66 __debug("[%s]\n", __FUNCTION__);
67 screen->sdl_init();
68 return 0;
69 }
70
71 int run_init(void *r, void *w)
72 {
73 __debug("[%s]\n", __FUNCTION__);
74 screen->run_init();
75 return 0;
76 }
77
78 int run_loop(void *r, void *w) 38 int run_loop(void *r, void *w)
79 { 39 {
80 __debug("[%s] start\n", __FUNCTION__); 40 __debug("[%s] start\n", __FUNCTION__);
81 screen->run_loop(); 41 screen->run_loop();
82 __debug("[%s] end\n", __FUNCTION__); 42 __debug("[%s] end\n", __FUNCTION__);
107 } 67 }
108 68
109 int 69 int
110 main(int argc, char *argv[]) 70 main(int argc, char *argv[])
111 { 71 {
112 manager = new TaskManager(1); 72 manager = new TaskManager(SPENUM);
113 manager->init(); 73 manager->init();
114 74
115 task_initialize(); 75 task_initialize();
116 76
117 // 本当は、dlsym みたいなものを使いたいんだけど
118 // 静的なやつはできないん?
119 #if 0
120 manager->set_symbol("init", (void*)init);
121 manager->set_symbol("sdl_init", (void*)sdl_init);
122 manager->set_symbol("zRow_init", (void*)zRow_init);
123 manager->set_symbol("run", (void*)run);
124 manager->set_symbol("finish", (void*)finish);
125 manager->set_symbol("ViewerRunLoop", (void*)run_loop);
126 manager->set_symbol("ViewerRunDraw", (void*)run_draw);
127 manager->set_symbol("ViewerRunFinish", (void*)run_finish);
128 #else
129 manager->set_func(INIT, init);
130 manager->set_func(SDL_INIT, sdl_init);
131 manager->set_func(FINISH, finish); 77 manager->set_func(FINISH, finish);
132 manager->set_func(VIEWER_RUN_INIT, run_init);
133 manager->set_func(VIEWER_RUN_LOOP, run_loop); 78 manager->set_func(VIEWER_RUN_LOOP, run_loop);
134 manager->set_func(VIEWER_RUN_DRAW, run_draw); 79 manager->set_func(VIEWER_RUN_DRAW, run_draw);
135 manager->set_func(VIEWER_RUN_FINISH, run_finish); 80 manager->set_func(VIEWER_RUN_FINISH, run_finish);
136 #endif
137 81
138 int bpp = 0; 82 init(argc, argv);
139 int width = 640; 83
140 int height = 480;
141
142 for(int i = 1; argv[i]; ++i)
143 {
144 if (strcmp(argv[i], "-bpp") == 0)
145 {
146 bpp = atoi(argv[++i]);
147 }
148 if (strcmp(argv[i], "-width") == 0)
149 {
150 width = atoi(argv[++i]);
151 }
152 if (strcmp(argv[i], "-height") == 0)
153 {
154 height = atoi(argv[++i]);
155 }
156 }
157
158 // 一番最初に行われる init 専用の task_run があってもいいけど。。
159 // その場合は引数とか固定か。まあ引数は argc, argv を持つ
160 // 構造体で固定しても問題はない・・・か?
161 HTaskPtr task_init;
162 initArg = new struct init_arg;
163 initArg->bpp = bpp;
164 initArg->w = width;
165 initArg->h = height;
166
167 //fd_init = manager->open("init");
168 //task_init = manager->create_task(fd_init, 0, 0, 0, NULL);
169 task_init = manager->create_task(INIT, 0, 0, 0, NULL);
170 task_init->spawn();
171
172 manager->run(); 84 manager->run();
173 85
174 finish(NULL, NULL); 86 finish(NULL, NULL);
175 return 0; 87 return 0;
176 } 88 }
89
90 void
91 init(int argc, char *argv[])
92 {
93 int bpp = 0;
94 int width = 640;
95 int height = 480;
96 char *xml = "cube.xml";
97
98 for(int i = 1; argv[i]; ++i)
99 {
100 if (strcmp(argv[i], "-bpp") == 0) {
101 bpp = atoi(argv[++i]);
102 }
103 if (strcmp(argv[i], "-width") == 0) {
104 width = atoi(argv[++i]);
105 }
106 if (strcmp(argv[i], "-height") == 0) {
107 height = atoi(argv[++i]);
108 }
109 if (strcmp(argv[i], "-xml") == 0) {
110 xml = argv[++i];
111 }
112 }
113
114 //screen = new Viewer(bpp, width, height);
115 screen = new Viewer(bpp, width, height, SPENUM);
116
117 screen->sdl_init();
118 screen->run_init(xml);
119 }
120