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 をつければ楽勝だった。
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment