「琉大では gdb 教えないんですか?」なんていうたこな質問もあったが。OSでも使っているし、ソフトウェア工学でも使っているけど、無視しているのは君達じゃん...
http://
とか..
なんか、#define で展開しまくり、構造体のindirect で間接呼び出しまくりの、読みづらいソースでした。でも、gdb は使えるし、gcc -E で、ソースの展開は出来るので、まぁ、なんとか読めました。
* Smooth-shaded, z-less triangle, RGBA color.
*/
#define NAME smooth_rgba_z_triangle
#define INTERP_Z 1
....
#define SETUP_CODE \
const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
#define RENDER_SPAN( span ) { \
GLuint i; \
GLchan *img = PIXELADDR4(span.x, span.y); \
for (i = 0; i < span.end; i++, img += 4) { \
const GLuint z = FixedToDepth(span.z); \
if (z < zRow[i]) { \
PACK_RGBA(img, FixedToChan(span.red), \
FixedToChan(span.green), FixedToChan(span.blue), \
FixedToChan(span.alpha)); \
zRow[i] = z; \
} \
span.red += span.redStep; \
span.green += span.greenStep; \
span.blue += span.blueStep; \
span.alpha += span.alphaStep; \
span.z += span.zStep; \
} \
}
#include "swrast/s_tritemp.h"
こんな感じ。ここ部分で、zバッファを見ながら、img にcolorをセットしてるらしい。1ドットずつ。
% wc swrast/s_tritemp.h
1377 6175 52324 swrast/s_tritemp.h
1400行もあるものを#define を変えて、何回もinclude しているわけ。
static void smooth_rgba_z_triangle(GLcontext *ctx, const SWvertex *v0,
const SWvertex *v1,
const SWvertex *v2 )
とかいう巨大な関数に展開されるわけ。こうなると、gdb でも、
{
RENDER_SPAN( span );
}
とかを延々動くみたいな感じなるので無力。結局、-E で展開して -g で再コンパイルして、trace するなていう(いつもの)技を使いました。
これだったら、C++ で generic programming すれば? と思わなくもない。全体的には、オブジェクト指向的に出来ているわけだし。まぁ、C++ 向きなライブラリだと思うし。でも、もし C++ でやられていたら、-E で展開するなんていう技は使えなかったが。
Mesa も古いソースだからな。直しようもあると思うが、思ったより巨大だったので、誰も手をつけられないというところか...
No comments:
Post a Comment