From: Topi Pohjolainen Date: Fri, 15 Apr 2016 07:12:20 +0000 (+0300) Subject: i965/blorp: Use 8k chunk size for urb allocation X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ede09e672ae277aa78def69fe016a4be454b28ed;p=mesa.git i965/blorp: Use 8k chunk size for urb allocation Previously, we hardcoded "VS URB Starting Address" to 2 (in 8kB chunks), which meant VS URB data would start at an offset of 16kB. However, on Haswell GT3 and Gen8+, we allocate the first 32kB for the push constant region. This means that the PS push constant and VS URB data regions overlap, which can lead to corruption. v2 (Ken): Better description of the change, and do not change vs_size from 2 to 1. Cc: mesa-stable@lists.freedesktop.org Signed-off-by: Topi Pohjolainen Reviewed-by: Kenneth Graunke --- diff --git a/src/mesa/drivers/dri/i965/gen7_blorp.cpp b/src/mesa/drivers/dri/i965/gen7_blorp.cpp index 4debeb305ad..5d66232e4e4 100644 --- a/src/mesa/drivers/dri/i965/gen7_blorp.cpp +++ b/src/mesa/drivers/dri/i965/gen7_blorp.cpp @@ -47,8 +47,17 @@ static void gen7_blorp_emit_urb_config(struct brw_context *brw) { + /* URB allocations must be done in 8k chunks. */ + const unsigned chunk_size_bytes = 8192; const unsigned urb_size = (brw->gen >= 8 || (brw->is_haswell && brw->gt == 3)) ? 32 : 16; + const unsigned push_constant_bytes = 1024 * urb_size; + const unsigned push_constant_chunks = + push_constant_bytes / chunk_size_bytes; + const unsigned vs_size = 2; + const unsigned vs_start = push_constant_chunks; + const unsigned vs_chunks = + DIV_ROUND_UP(brw->urb.min_vs_entries * vs_size * 64, chunk_size_bytes); gen7_emit_push_constant_state(brw, urb_size / 2 /* vs_size */, @@ -59,17 +68,17 @@ gen7_blorp_emit_urb_config(struct brw_context *brw) gen7_emit_urb_state(brw, brw->urb.min_vs_entries /* num_vs_entries */, - 2 /* vs_size */, - 2 /* vs_start */, + vs_size, + vs_start, 0 /* num_hs_entries */, 1 /* hs_size */, - 2 /* hs_start */, + vs_start + vs_chunks /* hs_start */, 0 /* num_ds_entries */, 1 /* ds_size */, - 2 /* ds_start */, + vs_start + vs_chunks /* ds_start */, 0 /* num_gs_entries */, 1 /* gs_size */, - 2 /* gs_start */); + vs_start + vs_chunks /* gs_start */); }