Jerome Glisse wrote: > On Wed, 27 Feb 2008 15:03:34 +0100 > 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 >> > > Thanks a lot Thomas for all this explications, i now have a lot better > understanding of this stuff :) Do you mind if i do some name cleanup > fence_flag->fence_type for has_irq and stuff like that ? > > No, on the contrary. Go ahead!!
/Thomas > Cheers, > Jerome Glisse <[EMAIL PROTECTED]> > ------------------------------------------------------------------------- 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