summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_queryobj.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2016-05-26 11:04:07 -0700
committerBen Widawsky <ben@bwidawsk.net>2016-05-26 14:08:17 -0700
commitddcfc35f62ed3ad83b100beacb5b30394dcd9960 (patch)
tree8aeba816d339321be3b323005f423a5e3383b893 /src/mesa/drivers/dri/i965/brw_queryobj.c
parentf1fa8b4a1ca73fac4400e13b9aaca8c6b2955d2c (diff)
downloadexternal_mesa3d-ddcfc35f62ed3ad83b100beacb5b30394dcd9960.zip
external_mesa3d-ddcfc35f62ed3ad83b100beacb5b30394dcd9960.tar.gz
external_mesa3d-ddcfc35f62ed3ad83b100beacb5b30394dcd9960.tar.bz2
i965/sklgt4: Implement depth/timestamp write w/a
The stated bug describes a scenario in which a post sync write operation for depth or timestamp can be ignored. There are two workarounds suggested, the first and easier is to simply do a cs stall when we do these type of writes. The second option is to do a PIPE_CONTROL flush after the post sync but before the data is required. Generally, I believe the data written out is consumed by the application on the CPU side and so doing the easier of the two is ideal. Furthermore, these queries aren't tremendously common in the perf sensitive apps I have looked at. However, there could be cases where a shader stage might directly consume the data, and as a result option 2 may be desirable. This patch goes with the easier solution for now. gen9lp bug_de_id=2137196 By itself, this does *not* fix any of the GT4 hangs we're currently experiencing. Cc: Mika Kuoppala <mika.kuoppala@intel.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_queryobj.c')
-rw-r--r--src/mesa/drivers/dri/i965/brw_queryobj.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c
index f32721b..7baa213 100644
--- a/src/mesa/drivers/dri/i965/brw_queryobj.c
+++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
@@ -56,7 +56,12 @@ brw_write_timestamp(struct brw_context *brw, drm_intel_bo *query_bo, int idx)
PIPE_CONTROL_STALL_AT_SCOREBOARD);
}
- brw_emit_pipe_control_write(brw, PIPE_CONTROL_WRITE_TIMESTAMP,
+ uint32_t flags = PIPE_CONTROL_WRITE_TIMESTAMP;
+
+ if (brw->gen == 9 && brw->gt == 4)
+ flags |= PIPE_CONTROL_CS_STALL;
+
+ brw_emit_pipe_control_write(brw, flags,
query_bo, idx * sizeof(uint64_t), 0, 0);
}
@@ -66,9 +71,12 @@ brw_write_timestamp(struct brw_context *brw, drm_intel_bo *query_bo, int idx)
void
brw_write_depth_count(struct brw_context *brw, drm_intel_bo *query_bo, int idx)
{
- brw_emit_pipe_control_write(brw,
- PIPE_CONTROL_WRITE_DEPTH_COUNT |
- PIPE_CONTROL_DEPTH_STALL,
+ uint32_t flags = PIPE_CONTROL_WRITE_DEPTH_COUNT | PIPE_CONTROL_DEPTH_STALL;
+
+ if (brw->gen == 9 && brw->gt == 4)
+ flags |= PIPE_CONTROL_CS_STALL;
+
+ brw_emit_pipe_control_write(brw, flags,
query_bo, idx * sizeof(uint64_t),
0, 0);
}