summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/ddebug/dd_draw.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/ddebug/dd_draw.c')
-rw-r--r--src/gallium/drivers/ddebug/dd_draw.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/gallium/drivers/ddebug/dd_draw.c b/src/gallium/drivers/ddebug/dd_draw.c
index b443c5b0b03..0778099d4fd 100644
--- a/src/gallium/drivers/ddebug/dd_draw.c
+++ b/src/gallium/drivers/ddebug/dd_draw.c
@@ -588,8 +588,11 @@ dd_context_flush(struct pipe_context *_pipe,
static void
dd_before_draw(struct dd_context *dctx)
{
- if (dd_screen(dctx->base.screen)->mode == DD_DETECT_HANGS &&
- !dd_screen(dctx->base.screen)->no_flush)
+ struct dd_screen *dscreen = dd_screen(dctx->base.screen);
+
+ if (dscreen->mode == DD_DETECT_HANGS &&
+ !dscreen->no_flush &&
+ dctx->num_draw_calls >= dscreen->skip_count)
dd_flush_and_handle_hang(dctx, NULL, 0,
"GPU hang most likely caused by internal "
"driver commands");
@@ -598,22 +601,28 @@ dd_before_draw(struct dd_context *dctx)
static void
dd_after_draw(struct dd_context *dctx, struct dd_call *call)
{
- switch (dd_screen(dctx->base.screen)->mode) {
- case DD_DETECT_HANGS:
- if (!dd_screen(dctx->base.screen)->no_flush &&
- dd_flush_and_check_hang(dctx, NULL, 0)) {
- dd_dump_call(dctx, call, PIPE_DEBUG_DEVICE_IS_HUNG);
+ struct dd_screen *dscreen = dd_screen(dctx->base.screen);
- /* Terminate the process to prevent future hangs. */
- dd_kill_process();
+ if (dctx->num_draw_calls >= dscreen->skip_count) {
+ switch (dscreen->mode) {
+ case DD_DETECT_HANGS:
+ if (!dscreen->no_flush &&
+ dd_flush_and_check_hang(dctx, NULL, 0)) {
+ dd_dump_call(dctx, call, PIPE_DEBUG_DEVICE_IS_HUNG);
+
+ /* Terminate the process to prevent future hangs. */
+ dd_kill_process();
+ }
+ break;
+ case DD_DUMP_ALL_CALLS:
+ dd_dump_call(dctx, call, 0);
+ break;
+ default:
+ assert(0);
}
- break;
- case DD_DUMP_ALL_CALLS:
- dd_dump_call(dctx, call, 0);
- break;
- default:
- assert(0);
}
+
+ ++dctx->num_draw_calls;
}
static void