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 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