19f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/*
29f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca Intel funded Tungsten Graphics to
49f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt develop this 3D driver.
5a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke
69f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt Permission is hereby granted, free of charge, to any person obtaining
79f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt a copy of this software and associated documentation files (the
89f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt "Software"), to deal in the Software without restriction, including
99f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt without limitation the rights to use, copy, modify, merge, publish,
109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt distribute, sublicense, and/or sell copies of the Software, and to
119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt permit persons to whom the Software is furnished to do so, subject to
129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt the following conditions:
13a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke
149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt The above copyright notice and this permission notice (including the
159f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt next paragraph) shall be included in all copies or substantial
169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt portions of the Software.
17a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke
189f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke
269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt **********************************************************************/
279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt /*
289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  * Authors:
29877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca  *   Keith Whitwell <keithw@vmware.com>
309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt  */
31a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke
329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "intel_batchbuffer.h"
359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_context.h"
369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_state.h"
379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#include "brw_defines.h"
389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define VS 0
409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define GS 1
419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define CLP 2
429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define SF 3
439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt#define CS 4
449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
45d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt/** @file brw_urb.c
46d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
47d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * Manages the division of the URB space between the various fixed-function
48d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * units.
49d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
50d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * See the Thread Initiation Management section of the GEN4 B-Spec, and
51d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * the individual *_STATE structures for restrictions on numbers of
52d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * entries and threads.
53d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt */
54d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt
55d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt/*
56d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * Generally, a unit requires a min_nr_entries based on how many entries
57d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * it produces before the downstream unit gets unblocked and can use and
58d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * dereference some of its handles.
59d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
60d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * The SF unit preallocates a PUE at the start of thread dispatch, and only
61d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * uses that one.  So it requires one entry per thread.
62d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
63d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * For CLIP, the SF unit will hold the previous primitive while the
64d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * next is getting assembled, meaning that linestrips require 3 CLIP VUEs
65d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * (vertices) to ensure continued processing, trifans require 4, and tristrips
66d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * require 5.  There can be 1 or 2 threads, and each has the same requirement.
67d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
68d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * GS has the same requirement as CLIP, but it never handles tristrips,
69d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * so we can lower the minimum to 4 for the POLYGONs (trifans) it produces.
70d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * We only run it single-threaded.
71d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
72d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * For VS, the number of entries may be 8, 12, 16, or 32 (or 64 on G4X).
73d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * Each thread processes 2 preallocated VUEs (vertices) at a time, and they
74d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * get streamed down as soon as threads processing earlier vertices get
75d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * theirs accepted.
76d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
77d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * Each unit will take the number of URB entries we give it (based on the
78d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * entry size calculated in brw_vs_emit.c for VUEs, brw_sf_emit.c for PUEs,
79d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * and brw_curbe.c for the CURBEs) and decide its maximum number of
80d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * threads it can support based on that. in brw_*_state.c.
81d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt *
82d70d62c56175b992eea4b94a5a05ecd6c1d89713Eric Anholt * XXX: Are the min_entry_size numbers useful?
839f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * XXX: Verify min_nr_entries, esp for VS.
849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * XXX: Verify SF min_entry_size.
859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */
869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtstatic const struct {
879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint min_nr_entries;
889f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint preferred_nr_entries;
899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint min_entry_size;
909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint max_entry_size;
919f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt} limits[CS+1] = {
92c9c64a100d5d0661fd672af040a68bd4e7292940Zou Nan hai   { 16, 32, 1, 5 },			/* vs */
939f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   { 4, 8,  1, 5 },			/* gs */
9482eb7c235db9939d067c4d64e32df96caef939abEric Anholt   { 5, 10,  1, 5 },			/* clp */
959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   { 1, 8,  1, 12 },		        /* sf */
969f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   { 1, 4,  1, 32 }			/* cs */
979f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt};
989f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
999f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1002e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool check_urb_layout(struct brw_context *brw)
1019f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1029f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->urb.vs_start = 0;
1039f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->urb.gs_start = brw->urb.nr_vs_entries * brw->urb.vsize;
1049f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->urb.clip_start = brw->urb.gs_start + brw->urb.nr_gs_entries * brw->urb.vsize;
1059f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->urb.sf_start = brw->urb.clip_start + brw->urb.nr_clip_entries * brw->urb.vsize;
1069f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   brw->urb.cs_start = brw->urb.sf_start + brw->urb.nr_sf_entries * brw->urb.sfsize;
1079f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1080b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   return brw->urb.cs_start + brw->urb.nr_cs_entries *
1090b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt      brw->urb.csize <= brw->urb.size;
1109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
1119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt/* Most minimal update, forces re-emit of URB fence packet after GS
1139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt * unit turned on/off.
1149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt */
115f75843a517bd188639e6866db2a7b04de3524e16Dave Airliestatic void recalculate_urb_fence( struct brw_context *brw )
1169f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
1179f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint csize = brw->curbe.total_size;
11840258a13d5bf81303585eaf1859fcb85e373be3eKenneth Graunke   GLuint vsize = brw_vue_prog_data(brw->vs.base.prog_data)->urb_entry_size;
1199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   GLuint sfsize = brw->sf.prog_data->urb_entry_size;
1209f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (csize < limits[CS].min_entry_size)
1229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      csize = limits[CS].min_entry_size;
1239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (vsize < limits[VS].min_entry_size)
1259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      vsize = limits[VS].min_entry_size;
1269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (sfsize < limits[SF].min_entry_size)
1289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      sfsize = limits[SF].min_entry_size;
1299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   if (brw->urb.vsize < vsize ||
1319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt       brw->urb.sfsize < sfsize ||
1329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt       brw->urb.csize < csize ||
133d758c48761a2be2a6c9b3d80f8fe06d32b5dd0d3Eric Anholt       (brw->urb.constrained && (brw->urb.vsize > vsize ||
134d758c48761a2be2a6c9b3d80f8fe06d32b5dd0d3Eric Anholt				 brw->urb.sfsize > sfsize ||
135d758c48761a2be2a6c9b3d80f8fe06d32b5dd0d3Eric Anholt				 brw->urb.csize > csize))) {
136a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke
1379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      brw->urb.csize = csize;
1399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      brw->urb.sfsize = sfsize;
1409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      brw->urb.vsize = vsize;
1419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
1422bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga      brw->urb.nr_vs_entries = limits[VS].preferred_nr_entries;
1432bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga      brw->urb.nr_gs_entries = limits[GS].preferred_nr_entries;
1449f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      brw->urb.nr_clip_entries = limits[CLP].preferred_nr_entries;
1452bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga      brw->urb.nr_sf_entries = limits[SF].preferred_nr_entries;
1462bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga      brw->urb.nr_cs_entries = limits[CS].preferred_nr_entries;
147c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt
148c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt      brw->urb.constrained = 0;
149c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt
15053631be4ebaa4fb13a7f129727c1cdd32fcc6f3dKenneth Graunke      if (brw->gen == 5) {
1512995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao         brw->urb.nr_vs_entries = 128;
1522995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao         brw->urb.nr_sf_entries = 48;
1532995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao         if (check_urb_layout(brw)) {
1542995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao            goto done;
1552995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao         } else {
1562995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao            brw->urb.constrained = 1;
1572995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao            brw->urb.nr_vs_entries = limits[VS].preferred_nr_entries;
1582995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao            brw->urb.nr_sf_entries = limits[SF].preferred_nr_entries;
1592995bf0d68f1b28ba68b81e9dc79e3ab52bc2795Xiang, Haihao         }
160794de2f3873bcedc78300b3ba69656adc755894cKenneth Graunke      } else if (brw->is_g4x) {
161c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt	 brw->urb.nr_vs_entries = 64;
162c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt	 if (check_urb_layout(brw)) {
163c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt	    goto done;
164c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt	 } else {
165c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt	    brw->urb.constrained = 1;
166c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt	    brw->urb.nr_vs_entries = limits[VS].preferred_nr_entries;
167c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt	 }
168c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt      }
169c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholt
1709f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      if (!check_urb_layout(brw)) {
1712bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga	 brw->urb.nr_vs_entries = limits[VS].min_nr_entries;
1722bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga	 brw->urb.nr_gs_entries = limits[GS].min_nr_entries;
1739f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 brw->urb.nr_clip_entries = limits[CLP].min_nr_entries;
1742bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga	 brw->urb.nr_sf_entries = limits[SF].min_nr_entries;
1752bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga	 brw->urb.nr_cs_entries = limits[CS].min_nr_entries;
1769f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
177d758c48761a2be2a6c9b3d80f8fe06d32b5dd0d3Eric Anholt	 /* Mark us as operating with constrained nr_entries, so that next
178d758c48761a2be2a6c9b3d80f8fe06d32b5dd0d3Eric Anholt	  * time we recalculate we'll resize the fences in the hope of
179d758c48761a2be2a6c9b3d80f8fe06d32b5dd0d3Eric Anholt	  * escaping constrained mode and getting back to normal performance.
180d758c48761a2be2a6c9b3d80f8fe06d32b5dd0d3Eric Anholt	  */
1819f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 brw->urb.constrained = 1;
1822bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga
183a1ea7812b2b8869b60877995fdb957e9539309bdXiang, Haihao	 if (!check_urb_layout(brw)) {
1849f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    /* This is impossible, given the maximal sizes of urb
1859f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	     * entries and the values for minimum nr of entries
1869f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	     * provided above.
1879f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	     */
18883daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt	    fprintf(stderr, "couldn't calculate URB layout!\n");
1899f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	    exit(1);
1909f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt	 }
1912bba2152e4ea10d4ae9b15795dc42e75bdc71bc2Iago Toral Quiroga
19279198063b8adb23536b291081f8df8571926950eEric Anholt	 if (unlikely(INTEL_DEBUG & (DEBUG_URB|DEBUG_PERF)))
19383daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt	    fprintf(stderr, "URB CONSTRAINED\n");
1949f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      }
1959f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
196c3499f6c66bf93d7752ea70a13bbbab3d2b2c288Eric Anholtdone:
197bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt      if (unlikely(INTEL_DEBUG & DEBUG_URB))
19883daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt	 fprintf(stderr,
19983daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt                 "URB fence: %d ..VS.. %d ..GS.. %d ..CLP.. %d ..SF.. %d ..CS.. %d\n",
20083daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt                 brw->urb.vs_start,
20183daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt                 brw->urb.gs_start,
20283daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt                 brw->urb.clip_start,
20383daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt                 brw->urb.sf_start,
20483daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt                 brw->urb.cs_start,
20583daa88035af978c5158cfe5a196df45ce1555c1Eric Anholt                 brw->urb.size);
206a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke
2074e56a9ad46ff7fe85308ce12e21719ff2b476516Jordan Justen      brw->ctx.NewDriverState |= BRW_NEW_URB_FENCE;
2089f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   }
2099f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
2109f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2119f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2129f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtconst struct brw_tracked_state brw_recalculate_urb_fence = {
2139f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   .dirty = {
2149f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt      .mesa = 0,
2156d5ce1b0433f4cbc5cd88b4bfeaf4cdcba6beda8Kenneth Graunke      .brw = BRW_NEW_BLORP |
2166d5ce1b0433f4cbc5cd88b4bfeaf4cdcba6beda8Kenneth Graunke             BRW_NEW_CURBE_OFFSETS |
2174f24c168c87e9938f35f5ec135062408148be373Kenneth Graunke             BRW_NEW_SF_PROG_DATA |
2184f24c168c87e9938f35f5ec135062408148be373Kenneth Graunke             BRW_NEW_VS_PROG_DATA,
2199f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   },
2208f0a54e6ffab12f745eeccc5a98d6a243404fe67Eric Anholt   .emit = recalculate_urb_fence
2219f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt};
2229f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2239f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2249f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2259f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2269f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2279f344b3e7d6e23674dd4747faec253f103563b36Eric Anholtvoid brw_upload_urb_fence(struct brw_context *brw)
2289f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt{
2299f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   struct brw_urb_fence uf;
2309f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   memset(&uf, 0, sizeof(uf));
2319f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2329f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.opcode = CMD_URB_FENCE;
2339f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.length = sizeof(uf)/4-2;
2349f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.vs_realloc = 1;
2359f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.gs_realloc = 1;
2369f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.clp_realloc = 1;
2379f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.sf_realloc = 1;
2389f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.vfe_realloc = 1;
2399f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.header.cs_realloc = 1;
2409f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
2419f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   /* The ordering below is correct, not the layout in the
2429f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    * instruction.
2439f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    *
2448e444fb9e2685e3eac42beb848b08e91dc20c88aXiang, Haihao    * There are 256/384 urb reg pairs in total.
2459f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt    */
2469f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   uf.bits0.vs_fence  = brw->urb.gs_start;
247a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke   uf.bits0.gs_fence  = brw->urb.clip_start;
248a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke   uf.bits0.clp_fence = brw->urb.sf_start;
249a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke   uf.bits1.sf_fence  = brw->urb.cs_start;
2500b87f143c466f7e5bd730895ee29f1cd20a68f9bEric Anholt   uf.bits1.cs_fence  = brw->urb.size;
2519f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt
25218dd7932c7fc13e230384bcab08311a5de5d6de7Chris Wilson   /* erratum: URB_FENCE must not cross a 64byte cacheline */
253131573df7aea0b10e97d9d5db0d26d89f8dfef54Matt Turner   if ((USED_BATCH(brw->batch) & 15) > 12) {
254131573df7aea0b10e97d9d5db0d26d89f8dfef54Matt Turner      int pad = 16 - (USED_BATCH(brw->batch) & 15);
25518dd7932c7fc13e230384bcab08311a5de5d6de7Chris Wilson      do
256f11c6f09cf36909ff399353b20195a31cf0f1907Matt Turner         *brw->batch.map_next++ = MI_NOOP;
25718dd7932c7fc13e230384bcab08311a5de5d6de7Chris Wilson      while (--pad);
25818dd7932c7fc13e230384bcab08311a5de5d6de7Chris Wilson   }
25918dd7932c7fc13e230384bcab08311a5de5d6de7Chris Wilson
2609f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt   BRW_BATCH_STRUCT(brw, &uf);
2619f344b3e7d6e23674dd4747faec253f103563b36Eric Anholt}
262