[Nouveau] [PATCH] nouveau: avoid running out of relocs

Francisco Jerez currojerez at riseup.net
Sat Dec 5 08:07:38 PST 2009


Ben Skeggs <skeggsb at gmail.com> writes:

> NACK.  You'll want to do this once, at the start of nv50_state_emit(),
> if we run out *during* state_emit() something's gone very wrong, and
> we'd need to fallback to software as the DDX does.
>
> Having the flush occur mid-frame will cause other issues.
>

It shouldn't, at least for nv50. If a mid-frame flush happens
nv50_state_flush_notify() will re-emit anything that's needed to go on
with the state emission, so Maarten's proposal looks fine to me as long
as he or someone else fixes the nv[34]0 pipe drivers to use flush
notifiers. :)

Software fallbacks could still be handled this way: if a BO cannot be
relocated you just rewind the pushbuf up to the last marker and then you
kick it off to clean up any references to the buffers software rendering
is going to be performed on.

> Ben.
>
> On Fri, 2009-12-04 at 22:59 +0100, Maarten Maathuis wrote:
>> Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
>> ---
>>  src/gallium/drivers/nouveau/nouveau_stateobj.h |   12 ++++++++----
>>  1 files changed, 8 insertions(+), 4 deletions(-)
>> 
>> diff --git a/src/gallium/drivers/nouveau/nouveau_stateobj.h b/src/gallium/drivers/nouveau/nouveau_stateobj.h
>> index b595405..28f483f 100644
>> --- a/src/gallium/drivers/nouveau/nouveau_stateobj.h
>> +++ b/src/gallium/drivers/nouveau/nouveau_stateobj.h
>> @@ -113,8 +113,10 @@ so_emit(struct nouveau_channel *chan, struct nouveau_stateobj *so)
>>  	unsigned nr, i;
>>  
>>  	nr = so->cur - so->push;
>> -	if (pb->remaining < nr)
>> -		nouveau_pushbuf_flush(chan, nr);
>> +	/* This will flush if we need space.
>> +	 * We don't actually need the marker.
>> +	 */
>> +	nouveau_pushbuf_marker_emit(chan, nr, so->cur_reloc);
>>  	pb->remaining -= nr;
>>  
>>  	memcpy(pb->cur, so->push, nr * 4);
>> @@ -138,8 +140,10 @@ so_emit_reloc_markers(struct nouveau_channel *chan, struct nouveau_stateobj *so)
>>  		return;
>>  
>>  	i = so->cur_reloc << 1;
>> -	if (pb->remaining < i)
>> -		nouveau_pushbuf_flush(chan, i);
>> +	/* This will flush if we need space.
>> +	 * We don't actually need the marker.
>> +	 */
>> +	nouveau_pushbuf_marker_emit(chan, i, i);
>>  	pb->remaining -= i;
>>  
>>  	for (i = 0; i < so->cur_reloc; i++) {
>
>
> _______________________________________________
> Nouveau mailing list
> Nouveau at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/nouveau/attachments/20091205/70a23cad/attachment.pgp 


More information about the Nouveau mailing list