I'm trying to decide whether we need to implement MemoryBarrier(). Reading through the spec, it definitely seems to apply to us:
Add to the list of flags accepted by the <barriers> parameter to
MemoryBarrier in Section 7.12.2, "Shader Memory Access Synchronization":
* CLIENT_MAPPED_BUFFER_BARRIER_BIT: Access by the client to persistent
mapped regions of buffer objects will reflect data written by shaders
prior to the barrier. Note that this may cause additional
synchronization operations.
and in issue 12:
shader writes such as image stores, SSBO, atomic counters, transform
feedback and so on are also allowed.
In other words, transform feedback and atomic counters are both considered
"data written by shaders", and we need to make sure such updates are visible
to the CPU at the appropriate time.
Looking at the rules for that synchronization...
- If MAP_COHERENT_BIT is not set and the server performs a write, the
application must call MemoryBarrier with the
CLIENT_MAPPED_BUFFER_BARRIER_BIT set and then call FenceSync with
SYNC_GPU_COMMANDS_COMPLETE (or Finish). Then the CPU will see the
writes after the sync is complete.
- If MAP_COHERENT_BIT is set and the server does a write, the app must
call FenceSync with SYNC_GPU_COMMANDS_COMPLETE (or Finish). Then the
CPU will see the writes after the sync is complete.
...it seems like the app has to either glFinish() or put a fence object in
the pipeline and then ClientWaitSync to wait until the GPU has finished
writes. This will effectively do a intel_batchbuffer_flush() and
drm_intel_gem_bo_wait(), which should be all the synchronization we need.
MemoryBarrier(), then, just does additional flushing to support mappings
that are PERSISTENT but *not* COHERENT. And in your current implementation,
all PERSISTENT mappings are also coherent (whether or not the bit is set),
so MemoryBarrier can safely be a noop.
It would need to exist if we started supporting non-coherent persistent
mappings by using CPU mappings on non-LLC platforms and clflushing.
Do you agree with my assessment?
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
