[Mesa-dev] State tracker pipe_surface woes...

Roland Scheidegger sroland at vmware.com
Wed Sep 7 09:51:03 PDT 2011

Am 07.09.2011 07:33, schrieb Stéphane Marchesin:
> 2011/9/2 Jose Fonseca <jfonseca at vmware.com>:
>> ----- Original Message -----
>>> Hi,
>>> While debugging some code I ran across the following situation:
>>> - pipe_context c1 is created
>>> - pipe_surface s1 is created
>>> - strb-> surface is set to s1 (s1's refcount goes up)
>>> - pipe_context c1 is destroyed
>>> - strb is destroyed
>>> - strb->surface is destroyed (so s1's refcount is now 0 and we want
>>> to
>>> destroy it)
>>> At that point s1 references c1 which is not available any more, so
>>> when we try to call ctx->surface_destroy to destroy s1 we crash.
>>> We discussed this a bit on IRC, and we agreed that the proper
>>> solution, since surfaces outlive their context, is to make surfaces
>>> screen-bound instead. I'm going to  implement that unless someone
>>> objects.
>>> As a side note, the same issue will happen with sampler_views, so
>>> it'll get a similar fix.
>> Sampler views and surfaces were previously objects bound to screen, and we changed that because of poor multithreading semantics.  Per-context sampler views / render targets actually matches the 3D APIs semantics better, so I don't think that reverting is the solution.
>> It looks to me that the issue here is that pipe_context should not be destroyed before the surfaces. strb->surface should only be used by one context, and should be destroyed before that context is destroyed.
>> IIUC, strb matches GL renderbuffer semantics and can be shared by multiple context. If so, strb is treating pipe_surfaces as a entity shareable by contexts when really shouldn't.
>> The solution is:
>> - strb can only have pipe_resources, plus the key for the surface (face, level, etc)
> Another bit I don't get: since pipe_resources don't have a pointer to
> the context, how do you go back to the corresponding context/surface
> when all you have is the pipe_resource?

Short answer, you don't. Why do you need to?
A pipe_surface is conceptually really just a means to supply the
parameters to be used for rendering to a (color or depth) rendertarget.
So you specify which level, layer(s) etc. of a resource will be used.
That's all, analogous to pipe_sampler_view which does the same for
texture sampling from a resource.


More information about the mesa-dev mailing list