Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Test/test_render/viewer.cpp @ 398:e621024b6ef1
separate existing source
author | game@henri.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Sun, 20 Sep 2009 19:21:04 +0900 |
parents | a4f690f44842 |
children | 4bea73c83c35 |
rev | line source |
---|---|
140 | 1 #include <SDL.h> |
109 | 2 #include "viewer.h" |
120 | 3 #include "viewer_types.h" |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
4 #include "SceneGraph.h" |
195 | 5 #include "SceneGraphRoot.h" |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
6 #include "scene_graph_pack.h" |
109 | 7 #include "sys.h" |
8 #include "Func.h" | |
9 #include "error.h" | |
10 #include "TaskManager.h" | |
212 | 11 #include <wchar.h> |
221 | 12 #include "Pad.h" |
212 | 13 |
398 | 14 private void Viewer::initLoop(); |
15 private void Viewer::mainLoop(); | |
16 private void Viewer::speLoop(); | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
17 static void post2runLoop(void *viewer); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
18 static void post2runDraw(void *viewer); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
19 static void post2runMove(void *viewer); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
20 //static void post2exchange_sgroot(void *viewer); |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
21 |
109 | 22 |
23 /* measure for FPS (Frame Per Second) */ | |
24 int start_time; | |
25 int this_time; | |
26 int frames; | |
27 | |
198
57921c8d21c5
rename snake_bg to panel
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
195
diff
changeset
|
28 SceneGraphRootPtr sgroot; |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
29 SceneGraphRootPtr sgroot_2; |
109 | 30 |
176 | 31 /* Data Pack sent to Other CPUs (ex. SPE) */ |
109 | 32 SceneGraphPack *sgpack; |
33 PolygonPack *ppack; | |
34 SpanPackPtr spackList; | |
35 SpanPackPtr *spackList_ptr; | |
210 | 36 |
109 | 37 int spackList_length; |
38 int spackList_length_align; | |
39 | |
140 | 40 /** |
176 | 41 * |
42 */ | |
43 | |
109 | 44 Viewer::Viewer(int b, int w, int h, int _num) |
45 { | |
46 bpp = b; | |
47 width = w; | |
48 height = h; | |
49 spe_num = _num; | |
50 } | |
51 | |
52 int | |
229 | 53 Viewer::get_ticks(void) |
109 | 54 { |
55 int time; | |
56 time = SDL_GetTicks(); | |
57 return time; | |
58 } | |
59 | |
60 bool | |
229 | 61 Viewer::quit_check(void) |
109 | 62 { |
63 SDL_Event event; | |
64 | |
65 while(SDL_PollEvent(&event)) { | |
374 | 66 if (event.type==SDL_QUIT) { |
67 return true; | |
68 } | |
109 | 69 } |
70 | |
71 Uint8 *keys=SDL_GetKeyState(NULL); | |
72 | |
73 if (keys[SDLK_q] == SDL_PRESSED) { | |
374 | 74 return true; |
109 | 75 } |
76 | |
77 return false; | |
78 } | |
79 | |
80 void | |
229 | 81 Viewer::quit(void) |
109 | 82 { |
83 SDL_Quit(); | |
84 } | |
85 | |
86 void | |
229 | 87 Viewer::swap_buffers(void) |
109 | 88 { |
89 SDL_GL_SwapBuffers(); | |
90 } | |
91 | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
92 extern void node_init(TaskManager *manager); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
93 extern void create_cube_split(TaskManager *manager, int); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
94 extern void panel_init(TaskManager *manager, int bg); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
95 extern void universe_init(TaskManager *manager); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
96 extern void ieshoot_init(TaskManager *manager); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
97 extern void ball_bound_init(TaskManager *manager, int, int); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
98 extern void lcube_init(TaskManager *manager, int, int); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
99 extern void direction_init(TaskManager *manager); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
100 extern void init_position(TaskManager *manager, int, int); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
101 extern void vacuum_init(TaskManager *manager, int w, int h); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
102 extern void untitled_init(TaskManager *manager); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
103 extern void chain_init(TaskManager *manager, int w, int h); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
104 extern void boss1_init(TaskManager *manager, int w, int h); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
105 extern void init_gaplant(TaskManager *manager, int w, int h); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
106 extern void vacuum_init2(TaskManager *manager, int w, int h); |
323 | 107 |
109 | 108 void |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
109 Viewer::run_init(TaskManager *manager, const char *xml, int sg_number) |
109 | 110 { |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
111 this->manager = manager; |
109 | 112 |
113 start_time = get_ticks(); | |
114 this_time = 0; | |
115 frames = 0; | |
116 | |
221 | 117 sgroot = new SceneGraphRoot(this->width, this->height); |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
118 sgroot_2 = new SceneGraphRoot(this->width, this->height); |
195 | 119 //sgroot->createFromXMLFile(xml); |
140 | 120 |
144 | 121 switch (sg_number) { |
122 case 0: | |
123 case 1: | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
124 create_cube_split(manager, sg_number); |
374 | 125 break; |
144 | 126 case 2: |
153
c8c8bb4e9e58
画像のサイズテストを加える -sg = [2,3,4]
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
150
diff
changeset
|
127 case 3: |
c8c8bb4e9e58
画像のサイズテストを加える -sg = [2,3,4]
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
150
diff
changeset
|
128 case 4: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
129 panel_init(manager, sg_number); |
374 | 130 break; |
153
c8c8bb4e9e58
画像のサイズテストを加える -sg = [2,3,4]
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
150
diff
changeset
|
131 case 5: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
132 universe_init(manager); |
374 | 133 break; |
158 | 134 case 6: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
135 ieshoot_init(manager); |
374 | 136 break; |
210 | 137 case 7: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
138 ball_bound_init(manager, this->width, this->height); |
374 | 139 break; |
212 | 140 case 8: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
141 lcube_init(manager, this->width, this->height); |
374 | 142 break; |
212 | 143 case 9: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
144 direction_init(manager); |
374 | 145 break; |
213
159519cdca1f
add SceneGraph "3D Super-Dandy"
gongo@localhost.localdomain
parents:
212
diff
changeset
|
146 case 10: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
147 init_position(manager, this->width, this->height); |
374 | 148 break; |
222 | 149 case 11: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
150 // vacuum_init(manager, this->width, this->height); |
374 | 151 break; |
231
4bfa24811786
test program add (-sg 12)
tkaito@nw0534.st.ie.u-ryukyu.ac.jp
parents:
229
diff
changeset
|
152 case 12: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
153 untitled_init(manager); |
231
4bfa24811786
test program add (-sg 12)
tkaito@nw0534.st.ie.u-ryukyu.ac.jp
parents:
229
diff
changeset
|
154 break; |
321 | 155 case 13: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
156 boss1_init(manager, this->width, this->height); |
378 | 157 break; |
158 case 14: | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
159 init_gaplant(manager, this->width, this->height); |
378 | 160 break; |
161 case 15: | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
162 vacuum_init2(manager, this->width, this->height); |
378 | 163 break; |
164 case 16: | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
165 chain_init(manager, this->width, this-> height); |
398 | 166 speLoop(); |
167 return 1; | |
374 | 168 break; |
144 | 169 default: |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
170 node_init(manager); |
374 | 171 break; |
398 | 172 } |
173 | |
174 mainLoop(); | |
175 } | |
176 | |
177 | |
178 static void | |
179 Viewer::initLoop() | |
180 { | |
181 HTaskPtr task_next; | |
182 HTaskPtr task_tex; | |
142 | 183 |
217 | 184 sgpack = (SceneGraphPack*)manager->allocate(sizeof(SceneGraphPack)); |
109 | 185 sgpack->init(); |
217 | 186 ppack = (PolygonPack*)manager->allocate(sizeof(PolygonPack)); |
109 | 187 |
188 spackList_length = (this->height + split_screen_h - 1) / split_screen_h; | |
217 | 189 spackList = (SpanPack*)manager->allocate(sizeof(SpanPack)*spackList_length); |
109 | 190 |
176 | 191 /** |
192 * SPU に送る address list は 16 バイト倍数でないといけない。 | |
193 * spackList_length*sizeof(SpanPack*) が 16 バイト倍数になるような | |
194 * length_align を求めている。はみ出した部分は使われない | |
195 * (ex) spackList_length が 13 の場合 | |
196 * spackList_length_align = 16; | |
197 * 実際に送るデータは64バイトになるのでOK | |
198 * 14,15,16 の部分は何も入らない。 | |
199 */ | |
109 | 200 spackList_length_align = (spackList_length + 3)&(~3); |
201 | |
202 /* 各 SPU が持つ、SpanPack の address list */ | |
167
c8b868871dce
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
158
diff
changeset
|
203 spackList_ptr = |
374 | 204 (SpanPack**)manager->allocate(sizeof(SpanPack*)*spackList_length_align); |
109 | 205 |
206 for (int i = 0; i < spackList_length; i++) { | |
374 | 207 spackList_ptr[i] = &spackList[i]; |
109 | 208 } |
209 | |
126
7635f223fc7d
fix RGBA mask (bgr -> rgba)
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
123
diff
changeset
|
210 for (int i = 1; i <= spackList_length; i++) { |
374 | 211 spackList[i-1].init(i*split_screen_h); |
126
7635f223fc7d
fix RGBA mask (bgr -> rgba)
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
123
diff
changeset
|
212 } |
7635f223fc7d
fix RGBA mask (bgr -> rgba)
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
123
diff
changeset
|
213 |
109 | 214 task_next = manager->create_task(TASK_DUMMY); |
244 | 215 |
109 | 216 |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
217 #if 0 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
218 // 諸事情で、今は SceneGraphPack を作らずに |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
219 // そのまま SceneGraph でやっています |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
220 HTaskPtr task_sgp; |
109 | 221 task_sgp = manager->create_task(TASK_CREATE_SGP); |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
222 task_sgp->add_param((uint32)scene_graph); |
109 | 223 task_sgp->add_param((uint32)sgpack); |
224 task_next->wait_for(task_sgp); | |
225 task_sgp->spawn(); | |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
226 #endif |
109 | 227 |
167
c8b868871dce
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
158
diff
changeset
|
228 for (int i = 0; i < spe_num; i++) { |
374 | 229 task_tex = manager->create_task(TASK_INIT_TEXTURE); |
378 | 230 /* |
231 * ここはもう少しわかりやすい使い方がいいかもしれぬ。こんなもん? | |
232 */ | |
374 | 233 task_tex->set_cpu((CPU_TYPE)((int)SPE_0 + i)); |
234 task_next->wait_for(task_tex); | |
235 task_tex->spawn(); | |
120 | 236 } |
398 | 237 } |
238 | |
239 static void | |
240 Viewer::speLoop() | |
241 { | |
242 initLoop(); | |
243 | |
244 task_next->set_post(&post2runLoop, (void *)this); // set_post(function(this->run_loop()), NULL) | |
245 task_next->spawn(); | |
246 // TASK_INIT_TEXTURE が全て終わったら DUMMY_TASK が Viewer::run_loop() を呼ぶ | |
247 } | |
248 | |
249 static void | |
250 Viewer::mainLoop() | |
251 { | |
252 initLoop(); | |
120 | 253 |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
254 task_next->set_post(&post2runLoop, (void *)this); // set_post(function(this->run_loop()), NULL) |
378 | 255 task_next->spawn(); |
256 // TASK_INIT_TEXTURE が全て終わったら DUMMY_TASK が Viewer::run_loop() を呼ぶ | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
257 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
258 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
259 /* |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
260 HTaskPtr move_task = manager->create_task(RUN_MOVE_TASK); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
261 HTaskPtr draw_task = manager->create_task(RUN_DRAW_TASK); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
262 move_task->spawn(); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
263 draw_task->spawn(); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
264 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
265 task_next->wait_for(RUN_MOVE_TASK); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
266 task_next->wait_for(RUN_DRAW_TASK); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
267 task_next->set_post(&post2runExchange, (void *)this); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
268 task_next->spawn(); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
269 */ |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
270 } |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
271 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
272 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
273 /* |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
274 static void |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
275 post2exchange_sgroot(void *viewer_) |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
276 { |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
277 Viewer *viewer = (Viewer*)viewer_; |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
278 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
279 viewer->exchange_sgroot(task_next); |
109 | 280 } |
281 | |
282 void | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
283 Viewer::exchange_sgroot(TaskManager *manager) |
109 | 284 { |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
285 |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
286 SceneGraphRootPtr tmp = sgroot; |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
287 sgroot = sgroot_2; |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
288 sgroot_2 = tmp; |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
289 |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
290 } |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
291 */ |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
292 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
293 static void |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
294 post2runMove(void *viewer_) |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
295 { |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
296 Viewer *viewer = (Viewer*)viewer_; |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
297 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
298 viewer->run_move(task_next); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
299 } |
109 | 300 |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
301 void |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
302 Viewer::run_move(HTaskPtr task_next) |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
303 { |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
304 sgroot->updateControllerState(); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
305 sgroot->allExecute(width, height); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
306 } |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
307 |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
308 void |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
309 Viewer::run_collision() |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
310 { |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
311 } |
109 | 312 |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
313 void |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
314 Viewer::rendering(HTaskPtr task_next) |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
315 { |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
316 HTaskPtr task_create_pp = NULL; |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
317 HTaskPtr task_create_sp = NULL; |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
318 |
157 | 319 // SceneGraph(木構造) -> PolygonPack |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
320 task_create_pp = manager->create_task(TASK_CREATE_PP2); |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
321 task_create_pp->add_param((uint32)sgroot_2->getDrawSceneGraph()); |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
133
diff
changeset
|
322 task_create_pp->add_param((uint32)ppack); |
109 | 323 |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
324 //task_next->wait_for(task_create_pp); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
325 |
109 | 326 int range_base = spe_num; |
327 // 切り上げのつもり | |
328 int range = (spackList_length + range_base - 1) / range_base; | |
329 | |
330 for (int i = 0; i < range_base; i++) { | |
374 | 331 int index_start = range*i; |
332 int index_end = (index_start + range >= spackList_length) | |
333 ? spackList_length : index_start + range; | |
109 | 334 |
374 | 335 task_create_sp = manager->create_task(TASK_CREATE_SPAN); |
336 task_create_sp->add_inData(ppack, sizeof(PolygonPack)); | |
337 task_create_sp->add_inData(spackList_ptr, | |
338 sizeof(SpanPack*)*spackList_length_align); | |
339 task_create_sp->add_inData(&spackList[index_start], sizeof(SpanPack)); | |
109 | 340 |
374 | 341 task_create_sp->add_param(index_start); |
109 | 342 |
374 | 343 /** |
344 * ex. screen_height が 480, spenum が 6 の場合、各SPEのy担当範囲 | |
345 * [ 1.. 80] [ 81..160] [161..240] | |
346 * [241..320] [321..400] [401..480] | |
347 * | |
348 * ex. screen_height が 1080, spenum が 5 の場合、 | |
349 * [ 1..216] [217..432] [433..648] | |
350 * [649..864] [865..1080] | |
351 */ | |
352 task_create_sp->add_param(index_start*split_screen_h + 1); | |
353 task_create_sp->add_param(index_end*split_screen_h); | |
109 | 354 |
374 | 355 task_next->wait_for(task_create_sp); |
356 task_create_sp->wait_for(task_create_pp); | |
109 | 357 |
374 | 358 task_create_sp->set_cpu(SPE_ANY); |
359 task_create_sp->spawn(); | |
109 | 360 } |
361 | |
362 task_create_pp->spawn(); | |
378 | 363 |
244 | 364 // Barrier 同期 |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
365 // run_draw() を呼ぶ post2runDraw |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
366 task_next->set_post(post2runDraw, (void*)this); // set_post(function(this->run_draw()), NULL) |
109 | 367 task_next->spawn(); |
378 | 368 // TASK_CREATE_SPAN が全て終わったら DUMMY_TASK が Viewer::run_draw() を呼ぶ |
109 | 369 } |
370 | |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
371 static void |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
372 post2runLoop(void *viewer_) |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
373 { |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
374 Viewer *viewer = (Viewer*)viewer_; |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
375 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
376 viewer->run_loop(task_next); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
377 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
378 } |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
379 |
109 | 380 void |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
381 Viewer::run_loop(HTaskPtr task_next) |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
382 { |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
383 bool quit_flg; |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
384 quit_flg = quit_check(); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
385 if (quit_flg == true) { |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
386 this_time = get_ticks(); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
387 run_finish(); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
388 return; |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
389 } |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
390 |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
391 clean_pixels(); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
392 |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
393 for (int i = 1; i <= spackList_length; i++) { |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
394 spackList[i-1].reinit(i*split_screen_h); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
395 } |
398 | 396 |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
397 run_move(task_next); |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
398 //sgroot->updateControllerState(); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
399 //sgroot->allExecute(width, height); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
400 //sgroot->checkRemove(); |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
401 |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
402 // ここから下は Rendering という関数にする |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
403 rendering(task_next); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
404 } |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
405 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
406 static void |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
407 post2runDraw(void *viewer_) |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
408 { |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
409 Viewer *viewer = (Viewer*)viewer_; |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
410 HTaskPtr task_next = viewer->manager->create_task(TASK_DUMMY); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
411 viewer->run_draw(task_next); |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
412 |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
413 } |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
414 |
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
415 void |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
416 Viewer::run_draw(HTaskPtr task_next) // 引数に post2runLoop を入れるようにする |
109 | 417 { |
418 HTaskPtr task_draw; | |
374 | 419 |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
420 //task_next = manager->create_task(TASK_DUMMY); |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
421 //task_next->set_post(post2runLoop, NULL); |
374 | 422 |
109 | 423 ppack->clear(); |
424 for (int i = 0; i < spackList_length; i++) { | |
374 | 425 SpanPack *spack = &spackList[i]; |
426 int startx = 1; | |
427 int endx = split_screen_w; | |
109 | 428 |
374 | 429 int starty = spack->info.y_top - split_screen_h + 1; |
430 //int endy = spack->info.y_top; | |
431 int rangey = (starty + split_screen_h - 1 > this->height) | |
432 ? this->height - starty + 1 : split_screen_h; | |
109 | 433 |
374 | 434 while (startx < this->width) { |
435 if (spack->info.size > 0) { | |
436 // Draw SpanPack | |
437 task_draw = manager->create_task(TASK_DRAW_SPAN); | |
438 task_draw->add_inData(spack, sizeof(SpanPack)); | |
439 | |
440 task_draw->add_param( | |
441 (uint32)&pixels[(startx-1) + this->width*(starty-1)]); | |
442 task_draw->add_param(this->width); | |
443 } else { | |
444 memset(&pixels[(startx-1)+this->width*(starty-1)], | |
445 0, (this->width)*sizeof(int)*rangey); | |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
446 break; |
374 | 447 } |
109 | 448 |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
449 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
450 task_next->spawn(); |
374 | 451 task_draw->add_param(startx); |
452 task_draw->add_param(endx); | |
453 task_draw->add_param(rangey); | |
454 task_draw->set_cpu(SPE_ANY); | |
455 task_next->wait_for(task_draw); | |
456 task_draw->spawn(); | |
109 | 457 |
374 | 458 startx += split_screen_w; |
459 endx += split_screen_w; | |
109 | 460 |
374 | 461 if (endx > this->width) { |
462 endx = this->width; | |
463 } | |
464 } | |
109 | 465 } |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
466 |
397
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
467 |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
468 task_next->set_post(post2runLoop, (void*)this); // set_post(function(this->run_loop()), NULL) |
a4f690f44842
delete manager (in kernel/ppe/TaskManager.h)
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
396
diff
changeset
|
469 task_next->spawn(); |
378 | 470 // TASK_DRAW_SPAN が全て終わったら DUMMY_TASK が Viewer::run_loop() を呼ぶ |
109 | 471 |
472 frames++; | |
473 } | |
474 | |
475 void | |
476 Viewer::run_finish(void) | |
477 { | |
478 if (this_time != start_time) { | |
374 | 479 printf("%f FPS\n", (((float)frames)/(this_time-start_time))*1000.0); |
109 | 480 } |
481 | |
219
0f1ff7b06157
allExecute する度に SceneGraph をコピーしていく様に変更
gongo@gendarme.local
parents:
217
diff
changeset
|
482 delete sgroot; |
396
d1f1e27d0a12
don't move. separate allExecute from run_loop
game@henri.cr.ie.u-ryukyu.ac.jp
parents:
378
diff
changeset
|
483 delete sgroot_2; |
109 | 484 quit(); |
485 } |