Saturday 26 May 2007

Open/GL OSMesa [2]



わかりました。



Breakpoint 3, _swsetup_RenderStart (ctx=0x1797000) at swrast_setup/ss_context.c

:103

103    SScontext *swsetup = SWSETUP_CONTEXT(ctx);

(gdb) where

#0 _swsetup_RenderStart (ctx=0x1797000) at swrast_setup/ss_context.c:103

#1 0x0011ae99 in run_render (ctx=0x1797000, stage=0x20fc598) at tnl/t_vb_rend

er.c:275

#2 0x0010267d in _tnl_run_pipeline (ctx=0x1797000) at tnl/t_pipeline.c:159

#3 0x0014ed96 in _tnl_flush_vtx (ctx=0x1797000) at tnl/t_vtx_exec.c:286

#4 0x00147b0c in _tnl_wrap_filled_vertex (ctx=0x1797000) at tnl/t_vtx_api.c:8

4

#5 0x0014c211 in _tnl_Vertex3f (x=-0.962127864, y=-0.312614053, z=0.222479686

) at tnl/t_vtx_generic.c:235

#6 0x00002c83 in main (argc=2, argv=0xbffff1b8) at osdemo.c:84



ほとんどのRedering は、

  swrast_setup

  swrast

で、行われているらしい。



起動されるタイミングは、tnl_wrap_filled_vertex だったみたいだね。



つまり、glFlush() とかではなくて、 glVertex3f()とかのド真中から、redering ルーチンが呼ばれるのか。





(gdb) p tnl->Driver

$6 = {

 RunPipeline = 0x10220b <_tnl_run_pipeline>,

 NotifyMaterialChange = 0xa43fc <_mesa_validate_all_lighting_tables>,

 NotifyInputChanges = 0,

 NotifyBegin = 0,

 Render = {

  Start = 0x1c1bc3 <_swsetup_RenderStart>,

  Finish = 0x1c2261 <_swsetup_RenderFinish>,

  PrimitiveNotify = 0x1c1ba5 <_swsetup_RenderPrimitive>,

  Interp = 0x13f16f <_tnl_interp>,

  CopyPV = 0x13f18b <_tnl_copy_pv>,

  ClippedPolygon = 0x11ae0f <_tnl_RenderClippedPolygon>,

  ClippedLine = 0x11ae59 <_tnl_RenderClippedLine>,

  Points = 0,

  Line = 0,

  Triangle = 0,

  Quad = 0,

  PrimTabVerts = 0x32f3c0,

  PrimTabElts = 0x32f380,

  ResetLineStipple = 0x16d0fe <_swrast_ResetLineStipple>,

  BuildVertices = 0x140233 <_tnl_build_vertices>,

  Multipass = 0

 }

}



なので、このあたりに break point をつければ楽勝だった。

No comments: