(figured to keep the list cc-ed)
On Mon, 2008-05-12 at 11:47 +0100, Tommi Komulainen wrote:
> > it has to do with the default stage and the fact that we need a GL
> > context ready during the init sequence to be able to query the features.
> > I tried delaying the realization and require it for the default stage
> > only, but it seems to be breaking.
>
> What I mean is that why doesn't the wrapper do it, something like:
>
> wrapper->impl = backend->create_stage()
> wrapper->impl->realize();
> if (!REALIZED(wrapper->impl)) { ... }
>
> Isn't it the wrapper doing the calls into the backend in the first
> place? So it could easily just do two calls instead of one and not
> start overlapping the semantics in the API.
I revisited the code this morning, and by double checking some of the
assumption, I was able to avoid a lot of stuff. now the default stage is
realized in clutter_init() and clutter_init_with_args() - because we
need it to be present before the initialization sequence terminates -
while the other stages are realized when clutter_actor_show() is called
with them.
> > yes. in theory it would be possible, through accurate locking and by
> > migrating caches, to have multiple contexts in the same process - but
> > this is non advisable.
>
> Err, so what exactly is ClutterBackend::ensure_context supposed to do then?
it ensures that the GL context is attached to the native window held by
the stage implementation.
> It's the stage parameter that I find misleading at the moment. To me
> it implies each stage has its own context (NSOpenGLContext:makeCurrent
> is separate from :setView, associating a view/window with the context)
> -- in GLX you need both it seems.
in GLX you create the GLX context and the call glXMakeCurrent() on it
with the X drawable you want to make current.
ensure_context() allows the backend to make the stage as the current
drawable for the GL context the backend is keeping.
> I think it would be more clear if backend API had a separate
> create_context() method and ensure_context(stage, context)
what might be clearer would be creating the GL context when creating the
backend; I don't know whether this is entirely feasible.
> > flags cannot be "forwarded"; the only reason to set the realized state
> > on the stage wrapper from within the stage implementation is that the
> > stage implementation will then have to call
> > clutter_stage_ensure_context() with the stage wrapper as the argument;
> > the ensure_context() call checks whether the stage wrapper is realized
> > to control the context assignment.
>
> I mean something along the lines:
>
> clutter_stage_realize()
> {
> SET_FLAGS(self, REALIZED); /* optimistic, needed for ensure_context etc. */
> backend->realize();
> if (!REALIZED(backend))
> UNSET_FLAGS(self, REALIZED); /* magic! back in sync with backend */
> self->ensure_context(); /* and not overlapping APIs */
> }
yeah, that would work. :-)
>
> > 3)
> > realize(): g_assert (!REALIZED)
> > show(): if (MAPPED) return;
> > hide(): if (!MAPPED) return;
> > unrealized(): g_assert (REALIZED)
> >
> > the layers above should keep consistency anyway, but they don't protect
> > from direct calling of the vfuncs.
>
> Umm, has that ever been legal? What strikes me as odd is that as you
> said upper layers are enforcing consistent state transitions, but
> backends / implementations can't rely on it. Why bother? Makes a bad
> API contract IMO.
the implementations can rely on it, if the layers above are behaving
properly; even though I'd like to keep the backends safe even in case of
misuse.
> > > > - destroy the native window handle
> > > > - call clutter_stage_ensure_context() with the wrapper instance
> > >
> > > Err, why? Didn't we just destroy the underlying resources, including GL
> > context?
> >
> > no, the GL context should still be alive when a stage is destroyed.
>
> So we're creating the context on realize and never destroying it?
obviously not: the GL context is destroyed with the backend.
> This makes no sense if you assume multiple GL contexts. It would be
> far more clear if you explicitly state there's support only for single
> context, and that it needs to be created during backend init. Perhaps
> even add an explicit create_context() method on the backend API and
> then clutter core could manage the contexts whichever way it chooses
> (ensure_context(stage, context))
the multiple GL contexts is a path we tried and did not work. yes: we
should be more explicit about the "single GL contexts" guideline, but I
always thought that multiple GL context are evil anyway and the "one
context per process" was already a guideline for GL-based applications.
> > the ensure context will make sure that the backend knows that the GL
> > context should be unassigned. it's part of the clean up process.
>
> Don't we have the wrapper calling ensure context at proper times already?
no, we do it in the stage implementation because it is easier. :-)
ciao,
Emmanuele.
--
Emmanuele Bassi, OpenedHand Ltd.
Unit R, Homesdale Business Centre
216-218 Homesdale Rd., Bromley - BR12QZ
http://www.o-hand.com
--
To unsubscribe send a mail to [EMAIL PROTECTED]