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
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to