[Mesa-dev] [RFC] New gallium flags for using different contexts in several threads

Axel Davy axel.davy at ens.fr
Sun Dec 18 17:46:21 UTC 2016


On 18/12/2016 18:34, Nicolai Hähnle wrote:
> On 18.12.2016 17:37, Axel Davy wrote:
>> On 18/12/2016 16:57, Nicolai Hähnle wrote:
>>> On 18.12.2016 13:38, Axel Davy wrote:
>>>> Currently there is no real specification on what is allowed for
>>>> using different contexts in several threads, or when you
>>>> map/unmap a resource in a thread, but uses it in another for
>>>> draw calls.
>>>>
>>>> For the gallium nine CSMT patchset, I've figured out it would be 
>>>> better
>>>> to add flags to describe what is allowed.
>>>>
>>>> Please comment.
>>>
>>> I don't see the point of this. All existing drivers must already
>>> support the multi-threading scenarios described in the commits,
>>> because they can happen as part of correct use of OpenGL. If drivers
>>> don't support them, then they're already broken.
>>>
>> Some drivers aren't thread safe. For example nouveau isn't. I guess
>> other drivers may be.
>
> Then this needs to be fixed regardless because it could have happened 
> in OpenGL applications all along.
>
>
>>> I'm happy to be convinced otherwise if I missed something, but using
>>> multiple contexts from different threads, or using Map/UnmapBuffer
>>> from one context but sourcing the buffer from draw calls in another
>>> context are all perfectly supported OpenGL use cases.
>> For some drivers and combination flags, map gives a staging buffer and
>> unmap does trigger a copy of it to the real buffer. This is not
>> neccessarily flushed. I'd like this flush to be implicit, because if we
>> can avoid it (most of the cases) it's better.
>
> Is this for some internal transfers done by nine?
>
> I _really_ don't like the "EXTERNAL_CONTEXT" naming. "External 
> contexts" may be a motivation for using the feature, but they're not 
> what the feature is really about. It's about the interaction of unmap 
> and flush.
>
> Remember: Even today, all resources can be mapped from context A and 
> drawn from using context B. You don't need a flag for that.
>
> We really shouldn't add more places for drivers to do implicit 
> flushes. Reduce the magic, please. If anything, we could consider 
> adding a feedback mechanism where the driver tells you at transfer_map 
> time whether the unmap requires a flush to be effective. That has the 
> advantage of working with multiple such unmaps in a row.
>
> Then again, why not just call flush unconditionally? If the flush was 
> unnecessary, it should be a no-op, and the driver should already have 
> a fast path for that anyway.
If drivers flush noop very fast, I'm okay doing that (but do they ?).
My main thought relative to that was: What about persistent, coherent 
and barriers ? Does it makes sense for them to flush after unmap ? It is 
supposed to work using them in another context without unmap or flush ?
Is it expected for current drivers that you can map such buffers with 
one context, and draw with the others ?
In case barriers are needed (nine doesn't use persistent without 
coherent so doesn't need this, but it would need to be clarified), which 
context should wait for the barrier ?

Axel
>
> Nicolai
>



More information about the mesa-dev mailing list