# HG changeset patch # User gongo@gendarme.cr.ie.u-ryukyu.ac.jp # Date 1233972654 -32400 # Node ID 6b06734f1b3ab5c9658a999b19669e0660b07bfc # Parent f7f53d2387f3e620abe27c6871f5d9e480e88b3d 5章あと少し diff -r f7f53d2387f3 -r 6b06734f1b3a paper/cerium.tex --- a/paper/cerium.tex Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/cerium.tex Sat Feb 07 11:10:54 2009 +0900 @@ -11,10 +11,13 @@ \begin{itemize} \item SceneGraph が持つ Polygon の座標から、実際に画面に表示する座標の - 計算を行い、PolygonPack (\ref{sec:cerium_rendering_pp}節) を生成する + 計算を行い、PolygonPack (\ref{sec:cerium_rendering_data}節) を生成する + SceneGraph2PolygonPack タスク (\ref{sec:cerium_rendering_s2p} 節) \item PolygonPack から、同じ Y 座標を持つ線分の集合 - SpanPack (\ref{sec:cerium_rendering_span}節) を生成する + SpanPack (\ref{sec:cerium_rendering_data}節) を生成する + PolygonPack2SpanPack タスク (\ref{sec:cerium_rendering_p2s} 節) \item SpanPack を、Texture を読み込みながら Z Buffer を用いて描画する + DrawSpan タスク (\ref{sec:cerium_rendering_draw_span} 節) \end{itemize} \begin{figure}[htb] @@ -29,7 +32,9 @@ さらに、この3つのタスクは表示画面毎にパイプライン的に実行される。 そのため、Cerium では並列度を維持することが出来る。 -Cerium は C++ で実装されており、プログラム行数は 6919 行である。 +Cerium は C++ で実装されており、画像の読み込みや入力デバイスは +SDL を用いて行っている。 +%プログラム行数は 6919 行である。 \section{SceneGraph} \label{sec:cerium_scene_graph} @@ -49,9 +54,26 @@ \end{center} \end{figure} -\subsection{Scene の生成} +SceneGraph のノードは以下のようなデータと動作を持つ。 + +\begin{itemize} +\item データ + \begin{enumerate} + \item Vervatim: ポリゴンオブジェクトの頂点座標 + \item Texture: ポリゴンオブジェクトのテクスチャ座標 + \item TextureImage: テクスチャイメージ + \item TransMatrix: ポリゴンオブジェクトの変換行列 + \item Corrdinates: オブジェクトの座標 + \item Angle: オブジェクトの角度 + \end{enumerate} +\item 動作 + \item Move: 自律的なオブジェクトの動き + \item Collision: 他のノードと衝突したときの動き +\end{itemize} + +\subsection{Scene ポリゴンの生成} ゲーム中に登場するオブジェクトは、オープンソースの -3DCG制作ソフトである Blender \cite{blender} を用いる。 +3Dモデリングツールである Blender \cite{blender} を用いる。 Blender で記述したポリゴンオブジェクトを、座標やテクスチャイメージを 埋め込んだ xml ファイルとして出力する。 Blender にはPython インタプリタがあり、杉山 \cite{chiaki} が独自形式の @@ -79,8 +101,8 @@ -0.002805 0.996740 ・・・・ - - (base64 でデコードされたテクスチャイメージ) + + (base64 エンコードデコードされたテクスチャイメージ) @@ -99,10 +121,811 @@ また、Cerium が将来的にネットワークを使用することを考えており、 その際に有効なフォーマットであると考えたからである。 +\subsection{SceneGraph オブジェクトの生成} \label{sec:cerium_sg_create} + +Cerium は 生成された xml ファイルから、そのパラメータを持つ +SceneGraph オブジェクトを生成する (Original Scene Graph)。 +ここで作られたオブジェクトはユーザには見せず、 +ユーザが該当する SceneGraph を生成したい場合は Orignal を参照し、 +そのコピー (Copy Scene Graph) を渡す (\figref{cerium_sg_create}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{images/cerium_sg_create.pdf} + \caption{SceneGraph の生成} + \label{fig:cerium_sg_create} + \end{center} +\end{figure} + +\figref{cerium_sg_create} の Original SceneGraph Database は +Cerium が配列として持っており、 +xml ファイルを読み込んで生成された SceneGraph を、SceneGraph ID の位置に +格納する。SceneGraph ID は SceneGraph に割り振られるグローバルIDである。 +Blender の時点では、SceneGraph の名前は付けられるが、ID(番号) をユーザが +決定、管理するのは難しい。そこで、xml ファイルから自動的に ID を決定する +スクリプトを作成した (\figref{cerium_sg_createlist}) 。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.6]{images/cerium_sg_createlist.pdf} + \caption{SceneGraph ID の決定} + \label{fig:cerium_sg_createlist} + \end{center} +\end{figure} + +ゲームに使用する xml ファイルを指定して、SGList.h と SGList.cpp を生成する。 +SGList.h には各 SceneGraph の名前に対応する ID が割り振られている。 +SGList.cpp のsglist とは、Cerium が xml ファイルを読み込んで、 +SceneGraph の名前が分かったとき、 +その名前がどの ID を持つかを求めるための配列である。 + \subsection{SceneGraph の操作} -Cerium では SceneGraph を管理するクラスとして SceneGraphRoot を実装している。 -SceneGraphRoot は、 +Cerium では、\ref{sec:cerium_sg_create} 節で述べたような、 +xml ファイルのロード、SceneGraph の生成など、SceneGraph を管理するクラスとして +SceneGraphRoot クラスを実装している。 +SceneGraphRoot では、ユーザが生成した SceneGraph を持ち、 +カメラ、ジョイスティックなどの入力デバイスの管理を行う。 + +以下は SceneGraphRoot の構造である。 + +\begin{verbatim} +typedef SceneGraphRoot *SceneGraphRootPtr; + +class SceneGraphRoot +{ + // xml から読み込んだ、オリジナルの SceneGraph + SceneGraphPtr *sg_src; + + // move, collision 用の SceneGraph + SceneGraphPtr sg_exec_tree; + + // 描画用の SceneGraph List + SceneGraphPtr sg_draw_tree; + + // コントローラーオブジェクト (Keyboard, Joystick, ..) + Pad *controller; + + // カメラオブジェクト + Camera *camera; +}; +\end{verbatim} + +SceneGraphRoot と SceneGraph の API をそれぞれ +\tabref{cerium_sg_rootapi}、\tabref{cerium_sg_api}に示す。 + +\begin{table}[htb] + \begin{center} + \caption{SceneGraphRoot API} \label{tab:cerium_sg_rootapi} + \hbox to\hsize{\hfil + \begin{tabular}{l|l} \hline \hline + createFromXMLfile(char *xmlname) & xml ファイルから \\ + & Original SceneGraph を生成する \\ \hline + createSceneGraph(int id) & ID に対応する SceneGraph を生成する \\ \hline + setSceneData(SceneGraoh* top) & セットした SceneGraph を辿って \\ + & Cerium が処理を行う \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + +\begin{table}[htb] + \begin{center} + \caption{SceneGraphRoot API} \label{tab:cerium_sg_api} + \hbox to\hsize{\hfil + \begin{tabular}{l|l} \hline \hline + addChild(SceneGraph*) & 自身に子を追加する \\ \hline + addBrother(SceneGraph*) & 自身に兄弟を追加する \\ \hline + remove(void) & 自身を削除する \\ \hline + set\_move(move\_func move) & 自身の move を設定する\\ \hline + set\_collision(coll\_func collision) & 自身の collision を設定する\\ \hline + translate\{X, Y, Z\}(float) & 自身の、各軸に平行な移動 \\ \hline + rotate\{X, Y, Z\}(float) & 自身の、各軸に対する回転 \\ \hline + \end{tabular}\hfil} + \end{center} +\end{table} + + +%SceneGraphRoot は \verb+sg_exec_tree+ と \verb+sg_draw_tree+ の二つを持つ。 +%\verb+sg_exec_tree+ で各 SceneGraph の move と collison を行った後、 +%処理後のノードをコピーして保存しておく。その後 \verb+sg_exec_tree+ が +%\verb+sg_draw_tree+ へ遷移し、保存してある SceneGraph を新たな +%\verb+sg_exec_tree+ として使用する。SceneGraph のコピーを行うのは、 +%SceneGraph の処理を SPE で行わせることが目的だからである。 +%SceneGraph の全てを SPE 上に置けない場合、コピーをせず +%木の操作をするのは困難である。 + + +\subsection{例題} + +以下のコードは、地球と月のオブジェクトがそれぞれ +回転しながら移動するという SceneGraph を記述したものである。 + +\begin{verbatim} +void +create_sg(void) +{ + SceneGraphRoot *sgroot = new SceneGraphRoot; + + // xml ファイルを読み込み、Original Scene Graph を生成 + sgroot->createFromXMLfile("universe.xml"); + + // ID を指定して SceneGraph を生成(Original からのコピー) + SceneGraph *earth = sgroot->createSceneGraph(EARTH); // 地球 + SceneGraph *moon = sgroot->createSceneGraph(MOON); // 月 + + earth->set_move(earth_move); + moon->set_move(moon_move); + + // 親子関係の設定 + earth->addChild(moon); + + // SceneGraph をセット + sgroot->setSceneData(earth); +} + +/** + * @param node 自身 (この場合は moon) + */ +void +moon_move(SceneGraph *node) +{ + // y軸 で 3度回転 + node->rotateY(3.0f); +} + +/** + * @param node 自身 (この場合は earth) + */ +void +earth_move(SceneGraph *node) +{ + // y軸 で 1度回転 + node->rotateY(1.0f); + + // x,y 軸方向にそれぞれ平行移動 + node->translateX(3.0f); + node->translateY(3.0f); +} +\end{verbatim} + +実行結果を \figref{cerium_sg_example} に示す。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.5]{images/cerium_sg_example.pdf} + \caption{SceneGraph 例題} + \label{fig:cerium_sg_example} + \end{center} +\end{figure} + +この SceneGraph では、地球が自転と平行移動、月が自転を行うもので、 +地球の平行移動、回転に合わせて月が付いてきており、 +親子関係が正常に動作していることが確認できた。 +地球と月は Blender で、球体にそれぞれのテクスチャを貼付けて作成した。 + \section{Rendering Engine} \label{sec:cerium_rendering} + +Rendering Engine では、SceneGraph から、 +実際に表示するポリゴンの抽出 (\ref{sec:cerium_rendering_s2p}節)、 +ポリゴンから Span の生成 (\ref{sec:cerium_rendering_p2s}節)、 +Span に RGB をマッピングし描画する部分 +(\ref{sec:cerium_rendering_draw_span}節) と3つに分けることが出来る。 + +ここでいう Span とは、ポリゴンに対するある特定の Y 座標に関するデータを +抜き出したものである (\figref{cerium_rendering_span})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{images/cerium_rendering_span.pdf} + \caption{Span} + \label{fig:cerium_rendering_span} + \end{center} +\end{figure} + +\subsection{Rendering で使うデータの構造} \label{sec:cerium_rendering_data} + +レンダリング処理は SPE で行うことを前提とし、 +それに合わせたデータ構造を採用している。 + +\subsubsection{PolygonPack} + +PolygonPack は、SceneGraph から抽出されたポリゴンの集合である。 +以下に構造を示す。 + +\begin{verbatim} +// ポリゴンを構成する辺の情報 +typedef struct VertexPack { + // 座標 (x, y, z) + float x; + float y; + float z; + // テクスチャの座標 + float tex_x; + float tex_y; +} VertexPack, *VertexPackPtr; + +// テクスチャ情報 +typedef struct TriTexInfo { + uint32 *addr; // テクスチャイメージのアドレス + int width; // 幅 + int height; // 高さ + int scale_max; // 縮小率 +} TriangleTexInfo, *TriangleTexInfoPtr; + +typedef struct PolygonPack { + struct PORIGON_info { + int size; + int light_pos[3]; // 光源の位置 + int light_rgb[3]; // 光源の色 + }info; + + TrianglePack tri[MAX_SIZE_TRIANGLE]; + PolygonPack* next; +}PolygonPack, *PolygonPackPtr; +\end{verbatim} + +PolygonPack は光源やテクスチャ、頂点の情報から構成される。 +テクスチャの縮小率に関しては \ref{sec:cerium_rendering_texture_scale} 節で後述する。 + +\subsubsection{SpanPack} + +SpanPack は、ポリゴンから抽出された Span の集合である。 +以下に構造を示す。 + +\begin{verbatim} +class Span { +public: + // テクスチャ情報 + uint32 *tex_addr; + int tex_width; + int tex_height; + + int y; // y 座標 + int x; // span の開始 x 座標 + int length_x; // span の長さ + + // span のz 座標(開始、終了) + float start_z, end_z; + + // span に対応するテクスチャの座標 + float tex_x1, tex_x2, tex_y1, tex_y2; +} + + +class SpanPack { +public: /* fields */ + struct SpanInfo { + int start; + int size; + int y_top; + int light_pos[3]; + int light_rgb[3]; + } info; + + Span span[MAX_SIZE_SPAN]; + SpanPack *next; +}; +\end{verbatim} + +Span は、その座標と、対応するテクスチャの座標を持つ +(\figref{cerium_rendering_span_tex})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{images/cerium_rendering_span_tex.pdf} + \caption{Span構造} + \label{fig:cerium_rendering_span_tex} + \end{center} +\end{figure} + +レンダリングには、この SpanPack を用いる。 + +ここからは、レンダリングの役割を果たす3つのタスクを説明する。 + +\subsection{SceneGraph2PolygonPack} \label{sec:cerium_rendering_s2p} + +SceneGraph の move や collision を行い、 +各オブジェクトの変換行列が生成されたら、SceneGraph が持つ +ポリゴンの座標に変換行列をかけ、得られた座標を PolygonPack に格納していく。 +以下がそのコードである。 + +\begin{verbatim} +SceneGraph *sg = sg_draw_list; +float xyz[4]; + +// ポリゴンの 1辺 +xyz[0] = sg->coord[i*3]; +xyz[1] = sg->coord[i*3+1]; +xyz[2] = sg->coord[i*3+2]*-1; +xyz[3] = 1; + +// matrix = SceneGraph の変換行列 +ApplyMatrix(xyz, sg->matrix); + +// 格納する PolygonPack と +PolygonPackPtr pp = new PolygonPack; +TrianglePack *triangle = &pp->tri[pp->info.size++]; + +triangle->ver1.x = xyz[0]; +triangle->ver1.y = xyz[1]; +triangle->ver1.z = xyz[2]; +triangle->ver1.tex_x = sg->tex_pos[i*3]; +triangle->ver1.tex_y = sg->tex_pos[i*3+1]; +\end{verbatim} + +この処理を全ての SceneGraph に行い、PolygonPack を生成していく。 + +\subsection{PolygonPack2SpanPack} \label{sec:cerium_rendering_p2s} + +生成された PolygonPack に格納されているポリゴンから、Span を抽出していく。 +Span は x 軸に平行な線分を表しているため、始めにポリゴンを水平に分割して +二つの三角形にして、それぞれに対して Span を求める \cite{akira} +(\figref{cerium_rendering_half})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{images/cerium_rendering_half.pdf} + \caption{Span生成時のポリゴン分割} + \label{fig:cerium_rendering_half} + \end{center} +\end{figure} + +得られた Span を SpanPack に格納する場合、 +その SpanPack が持つ全ての Span の y 座標が一定範囲内に入る様にする。 + +レンダリングする場合、画面を複数の領域に分割しそれぞれを +一つのタスク (\ref{sec:cerium_rendering_draw_span}節) で担当する。 +Cerium では レンダリング時に Z Buffer を用いているため、 +同じタスクに違う領域の Span があると正常に描画できない。 +そこで、一つの SpanPack には決まった y 座標を持った +span だけを入れることにより、レンダリング時には独立して行うことができる。 +今回は、y の範囲を 8 とした (\figref{cerium_rendering_spack})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{images/cerium_rendering_spack.pdf} + \caption{SpanPack の割り当て} + \label{fig:cerium_rendering_spack} + \end{center} +\end{figure} + + +\subsection{Rendering するための準備} + +SpanPack が出来れば、あとは Span を見ていき、対応する RGB 値を +テクスチャイメージから取り出して +フレームバッファに書き込むだけである。しかし、ここで問題がある。 +SPE のメモリ領域は 256KB しかないため、Span が参照している +テクスチャイメージ全てを送ると動かなくなる可能性がある。 + +そこで我々は、テクスチャイメージに対していくつかの操作を行った。 +ここからは、その詳細について説明する。 + + +\subsection{Texture の分割} \label{sec:cerium_rendering_texture_split} + +テクスチャは、SDL\_image \cite{sdl_image} の API である IMG\_Load を使用して +読み込む。その後画像は1ピクセル32ビット(RGB$\alpha$)のデータに変換される。 + +SPE のメモリ領域は 256KB しかないため、テクスチャ全て送ると +動かなくなる可能性がある。 +そこで、テクスチャを分割し、そのブロック毎で送ることにした。 +そのブロックを Tile と呼び、分割単位は 8x8 とする +(\figref{cerium_rendering_tile})。 +Tile は \figref{cerium_rendering_tile} のような順番で配列に変換する。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{images/cerium_rendering_tile.pdf} + \caption{Texture の分割 (Tile)} + \label{fig:cerium_rendering_tile} + \end{center} +\end{figure} + +span が持つテクスチャのアドレスはこの配列を指しており、 +描画する span 中の 1 pixel の座標から、どの Tile かを計算する。 +その Tile をメインメモリから DMA で持って来て +RGB 値を取り出す。コードは以下の様になる。 + +\begin{verbatim} +#define TEXTURE_SPLIT_PIXEL 8 +#define TEXTURE_BLOCK_SIZE 8*8 + +/** + * テクスチャの座標から、 + * テクスチャのどのブロックかを求める + * + * @param tx X coordinates of texture + * @param tx Y coordinates of texture + * @param twidth Width of texture + * @return block ID + */ +int +getTexBlock(int tx, int ty, int twidth) +{ + int blockX, blockY; + + blockX = tx / TEXTURE_SPLIT_PIXEL; + blockY = ty / TEXTURE_SPLIT_PIXEL; + + return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY; +} + +/** + * block ID と、テクスチャの TOP address から + * (tx,ty) で使われるテクスチャの Tile addres を求める + * + * @param tx X coordinates of texture + * @param tx Y coordinates of texture + * @param tw Width of texture + * @param tex_addr_top (tx,ty) で使うテクスチャの先頭address + * @return block ID + */ +uint32* +getTile(int tx, int ty, int tw, uint32 *tex_addr_top) +{ + int block = getTexBlock(tx, ty, tw); + return tex_addr_top + block*TEXTURE_BLOCK_SIZE; +} + +/** + * texture の座標から、Tile が持つ RGB 値を返す + * + * @param tx X coordinates of texture + * @param tx Y coordinates of texture + * @param addr Tile address (return getTile()) + */ +uint32 +get_rgb(int tx, int ty, uint32 *tile) +{ + uint32 pixel[TEXTURE_BLOCK_SIZE]; + + smanager->dma_load(pixel, tile, + sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag); + smanager->dma_wait(tag); + + return pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx]; +} + +\end{verbatim} + +\subsection{SPE 上での Tile の管理} \label{sec:cerium_rendering_texture_hash} + +\ref{sec:cerium_rendering_texture_split} 節で求めた Tile を毎回 +DMA で転送するのは効率が悪い。 +そこで、SPE 上にいくつか Tile を置ける領域を予め作っておき、 +DMA 転送してきた Tile を保存しておく。 +描画する span が、すでに SPE 上にある Tile を参照する場合、そのままそれを使い、 +それ以外の Tile を参照し且つ領域が満杯の場合、 +一番最初に保存した Tile を削除して、 +新しくきた Tile を保存するという FIFO で Tile を管理する。 +Tile の検索はハッシュを用いる。ハッシュ値は Tile のアドレスを使用している。 + +コードは以下の様になる。 + +\begin{verbatim} +#define TEXTURE_BLOCK_SIZE 8*8 + +// SPE 上での Tile の構造 +typedef struct { + uint32 pixel[TEXTURE_BLOCK_SIZE] // Tile の実データ; + uint32 *texture_addr // Tile のメインメモリのアドレス; +} Tile, *TilePtr; + +// Tile リスト +class TileList { +public: + int curIndex; + Tile tile[MAX_TILE]; + + /** + * 次に扱う tile を取得する + * + * @return tile + * + * tile[] をリングバスとして + * FIFO を実現する + */ + TilePtr nextTile(void) { + TilePtr t = &tile[curIndex]; + curIndex = (curIndex + 1) % MAX_TILE; + return t; + } +}; + +TileListPtr tileList; + +/** + * 新しい Tile を登録する + * 一番古い Tile は順次削除していく + * + * @param addr Tile のアドレス(メインメモリ空間) + */ +void +set_rgb(uint32 *addr) +{ + TilePtr tile; + + // 新しい Tile の登録 + tile = tileList->nextTile(); + hash->remove(tile->texture_addr); + tile->texture_addr = addr; + + // hash に登録 + hash->put(tile->texture_addr, tile); + + // DMA 転送 (PPE->SPE) + smanager->dma_load(tile->pixel, (uint32)addr, + sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag); +} + +/** + * Tile のアドレスから、テクスチャイメージデータを返す + * + * @param tx X coordinates of texture + * @param tx Y coordinates of texture + * @param addr tile address + * @return Image data + * +uint32 +get_rgb(int tx, int ty, uint32 *addr) +{ + TilePtr tile; + + tile = hash->get(addr); + return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx]; +} +\end{verbatim} + +\ref{sec:cerium_rendering_texture_split}節で説明した get\_rgb() も +ハッシュを導入したことにより変更されている。 + +現在、SPE 上で保存する Tile は 128 個としている。 +領域は \verb+global_alloc()+ (\ref{sec:tm_sm_global} 節)で確保する。 + +\subsection{Texture の縮小} \label{sec:cerium_rendering_texture_scale} + +遠くにいるオブジェクトに対して、原寸のテクスチャを貼る必要はなく、 +経験的に荒いテクスチャを貼っても問題ないと考えられる。 +そこで、オリジナルのテクスチャに対して縮小したものを用意し、 +オブジェクトがどれだけ離れているかによって、縮小率を変えたテクスチャを +使うことにする。 + +まず、オリジナルのテクスチャの最大縮小率を求める。 +テクスチャは縦横ともに 1/2、1/4、1/8 と、2分の1ずつ縮小させる。 +また、後に Tile に分割しなければならないため、縦、横ともに +8の倍数を保つようにする。 +テクスチャの width、height から、最大縮小率を求めるコードが以下になる。 + +\begin{verbatim} +// tex_w 原寸幅 +// tex_h 原寸高さ +// TEXTURE_SPLIT_PIXEL 8 +while (tex_w % TEXTURE_SPLIT_PIXEL == 0 && + tex_h % TEXTURE_SPLIT_PIXEL == 0) { + all_pixel_num += tex_w*tex_h; + tex_w /= 2; + tex_h /= 2; + scale *= 2; +} + +scale /= 2; +\end{verbatim} + +これで 最大縮小率 (scale = テクスチャを 1/(scale*2) する) が求められる。 + +次に、scale を使ってテクスチャを縮小する。 +縮小したテクスチャ毎に Tile で分割し、全ての縮小率で求めた Tile を繋げて +Tile Array とする (\figref{cerium_rendering_tex_tapestry})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.8]{images/cerium_rendering_tex_tapestry.pdf} + \caption{Texture の縮小 (Tapestry の生成)} + \label{fig:cerium_rendering_tex_tapestry} + \end{center} +\end{figure} + + +ここでは、縮小された画像を Tapestry と呼ぶ。 +SceneGraph や PolygonPack の時点ではテクスチャイメージとして、 +\figref{cerium_rendering_tex_tapestry} における、TileArray の先頭 +(Tapestry 1) のアドレスを持つ。 +そして、PolygonPack2SpanPack (\ref{sec:cerium_rendering_p2s}節)の中で、 +span の長さと使用するテクスチャの長さの比率を調べ、それに適した +Tapestry を Span のテクスチャイメージとする。 +以下が、Span で使用するテクスチャの scale を求め、その scale にあった +Tapestry を決定するコードである。 + +\begin{verbatim} +/** + * span の width,height と texture の width,height を比べて + * span を描画する際に使う texture の比率を求める + * + * @param[in] width Width of span + * @param[in] height Height of span + * @param[in] tex_width Width of 1/1 texture that span use + * @param[in] tex_height Height of 1/1 texture that span use + * @param[in] scale_max この Span で使う texture の最大縮小率 + * 計算結果が scale_max 以上になるのを防ぐ + * @return 描画に使う texture の比率 + * width と height は 1/scale の画像を使う + * + */ +static int +getScale(int width, int height, + int tex_width, int tex_height, int scale_max) +{ + int base, tex_base; + int scale = 1; + + /** + * width と height で、長い方を基準に、 + * texture の scale を決める + */ + if (width > height) { + base = width; + tex_base = tex_width; + } else { + base = height; + tex_base = tex_height; + } + + if (tex_base > base) { + int t_scale = tex_base/base; + + while (t_scale >>= 1) { + scale <<= 1; + } + } + + return (scale > scale_max) ? scale_max : scale; +} + +/* + * scale の値から、各 Tapestry の先頭アドレスを返す + * + * @param[in] tw Width of texture + * @param[in] th Height of texture + * @param[in] scale テクスチャの縮小率 (= 2^n) + * @param[in] addr_top TileArrayの先頭(Tapestry1) + * @return scale に対応する Tapestry のアドレス + */ +static uint32* +getTapestry(int tw, int th, int scale, uint32 *addr_top) +{ + int index = 0; + + for (int s = 1; s < scale; s <<= 1) { + index += tw*th; + tw /= 2; + th /= 2; + } + + return addr_top + index; +} +\end{verbatim} + +\figref{cerium_rendering_tex_tapestry} を見てわかるように +縮小すれば Tile の数は減るので、Span に必要な Tile の数も抑えられる。 +そのことにより、SPE 上での Tile の入れ替えも少なくなり、 +Tile のヒット率も上昇する。 + +\subsection{Rendering (DrawSpan)} \label{sec:cerium_rendering_draw_span} + +現在、PlayStation 3 の GPU にアクセスする API は公開されていないため、 +Cerium ではフレームバッファに描画する。 +フレームバッファのアドレスは mmap() で取得できるため、 +タスクの出力としてフレームバッファを指定するか、 +タスク内で DMA 転送を行えば (\ref{sec:tm_dma}節)、直接描画することができる。 + +通常の Linux で動作する場合も同様にフレームバッファに描画する。 +MacOSX の場合は SDL 経由で描画する。 + +レンダリングは DrawSpan というタスクで行う。 +受け取った SpanPack から Span を取り出す。 +Span の端から 1 pixel ずつ見ていき、その pixel の z 座標と Z Buffer を見比べ、 +描画するものとをわかれば、対応する RGB 値を書き込む。 + +また、DrawSpan は分割された画面領域の一部を担当するので、 +span がその領域を超えている場合は描画しない。 +現在、一つの DrawSpan が描画する領域は 256x8 としている +(\figref{cerium_rendering_draw_span})。 + +\begin{figure}[htb] + \begin{center} + \includegraphics[scale=0.7]{images/cerium_rendering_draw_span.pdf} + \caption{DrawSpan の担当領域} + \label{fig:cerium_rendering_draw_span} + \end{center} +\end{figure} + +{\small +\begin{verbatim} +/** + * Span から RGB 値を求め、FrameBuffer 用のバッファ (linebuf) に書き込む + * + * @param span Span + * @param startx DrawSpan が担当する領域開始の x 座標 + * @param endx DrawSpan が担当する領域終了の x 座標 + */ +void +DrawSpan::drawLine(SpanPtr span, int startx, int endx) +{ + int x = span->x; + int rangex = endx - startx + 1; + int x_len = span->length_x; + + int js = (x < startx) ? startx - x : 0; + int je = (x + x_len > endx) ? endx - x : x_len; + + /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */ + int tex_xpos, tex_ypos; + + // span の始点に対応する座標 (tex1, tey1) + float tex1 = span->tex_x1; + float tey1 = span->tex_y1; + + // span の終点に対応する座標 (tex2, tey2) + float tex2 = span->tex_x2; + float tey2 = span->tex_y2; + + // span の始点、終点に対応する z 座標 + float zpos1 = span->start_z; + float zpos2 = span->end_z; + + // Tile 内での座標 + int localx, localy = getLocalY(span->y-1); + + for (int j = js; j <= je; j++) { + float tex_x, tex_y, tex_z; + + localx = getLocalX(x-1+j); + tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1); + + // z 座標が小さいほど、画面に近い + if (tex_z < zRow[localx + (rangex*localy)]) { + uint32 *tex_addr; + int tex_localx; + int tex_localy; + + tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); + tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); + if (tex_x > 1) tex_x = 1; + if (tex_x < 0) tex_x = 0; + if (tex_y > 1) tex_y = 1; + if (tex_y < 0) tex_y = 0; + tex_xpos = (int)((span->tex_width-1) * tex_x); + tex_ypos = (int)((span->tex_height-1) * tex_y); + + tex_addr = getTile(tex_xpos, tex_ypos, + span->tex_width, span->tex_addr); + tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; + tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; + + + // SPE 上に 使用する Tile がない + if (!isAvailableTile(tex_addr)) { + set_rgb(tex_addr); + smanager->dma_wait(tag); + } + + int rgb = get_rgb(tex_x, tex_y, tex_addr); + + // Z Buffer の更新 + zRow[x + (rangex*y)] = zpos; + + // RGB 値の更新 + linebuf[x + (rangex*y)] = rgb; + } + } +} +\end{verbatim} +} + +タスク終了後、linebuf をフレームバッファに DMA 転送することで、描画が完了する。 + + +\section{Cerium を用いた学生によるゲーム開発} diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/amdahl.bb --- a/paper/images/amdahl.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/amdahl.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./amdahl.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 360 252 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cell_arch.bb --- a/paper/images/cell_arch.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cell_arch.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cell_arch.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 505 339 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cell_mailbox.bb --- a/paper/images/cell_mailbox.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cell_mailbox.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cell_mailbox.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 514 342 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cell_ppe.bb --- a/paper/images/cell_ppe.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cell_ppe.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cell_ppe.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 370 327 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cell_simd.bb --- a/paper/images/cell_simd.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cell_simd.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cell_simd.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 402 261 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cell_spe.bb --- a/paper/images/cell_spe.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cell_spe.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cell_spe.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 380 340 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cell_spurs_pipeline.bb --- a/paper/images/cell_spurs_pipeline.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cell_spurs_pipeline.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cell_spurs_pipeline.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 533 187 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cell_spurs_task.bb --- a/paper/images/cell_spurs_task.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cell_spurs_task.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cell_spurs_task.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 507 229 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_draw_span.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_draw_span.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_rendering_draw_span.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 591 313 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_draw_span.graffle Binary file paper/images/cerium_rendering_draw_span.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_draw_span.pdf Binary file paper/images/cerium_rendering_draw_span.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_half.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_half.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_rendering_half.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 372 274 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_half.graffle Binary file paper/images/cerium_rendering_half.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_half.pdf Binary file paper/images/cerium_rendering_half.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_spack.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_spack.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_rendering_spack.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 533 319 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_spack.graffle Binary file paper/images/cerium_rendering_spack.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_spack.pdf Binary file paper/images/cerium_rendering_spack.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_span.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_span.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_rendering_span.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 413 247 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_span.graffle Binary file paper/images/cerium_rendering_span.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_span.pdf Binary file paper/images/cerium_rendering_span.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_span_tex.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_span_tex.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_rendering_span_tex.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 408 420 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_span_tex.graffle Binary file paper/images/cerium_rendering_span_tex.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_span_tex.pdf Binary file paper/images/cerium_rendering_span_tex.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_tex_tapestry.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_tex_tapestry.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_rendering_tex_tapestry.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 563 305 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_tex_tapestry.graffle Binary file paper/images/cerium_rendering_tex_tapestry.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_tex_tapestry.pdf Binary file paper/images/cerium_rendering_tex_tapestry.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_tile.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_rendering_tile.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_rendering_tile.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 510 385 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_tile.graffle Binary file paper/images/cerium_rendering_tile.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_rendering_tile.pdf Binary file paper/images/cerium_rendering_tile.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_create.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_sg_create.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_sg_create.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 487 228 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_create.graffle Binary file paper/images/cerium_sg_create.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_create.pdf Binary file paper/images/cerium_sg_create.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_createlist.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_sg_createlist.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_sg_createlist.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 557 496 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_createlist.graffle Binary file paper/images/cerium_sg_createlist.graffle has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_createlist.pdf Binary file paper/images/cerium_sg_createlist.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_example.bb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/cerium_sg_example.bb Sat Feb 07 11:10:54 2009 +0900 @@ -0,0 +1,5 @@ +%%Title: ./cerium_sg_example.pdf +%%Creator: ebb Version 0.5.2 (+ArtBox) +%%BoundingBox: 0 0 625 466 +%%CreationDate: Sat Feb 7 11:08:56 2009 + diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_example.pdf Binary file paper/images/cerium_sg_example.pdf has changed diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_sg_tree.bb --- a/paper/images/cerium_sg_tree.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cerium_sg_tree.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cerium_sg_tree.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 425 274 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/cerium_task.bb --- a/paper/images/cerium_task.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/cerium_task.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./cerium_task.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 470 535 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/manycore_data_split.bb --- a/paper/images/manycore_data_split.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/manycore_data_split.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./manycore_data_split.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 587 154 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/manycore_step.bb --- a/paper/images/manycore_step.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/manycore_step.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./manycore_step.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 549 335 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_scheduler.bb --- a/paper/images/tm_scheduler.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_scheduler.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_scheduler.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 517 492 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_sm_global.bb --- a/paper/images/tm_sm_global.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_sm_global.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_sm_global.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 523 364 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_sm_rbuf.bb --- a/paper/images/tm_sm_rbuf.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_sm_rbuf.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_sm_rbuf.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 405 225 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_sm_state.bb --- a/paper/images/tm_sm_state.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_sm_state.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_sm_state.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 370 342 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_sm_wbuf.bb --- a/paper/images/tm_sm_wbuf.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_sm_wbuf.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_sm_wbuf.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 505 487 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_sort.bb --- a/paper/images/tm_sort.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_sort.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_sort.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 553 371 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_sort_calc.bb --- a/paper/images/tm_sort_calc.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_sort_calc.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_sort_calc.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 360 216 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_sync.bb --- a/paper/images/tm_sync.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_sync.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_sync.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 577 554 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_task_post.bb --- a/paper/images/tm_task_post.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_task_post.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_task_post.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 335 388 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/images/tm_task_struct.bb --- a/paper/images/tm_task_struct.bb Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/images/tm_task_struct.bb Sat Feb 07 11:10:54 2009 +0900 @@ -1,5 +1,5 @@ %%Title: ./tm_task_struct.pdf %%Creator: ebb Version 0.5.2 (+ArtBox) %%BoundingBox: 0 0 591 364 -%%CreationDate: Fri Feb 6 10:30:52 2009 +%%CreationDate: Sat Feb 7 11:08:56 2009 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/manycore.tex --- a/paper/manycore.tex Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/manycore.tex Sat Feb 07 11:10:54 2009 +0900 @@ -1,4 +1,4 @@ -\chapter{Many Core Architecture 上でのプログラミング} \label{chapter:manycore} +\chapter{Many Core プログラミング} \label{chapter:manycore} Many Core プログラミングは、一つのマシン内で複数のコアを扱う プログラミングである。 diff -r f7f53d2387f3 -r 6b06734f1b3a paper/master_paper.bib --- a/paper/master_paper.bib Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/master_paper.bib Sat Feb 07 11:10:54 2009 +0900 @@ -120,3 +120,8 @@ howpublished = "{http://www.libsdl.org/}" } +@misc{sdl_image, +author = "", +title = "{SDL\_image}", +howpublished = "{http://www.libsdl.org/projects/SDL\_image/}" +} \ No newline at end of file diff -r f7f53d2387f3 -r 6b06734f1b3a paper/taskmanager.tex --- a/paper/taskmanager.tex Fri Feb 06 10:33:23 2009 +0900 +++ b/paper/taskmanager.tex Sat Feb 07 11:10:54 2009 +0900 @@ -516,7 +516,7 @@ タスク終了後、out に該当するメインメモリの領域が out と同じ値になっている。 -\subsection{タスク間の共用領域} +\subsection{タスク間の共用領域} \label{sec:tm_sm_global} 各タスクは独立して動作するため、使用するメモリ領域も 他のタスクと干渉することは無い。 @@ -550,21 +550,21 @@ 同じ SPE 上で実行させることにより、メモリ使用量も軽減できる。 -\subsection{DMA 命令} +\subsection{DMA 命令} \label{sec:tm_dma} タスクの入力データや結果の出力データの操作は、 TaskManagerが パイプラインに沿ってDMA を行っている。 しかし、タスク内でメインメモリ上の新たなデータが必要になる可能性がある。 この時、タスク内で明示的に DMA 転送命令を出すことができる。 -\verb+dma_load(unsigned int ls, unsigned int ea, int size, int tag)+ +dma\_load(unsigned int ls, unsigned int ea, int size, int tag) はメインメモリ上のデータ ea から、SPE の LS 上の領域 ls に size バイトの DMA 転送を行う。 Cell の DMA 転送ではタグを使用することになっており、 指定したタグ毎に DMA 転送完了待ちを行うことができる。 タグは Cell の仕様では 0 〜 31 を使用することが出来る。 -同じ様に、\verb+dma_store(unsigned int ls, unsigned int ea, int size, int tag)+ +同じ様に、\verb+dma_store(ls, ea, size, tag)+ では SPE から PPE への DMA 送信を行う。 DMA 送受信の完了を待つのが \verb+dma_wait(int tag)+ ある。