Alex Deucher wrote:
> On Wed, Feb 27, 2008 at 1:06 PM, Thomas Hellström
> <[EMAIL PROTECTED]> wrote:
>   
>> Alex Deucher wrote:
>>  > On Wed, Feb 27, 2008 at 9:03 AM, Thomas Hellström
>>  > <[EMAIL PROTECTED]> wrote:
>>  >
>>  >> Jerome Glisse wrote:
>>  >>  > Hi Thomas,
>>  >>  >
>>  >>  > As i am in the process of cleaning up and making radeon
>>  >>  > fence things bullet proof I am wondering what are the
>>  >>  > difference btw fence flags and fence types ? Well i guess
>>  >>  > the questions is more why fence flags are needed ?
>>  >>  >
>>  >>  > My understanding is that fence_flags (DRM_FENCE_FLAG_EMIT,
>>  >>  > DRM_FENCE_FLAG_SHAREABLE, DRM_FENCE_FLAG_WAIT_LAZY,
>>  >>  > DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS, DRM_FENCE_FLAG_NO_USER)
>>  >>  > are their to give clue to fence driver on the importance
>>  >>  > of the fence at least this is my understanding of
>>  >>  > DRM_FENCE_FLAG_WAIT_LAZY but i don't fully get the others
>>  >>  > flag supposed meaning would be nice if you can shed some
>>  >>  > light on them for me :)
>>  >>  >
>>  >>  > Corollary why has_irq callback take flag ? I would expect
>>  >>  > this to be based on fence type and not fence flag.
>>  >>  >
>>  >>  > Last question flush callback is their to ask that cmd before
>>  >>  > highest_received_sequence are all finished and that RW is
>>  >>  > done on all buffer referenced in all cmds preceding
>>  >>  > this sequence right ? Does this callback have to do the
>>  >>  > flush and spin until this true or can it emit what's
>>  >>  > necessary to flush and return and let poll update this
>>  >>  > once the flush ended ? Or dooes flush need to stop all
>>  >>  > current rendering (so stop gpu from doing its rendering)
>>  >>  > and do the flush ?
>>  >>  >
>>  >>  > On radeon hw i believe a reliable rw flush is to flush the
>>  >>  > whole pipeline ie flush vert pipeline, frag pipeline, cache
>>  >>  > doing all this is likely expensive and it would be better to
>>  >>  > avoid having too much of this kind of flush.
>>  >>  >
>>  >>  > As well i don't think i understand needed_flush.
>>  >>  >
>>  >>  > Thanks in advance for your help on this :o)
>>  >>  >
>>  >>  > Cheers,
>>  >>  > Jerome Glisse <[EMAIL PROTECTED]>
>>  >>  >
>>  >>  Hi, Jerome.
>>  >>  Some answers:
>>  >>  fence_flags are to tweak the behavior of calls into the fence manager.
>>  >>
>>  >>     * DRM_FENCE_FLAG_EMIT causes a fence to enter the command stream
>>  >>       instead of just being created.
>>  >>     * DRM_FENCE_FLAG_SHAREABLE makes sure the fence object is shareable
>>  >>       between processes.
>>  >>     * DRM_FENCE_FLAG_WAIT_LAZY hints that a polling wait should sleep
>>  >>       in-between polls.
>>  >>     * DRM_FENCE_FLAG_IGNORE_SIGNALS ignore signals while waiting.
>>  >>     * DRM_FENCE_FLAG_NO_USER don't return a user-space fence object on a
>>  >>       superioctl. Just have the fence live in the kernel.
>>  >>
>>  >>  fence_type is something completely different. It's there to expose GPU
>>  >>  states, or how far the GPU has proceeded with the command sequence
>>  >>  associated with the fence. This info is needed so that the buffer object
>>  >>  code knows when a buffer object is idle. A TTM object (buffer, regiser,
>>  >>  whatever) is considered idle if (object->fence_type &
>>  >>  object->fence->signaled_types == object->fence_type).
>>  >>
>>  >>  Let's take i915 as a typical example. Batch buffers should be idle and
>>  >>  can be reused as soon as the GPU command reader is done with the buffer.
>>  >>  At that point fence->sigaled_types will contain DRM_BO_FENCE_TYPE_EXE.
>>  >>  However, render targets and textures aren't idle until that has happend
>>  >>  AND and MI_FLUSH has executed, at which point fence->signaled_types will
>>  >>  also contain DRM_I915_FENCE_TYPE_RW.
>>  >>
>>  >>  In an ideal situation we would like to only issue an MI_FLUSH at the end
>>  >>  of a full scene, however, we might need a huge number of batch buffers
>>  >>  to build that scene, and we'd like to be able to reuse these as soon as
>>  >>  they've delivered their contents. We don't want them hanging around
>>  >>  useless until someone issues a MI_FLUSH at the end of the scene.
>>  >>
>>  >>  Other uses for fence_type are when different engines are fed through the
>>  >>  same command submission mechanism. A typical example would be the
>>  >>  Unichrome which has different ways to signal 2D done, 3D done, video
>>  >>  blit done, mpeg done etc. All these engines  are fed through the same
>>  >>  command submission mechanism.
>>  >>
>>  >>  This is contrary to the fence_class which is intended for separate
>>  >>  command submission mechanisms and the TTM has ways to synchronize these
>>  >>  on a per-buffer level. Typical usage would be hardware with completely
>>  >>  separate 2D and 3D engines that operate in parallel with separate
>>  >>  command FIFOs.
>>  >>
>>  >>  The callback has_irq should take fence_type and not fence_flags. You're
>>  >>  right. I think this is just a bad naming of the parameter that has
>>  >>  survived cleanups.
>>  >>
>>  >>  The callback "needed_flush" is there to tell the fence manager whether
>>  >>  some kind of GPU flush is needed to signal any fence type in
>>  >>  fence->waiting_types.
>>  >>  In the intel example case above, If the DRM_I915_FENCE_TYPE_RW flag is
>>  >>  set in fence->waiting_types, a flush would be needed, but only if there
>>  >>  isn't already a flush pending that would make sure this flag signals.
>>  >>  Also, since the flushes that are currently implemented on intel are
>>  >>  asynchronous, a flush is not needed until the DRM_BO_FENCE_TYPE_EXE has
>>  >>  signaled. Otherwise we would flush a previous command sequence instead
>>  >>  of the intended one.
>>  >>
>>  >>  The callback "flush" should schedule a GPU flush for the
>>  >>  fc->pending_flush types, and clear fc->pending_flush when the flush has
>>  >>  been scheduled.
>>  >>
>>  >>
>>  >>
>>  >
>>  > Thomas, this was really helpful, any objections to me putting it on
>>  > the dri wiki?
>>  >
>>  > Alex
>>  >
>>  Not at all. Need to change
>>
>>
>>  (object->fence_type & object->fence->signaled_types == object->fence_type).
>>
>>  to
>>
>>  ((object->fence_type & object->fence->signaled_types) == 
>> object->fence_type),
>>
>>  though.
>>     
>
> Thanks.  Added as:
> http://dri.freedesktop.org/wiki/TTMFencing
>
> Alex
>   
Thanks.
Added Jerome's flush-bit-in-sequence-blit suggestion and a section about 
the command_stream_barrier() callback, which might be handy also for 
Radeons.

/Thomas




-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to