From: Keith W. <ke...@tu...> - 2003-03-10 23:50:26
|
Felix K=FChling wrote: > On Mon, 10 Mar 2003 22:23:07 +0000 > Jos=E9 Fonseca <jrf...@tu...> wrote: > [snip] >=20 >>As I said above this can be done in C++, and without damage to >>efficiency. >> >>Imagine you have a TnL abstract class: >> >>class TNL { >> // A OpenGL function >> virtual void Coord3f(GLfloat x, GLfloat y, GLfloat z) =3D 0; >> =20 >> // Activate >> virtual void activate() =3D 0; >> >> protected: >> struct dispatch_table *my_dispatch_table; >>} ; >> >>and then you have two inherited classes for software and hardware >>rendering: >> >>class SoftwareTNL : public TNL { >> // The software version. Note the _inline_ >> inline void Coord3f(x, y, z) { >> _mesa_swrast_deal_with_this_vertex(x, y, z); >> } >>}; >> >>class HardwareTNL : public TNL { >> // The hardware version. Note the _inline_ >> inline void Coord3f(x, y, z) { >> _add_vertex_to_DMA_buffer(x, y, z); >> } >>}; >> >>and then the C-callable versions for the glapi disptach table: >> >>void softwareCoord3f(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z) { >> Driver::Context *context =3D ctx; >> Driver::SoftwareTNL &tnl =3D ctx->tnl; >> >> // There will be no call as the function will be expanded inline >> tnl.Coord3F(x, y, z); >>} >=20 >=20 > Here you're converting a GLcontext * to a Driver::Context *. Can you do > that because Mesa::Context has GLcontext as first member? Anyway, if > that didn't work you could always do some fancy pointer arithmetics wit= h > the offset of the GLcontext in Driver::Context. There's a slight misconception happening here -- the 'ctx' argument doesn= 't=20 exist. The function should read something like: void swv3f( GLfloat x, GLfloat y, GLfloat z ) { GET_CONTEXT_FROM_THREAD_LOCAL_STORE( ctx ) // get tnl somehow =09 tnl->v3f( x, y, z ) } But why bother? tnl->v3f isn't virtual, so what's the point of having th= e=20 implementation somewhere else? Why not just do it here? Keith |