Sunday, 27 May 2007

Open/GL OSMesa [3]



「琉大では gdb 教えないんですか?」なんていうたこな質問もあったが。OSでも使っているし、ソフトウェア工学でも使っているけど、無視しているのは君達じゃん...

 http://tinyurl.com/ywvawo

とか..



なんか、#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: