view Renderer/Engine/ChangeLog @ 1026:55f3c5976959

create_pp_task fix.
author tkaito
date Tue, 09 Nov 2010 18:14:28 +0900
parents 7a7acecd0f8f
children
line wrap: on
line source

2010-8-6  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>

	Renderer Engine の task の下に user task を置くのは反則だろ?
	問題は、User program の方で、どうやって、task_init するかだが、
	PPE側は自分でやって問題ない。SPE側が困る。

	やはり、main memory 上のtask listをSPEが自分で読み出すと言う
	方式が合理的だと思われる。get_segment で良いしね。ただ、可変長
	にしないとダメだが... 2^n allocator with compaction が必要か?

	必ず ppe/spe task があるわけだから、task_list はppe/speで一つ
	でも良い。少なくとも設定は一ヶ所が望ましい。object search path
	があれば良い。

	task_list を main memory に置くのは良いが、spe task のentry point
	が決まらないと言う問題がある。

2009-12-19  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>

	SgChange/viewer は大域変数使いすぎ。禁止って言ったのに。
        linda api は、federated linda 対応でないものが使われている。
        対応したものは、どこにあるんだろう?

        他の例題いじるのは、自分の例題を動かしてからにして欲しい。

        まぁねぇ。Pipeline execution するのに、sgpack とかも Pipeline buffer
        にするのは気づかないものなんだろうな... なくても、動かないことは
        ないのか。

        viewer.cc の大域変数を落すところから始めるべきか?

2009-11-15  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>

	DrawSpan は,
		Start DrawSpan region (allocate Z buffer)
		DrawSpan / for each SpanPack
		    add_inData
		End DrawSpan region (Write frame buffer,free  Z buffer)
		    add_outData
	みたいにしたい.

	CreateSpan は,SpanPack を入れ換えているようだが,
		SpanPack は,ランダムに書きだし,
		PPU 側で,それをsortする.
	と言う方がよい? ほぼ毎回入れ換えているんじゃないの?

2009-11-14  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>

	DrawSpan の dma_write を追放。なんでこんなになっていたかは謎。
	これで、renew Task を落とせます。

2009-08-06  Shinji Kono  <kono@ie.u-ryukyu.ac.jp>

	DrawSpan の reboot/ TASK_DRAW_SPAN2 は、使ってないのね。

