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