[Mesa-dev] [RFC] New gallium flags for using different contexts in several threads
Nicolai Hähnle
nhaehnle at gmail.com
Sun Dec 18 17:34:01 UTC 2016
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.
Nicolai
More information about the mesa-dev
mailing list