2009-03-29  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* Makefile
	SGlist.{cpp,h} を make clean で消去し、
	make で自動生成するようにしました。
	けどなんか他のファイルと同じ書きかたしても
	上手く行かなかった。何か見落としてるかもしれない。誰か直(ry

2009-02-12  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* task/CreatePolygonFromSceneGraph.cpp (CreatePolygonFromSceneGraph::run): fix
	下にあわせる様に

	* SceneGraph.cpp (SceneGraph::SceneGraph, SceneGraph::init)
	(SceneGraph::finalize_original): fix
	今まで、Polygon が持つ vertex, normal, texture coordinate ってのが

	       ---------------------------------------
	data = |   vertex   |   normal   |  texture  | sizeof(data) = size*3
	       ---------------------------------------
                \  size    / \   size   / \  size   /

	てな感じで、SceneGraph->data の中に 3 つ入ってたわけです。
	これだと、アクセスする時にどれがどれかわからんくなるし、
	ソース読む時に迷う(経験談)ので、data を消して、代わりに
	coord_xyz, normal, coord_tex を作りました。
	
	* polygon.cpp (Polygon::pickup_coordinate)
	(Polygon::pickup_normal, Polygon::pickup_texture): 

2009-02-10  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* Makefile.macosx (depend): fix
	depend.inc とかを吐き出す様にしました

	* Camera.cpp (Camera::Camera, Camera::updateView)
	(Camera::updatePerspective, Camera::updateScreen)
	(Camera::update): fix
	なんとかカメラできてるっぽいです。
	Perspective とかも聞いてるし、中心に向かって遠くなってる。
	あとは行列演算をもうちょいこぎれいにすればいい感じかなー。

	残りは、ユーザ側からの設定。例えば
	1. 車の運転席目線(FPS)
	2. 車の後ろから(TPS)
	3. 車の前から(SPS)

	的なのを、ユーザが CameraData みたいな構造体に
	zd とか yd とかを設定して camera->set(data) とかやれば
	反映するみたいな!みたいな!
	
2009-02-09  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* SceneGraphRoot.cpp (SceneGraphRoot::allExecute)
	(SceneGraphRoot): fix
	SceneGraph を root から走査していきながら
	その都度コピーしていき、最終的に全体の新しい SceneGraph ができる。
	削除されていればコピーしない、っていうのは簡単だけど
	追加された場合、コピー元に追加されるのは困るので
	コピーしたやつに追加って形にしたら今のコードになった。
	めんどくさいっちゃめんどくさい。もっと綺麗な書き方あるかね


2009-02-01  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* SceneGraph.cpp (SceneGraph::SceneGraph)
	(SceneGraph::SceneGraph, SceneGraph::SceneGraph)
	(SceneGraph::finalize_original, SceneGraph)
	(SceneGraph::finalize_copy): add, fix
	今のところ、SceneGraph の作られ方は

	a1. xml ファイルから生成 (sgid 毎、sg_src[] に格納)
	a2. ID を指定し、sg_src[id] の SceneGraph を複製
	a3. xml も ID も指定しない、何も表示しない SceneGraph

	a1 の時はポリゴンデータ(data[])を生成するわけだけど、
	a2 でも、オリジナルと同じ data[] を持つ必要は(今は)ない。
	なので、a2 の場合、data[] は a1 と同じ場所を指せば良い。
	しかし、今までは、SceneGraph::~SceneGraph では
	どんな SceneGraph でも

	  delete [] data;

	とかやってたので、それならということで

	b1. a1 用の、Desturctor で data[] を delete する finalize_original()
	b2. a2,a3 用の、data[] を削除しない finalize_copy()

	を用意し、a1,a2,a3 の Consturoctor で、どっちかを設定する。

2009-01-30  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* spe/DrawSpan.cpp (DrawSpan::drawDot1): add
	span->length_x == 1 の処理。

	(DrawSpan::drawDot2): add
	Dot1 の続き。要は Dot1 で load して、Dot2 で wait->書き込みって感じ
	しかし、1ドットだとそこまで待つ必要もないかなって感じなので
	今は Dot 2には何も書いてない。ちゃんとしらべて、必要そうだったら
	ここで書き込みを行う

	(DrawSpan::drawLine1): add
	span->length_x > 1 の処理。
	いくつか Load パターンを考えてる途中

	1. 全部 load
	  1. z buf で描きこむと判断したとき、その pixel の texture tile を
	     load する。(すでにある、ないに関わらず。ある場合は、実際には
	     Load の処理は行われないが)
	  2. Line2 で描画する(ここで使う tile はすでに全部読み込まれてるとする

	2. 無い物だけload
	  1. 書き込むと判断したとき、tile があるかどうかを調べ
	     あればそのまま linebuf に、無ければ load を掛けて continue;
	     このとき、load した(つまりまだ書き込まれてない) 場所を覚えておく
	  2. Line2 で、1. で覚えた場所から再び計算して描画する。
	     tile はすでに全部読み込まれているとする

	まだあったけど忘れた。
	今のところ描画領域が 256x8、もしくは512x8 で、
	単純に考えて、領域pixel と texture pixel が一緒だと考えると
	一個の Span で最大 64 (512/8) 個の tile があればいいと考えられる。
	一個の SPE には Tile を 128 個持っておけるし、
	今は Span を二つ平行して処理しているので、
	途中で Tile が足りなくなる!ってことはないはず。
	とまあ、いろいろ考えてたんだけど、何書けばいいのか忘れた。。
	思い出したらまた書きます。

2009-01-26  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* spe/CreateSpan.cpp (CreateSpan::run): fix
	ポリゴンをx軸に水平に分割し、その二つを計算するってのが
	half_triangelで、上としたで、何故か渡すテクスチャの情報が違う。
	なんでだろうと思いつつも、今まで特に問題が出なかったから無視してたが、
	今回、三つのSceneGraph を動かしてる時に問題発生。
	それぞれ違うテクスチャを貼ってるのに、なぜかそれらのうちの半分が
	別のテクスチャが貼られていた。簡単に言うと、A,B,C の SG があった。 

	A: 正常
	B: 右上だけ A のテクスチャ
	C: 右上だけ A のテクスチャ

	といった具合。わけがわからなかったんだが、
	half_triangle に渡すやつの所為だと気づきました
	なんでここだけ pp->tri[0].tex_info.addr とか渡してんのか未だに謎。
	単なる書き間違いか直し間違いか。微妙なところ。
	これ書いた後輩はもう居ない
	

	* SceneGraphIterator.cpp (SceneGraphIterator::hasNext)
	(SceneGraphIterator::next): fix
	検索する引数を int id に変更。
	
	* SceneGraph.h (class SceneGraph): add variable
	int flag_drawbale : この SceneGraph は描画する物かどうか
	int sgid : SceneGraph の ID 。ID は SGList.h にあるものを使う

	* SceneGraphIterator.cpp : add file
	SceneGraph を走査する用。
	基本、Java の Iterator を参考にしてます。
	追加機能としては

	- hasNext(const char* name);
	名前が name の SceneGraph があるかどうか

	- next(const char* name);
	名前が name の SceneGraph まで進ませる

	* SceneGraphIterator.cpp : TODO
	hasNext とかは名前じゃなくて ID が良いかなーとも思うけどね。
	てかその方がいいな。あとで直します
	
	* ieshoot.cpp (ieboss_move): add
	(ieboss_collision): add
	BOSSの動きを追加。
	IETAMA が数回衝突したら BOSS を消すって処理。

	* SceneGraphIterator.cpp (SceneGraphIterator::next): fix
	break してなかった。そりゃ取れないわ

	* SceneGraph.cpp (SceneGraph::realRemoveFromTree): fix

	< p1 = p1->next;
	< p = p->next;
	=====
	> p1 = p1->brother;
	> p = p->brother;
	

	* viewer.cpp (Viewer::run_draw): fix
	Spanの無い部分を塗りつぶす処理はタスクを走らせず、
	そのまま memset とかの方が早い。
	まとめてするタスクを立ち上げるってのもいいかもしれない。
	あと、memsetで指定する値が、0xFF と 0x00 とで速度が違う。
	universe だと、

	0xFF 24fps
	0x00 30fps

	なんだろう。0x00 だと、ただのクリアになるから速いってことかな。

	* Camera.h (class Camera): add
	とりあえず Camera を作って、これを SceneGraph の Top にした。

	* SceneGraph.cpp (SceneGraph::realRemoveFromTree): add
	realRemove() の Tree構造用。削除後の tree top を返す様にしている。
	まあ top が消えなければ返す必要も無いし、top が消えるってことは
	SceneGraph そのものが消えるってことでそうは無い・・はずだけどね。
	(SceneGraph::realRemoveFromList): add
	realRemove() の list用。削除後の list top を返す様にしている。
	(SceneGraph::realRemoveFromTree): fix
	< p->next = p1->next;
	===
	> p->brother = p1->brother;

2009-01-25  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* add (tools/create_sglist): new
	必要な SceneGraph xml file から SceneGraph を抽出し、
	名前と対応する ID を SGList.h に出力する。
	また、名前から ID を求める sglist_table を SGList.cpp に出力する。
	
	* SceneGraph.cpp (SceneGraph::remove): add
	User API。ここで削除するのではなく、まずはフラグを立てるだけ
	ここですぐに消すと、allExecute() の走査で何気に困る

	(SceneGraph::isRemoved): add
	この SceneGraph 削除フラグが立っているかどうか
	
	(SceneGraph::realRemove): TODO
	子を持つ SceneGraph が消された場合、
	その子孫を全て削除するかどうか。まあ削除するのかな。

	(SceneGraph::realRemove): add
	Cerium System で呼ばれる。
	remove flag の立った SceneGraph を削除する。
	parentやbrother、next は繋ぎ直す。

	* SceneGraphRoot.cpp (SceneGraphRoot::addNext): add
	sg_available_list に追加していく
	木の操作が要らないアクセスの際にはこっちの方がいい。

	(SceneGraphRoot::setSceneData): add
	Cerium に SceneGraph の tree を渡す。Cerium はこの tree を辿って
	処理を行う
	
	(SceneGraphRoot::createFromXMLfile): add
	xml file を指定して、そこから SceneGraph を生成し、
	sg_src に格納する。ユーザはこの SceneGraph を直接は扱えない。
	以下に示す createSceneGraph の、読み込み元データとして保存しておく。
	
	(SceneGraphRoot::createSceneGraph): add
	オリジナルの SceneGraph を clone してユーザに返す。
	この SceneGraph をユーザが操作する。
	
	* SceneGraphRoot.h (class SceneGraphRoot): new variables
	sg_src, sg_exec_list, sg_draw_list, sg_available_list

	* addfile (SceneGraphRoot.cpp)
	SceneGraph を管理するクラス、ってところか。
	Root ってのは SceneGraph という名前からすると
	一番親と思われそうで微妙です。変えるかも。

2009-01-12  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* Joystick.cpp: TODO
	使用している Joystick が

	1. PS3 コントローラ
	2. PS2 コントローラにUSB変換をかましたやつ

	によってボタンの番号配置が違うので
	そこを自動的に取得して割り振りたい

	SDL_JoystickName() で名前取れるんだけど
	全部共通なのかなー。「PS3って文字列があるか否か」でわけてもいいけど
	
	* Joystick.cpp: fix
	コントローラボタンの番号を PS3 コントローラに合わせました。

	- 参考
	PS3 Linux SDLでプログラミング -コントローラを使う-
	http://yun.cup.com/ps3sdl007.html

	アナログスティックの方はまだです
	
2009-01-08  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* spe/DrawSpanRenew.cpp (DrawSpanRenew::run): fix
	next_spack を free() していたが、do-while の最初で
	next_spack = NULL とかやっている。
	DrawSpan だと、free するのは free_spack ってやつなので
	問題なかったが、なぜここは free(next_spack) とかやってるのか。
	というわけで、next_spack,spack 両方用の
	free_spack1, free_spack2 を生成して、これを free させることに。
	これで、ようやくまともに動くようになった。けど微妙です。
	遅いですね。

	* addFile : DrawSpanRenew.cpp
	DrawSpan の再起動 ver。

2008-12-22  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* fix
	charles を Fedora 10 に上げて、コンパイラが新しくなったせいか、
	以下のような warning が出始めた

	warning: deprecated conversion from string constant to 'char *'

	まあよくわからんが、例えば

	char *str = "hoge";

	みたいな所だとこの warning が出る。これを

	const char *str = "hoge";

	にすると消えた。
	以後こういう形に統一しろよ的なやつなのかな。

2008-12-19  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* viewer.cpp (Viewer::run_draw): fix
	startx, endx に対して、start_y, end_y って名前は統一されてなくて
	わかりづらいので、starty, endy に変更

	* main.cpp (init): fix
	bpp (BitsPerPixel) の値がデフォルトで 0 になっていた。
	今のレンダリング方式では 32 がデフォルトなので、間違ってた。
	今まで気づかなかったのは

	1. SDL_SetVideoMode に bpp = 0 で渡される
	2. SDL が開発・実行環境に合わせて bpp を設定
	3. 今までそれが 32 になってた

	しかし、ゲーム班の環境では bpp = 16 になってしまったため、
	その次の bitmap の allocate の時に 
	screen->pitch*height = 16*width*height となり、
	DrawSpan では 32 のつもりで書き込んでいたため領域外への
	メモリ書き込み->エラー

	ゲーム班ありがとう
	
2008-12-16  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* SceneGraph.cpp (makeTapestry): add
	SceneGraph::get_data にあったけど、ごちゃごちゃしてたので
	関数として生成

	* viewer.cpp (Viewer::run_init, Viewer::run_draw): fix
	* spe/DrawSpan.cpp (DrawSpan::zRow_init): delete

	Z Buffering に使う zRow は DrawSpan で毎回生成、初期化するのではなく、
	PPE で生成、初期化を行っておき、DrawSpan に add_inData で
	DMA で渡すという方法に変更。速度的にはほんのちょっとしか(ry
	
	* spe/CreateSpan.cpp (CreateSpan::half_triangle): fix
	getScale に渡す tex_width,tex_height を修正。
	比較にそのまま tex_width, tex_height を使うと、
	Span が持つテクスチャが全体の一部分だったとしても
	比較結果で縮小が行われてしまうため。

	- 例
	span->length_x = 32;
	tex_width = 128;
	tex_x_len = (span->tex_x2 - span->tex_x1) = (0.5 - 0.3) = 0.2;

	今までの処理だと、span->length_x < tex_width の結果により
	縮小されたテクスチャを使うことになる。
	しかし、実際に Span が使う Texture の長さは

	  tex_width*tex_x_len = 24

	なので、縮小を行う必要は無い
	

2008-12-12  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>

	* SceneGraph.cpp (SceneGraph::get_data): Todo
	テクスチャの縦横が 8 の倍数でなければ弾く処理を入れる。

	* spe/DrawSpan.cpp (DrawSpan::run): Todo
	テクスチャの座標計算と、そこから取得できる Tile の DMA を
	一スレッドで処理しているのでそれを分けないといけない

	* spe/CreateSpan.cpp (getTapestry): Add
	(getScale): Add

	* memo: 雑記
	ようやくこいつに ChangeLog を加えました。
	なんか emacs で「C-x 4 a」とかすると、ChangeLog の entry が
	加えれられるんだけど、上の階層のを探しにいくので、TaskManager/ のに
	加えようとしてたわけさ。まあそういう仕様なんだけど。
	で、だからといって不可能ってわけじゃないから書けばよかったんだが。

	要するに、これからはちゃんと書いていこうと思います。