[Intel-gfx] Trying to understand the URB code
Zou, Nanhai
nanhai.zou at intel.com
Thu Apr 7 10:24:27 CEST 2011
Hi Ken,
URB allocation on gen6 is different than previous gens.
On previous gen, there is a total size urb for many stages of VS GS CLIP SF.
So driver has to decide how much urb to allocate for each stage.
On gen6 only GS and VS will share an urb of 64k(32k on GT1)
urb_entry_number also has a limit, check 3DSTATE_URB command.
The more urb entry number we have, the more current threads can spawn.
But
We should make sure
VS urb size = single_urb_size * gs_urb_entry
+
GS urb size = single_urb_size * vs_urb_entry
< total_urb_size
In most case, this is ok, unless we have a huge single_urb_size.
Since we are always using GS pass through mode for now.
The number for GS urb dose not matter.
So allocate more urb size for VS, less for GS may be better for huge urb_size
But consider we will support GS shader later and huge urb_size case is very rare,
I separate urb equally for GS and VS.
Thanks
Zou Nan hai
>>-----Original Message-----
>>From: Kenneth Graunke [mailto:kenneth at whitecape.org]
>>Sent: 2011年4月7日 13:01
>>To: Zou, Nanhai
>>Cc: intel-gfx at lists.freedesktop.org
>>Subject: Trying to understand the URB code
>>
>>Hi Nanhai,
>>
>>I'm trying to understand how the Gen6 URB setup works, and I had some
>>questions...
>>
>> if (IS_GT1(intel->intelScreen->deviceID)) {
>> urb_size = 32 * 1024;
>> max_urb_entry = 128;
>> } else {
>> urb_size = 64 * 1024;
>> max_urb_entry = 256;
>> }
>>
>>I see in vol5c.5 that GT1 has 32kB of URB space and GT2 has 64kB, so
>>urb_size must be the total size of the URB. But what is max_urb_entry?
>> Where do 128 and 256 come from?
>>
>> brw->urb.vs_size = MAX2(brw->vs.prog_data->urb_entry_size, 1);
>>
>>It looks like brw->vs.prog_data->urb_entry_size is the size of a single
>>VUE, which depends on the number of input/outputs in the particular
>>vertex shader being used.
>>
>>So, brw->urb.vs_size is also the size of a VUE, but at least 1.
>>What are the units here? The number of 1024-bit blocks? (I'm looking
>>at 3DSTATE_URB in vol2a of the bspec...)
>>
>> brw->urb.nr_vs_entries = max_urb_entry;
>> brw->urb.nr_gs_entries = max_urb_entry;
>>
>> if (2 * brw->urb.vs_size * brw->urb.nr_vs_entries > urb_size)
>> brw->urb.nr_vs_entries = brw->urb.nr_gs_entries =
>> (urb_size ) / (2 * brw->urb.vs_size);
>>
>>Here it looks like you're trying to allocate half of the URB to the VS,
>>and half to the GS. I'm confused by the units, though: if vs_size is in
>>1024-bit (128-byte) blocks and urb_size is in bytes, don't we need to
>>multiply vs_size by 128?
>>
>>I think the above code could be simplified to:
>>
>>int urb_entries = urb_size / (2 * brw->urb.vs_size * 128);
>>brw->urb.nr_vs_entries = brw->urb.nr_gs_entries = MIN2(urb_entries,
>>max_urb_entry);
>>
>>What do you think?
>>
>>Thanks for the help.
>>--Kenneth
More information about the Intel-gfx
mailing list