From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kenneth Graunke Subject: Trying to understand the URB code Date: Wed, 06 Apr 2011 22:01:06 -0700 Message-ID: <4D9D4512.8010800@whitecape.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: Received: from homiemail-a2.g.dreamhost.com (caiajhbdcagg.dreamhost.com [208.97.132.66]) by gabe.freedesktop.org (Postfix) with ESMTP id A41C29E70A for ; Wed, 6 Apr 2011 22:01:10 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: "Zou, Nanhai" Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org 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