Jerome Glisse wrote:
> On Wed, 27 Feb 2008 17:08:41 +0100
> Thomas Hellström <[EMAIL PROTECTED]> wrote:
>
>   
>> Thomas Hellström wrote:
>> Some additional info on this:
>> flush() only needs to start a flush, and poll() will report it when it's 
>> done, but note that on, for example intel, the flush mechanism currently 
>> implemented doesn't have an IRQ that reports when it's done. Hence the 
>> polling part of the intel fence wait. A better way of implementing this 
>> is to have flushes go through a high-priority ring, accompanied by a 
>> user irq. Not done yet.
>> A third way is to just add an MI_FLUSH to the ring and keep track of its 
>> execution. The disadvantage of this is that the ring might be full of 
>> rendering commands that will take a lot of time to complete and we will 
>> drain the ring waiting for idle buffers.
>>     
>
> Well problem on radeon is that flush can take time ie we have to insert
> command in the ring to flush the whole pipeline from vertex to fragment.
> But i guess that i will need to have some real use case to see if it leads
> to drain the ring (i hope not :))
>
>   
>> Note also, that if poll() sees that fc->flush_pending is non-zero, it 
>> should also start a flush and clear fc->flush_pending. It can be set to 
>> non-zero in the drm fence handler.
>>     
>
> Do we really have to do this ? I mean if i get some one polling for a
> buffer i don't want to insert flush command into the ring each time i
> poll with fc->flush_pending being non zero, as last poll might already
> have inserted such command. Or do i have to keep track in the driver of
> current pending flush and have a mecanism to minize the number of flush
> i am sending ?
>   
So what happens is that the drm fence handler calls needed_flush() when 
it has signaled a fence_type on a fence.  If needed_flush() determines 
that further flushing is needed, it should then check  if there is a 
flush in the command  stream that would perform the required action, and 
if so return zero. A simple way to track flushes is to store the 
sequence number for the last flush. 
If that sequence number is higher than the current sequence number, no 
flush is needed, and needed_flush() would return zero.

So yes, you need to check fc->pending_flush during poll, and make sure 
needed_flush() is smart enough to check the ring for previous flushes 
that would do the job, so we don't issue any unnecessary flushes.

So over to the question, how does the poll() function tell that a flush 
has executed?
One option is to have a separate list with all flushes in the ring, and 
a corresponding sequence number. Everytime we hit a new sequence number 
we check the list, and see if a flush has executed, and in that case 
call drm_fence_handler() with the correct fence_type.

One other option is to use fence->native_type. When TYPE_EXE signals on 
a fence with a non-zero native_type, it will also automatically signal 
fence->native_type on itself and all previous fences. There is a problem 
with this, however, and that is that such a fence might disappear when 
it's no longer referenced by a buffer and thus we will lose track of 
that flush. This can probably be fixed with refcounting tricks, but now 
it starts to get more and more complicated. If you look in the 
intel_driver, native_type is used exactly in this way to track flushes 
that are programmed by user-space. Here, a driver-specific fence-flag is 
used to tell the intel fence driver that we have programmed an MI_FLUSH. 
However, if you look even more closely, the intel needed_flush() 
implementation ignores these user-space flushes, unless they occur on 
the current fence. This is to avoid the previously mentioned ring 
round-trip delay.
So currently it's a bit stupid since even if a flush occurs on the next 
fence, it will go on initiating a sync_flush operation.

/Thomas






/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