diff options
author | Marek Olšák <[email protected]> | 2014-04-12 18:12:11 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2014-04-16 14:02:52 +0200 |
commit | 11459436d9314681087463f2c006c58b6fcff396 (patch) | |
tree | 3620c11c52f31e266783bfd74ad2d92bba3575f7 /src/gallium/drivers/radeon | |
parent | adfadeadd8316e95626fec4771393d32a70af649 (diff) |
r600g,radeonsi: share some of gfx flush code
Reviewed-by: Christian König <[email protected]>
Diffstat (limited to 'src/gallium/drivers/radeon')
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.c | 47 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.h | 2 |
2 files changed, 49 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 3a0d9811ce6..750886532f2 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -53,6 +53,53 @@ static void r600_memory_barrier(struct pipe_context *ctx, unsigned flags) { } +void r600_preflush_suspend_features(struct r600_common_context *ctx) +{ + /* Disable render condition. */ + ctx->saved_render_cond = NULL; + ctx->saved_render_cond_cond = FALSE; + ctx->saved_render_cond_mode = 0; + if (ctx->current_render_cond) { + ctx->saved_render_cond = ctx->current_render_cond; + ctx->saved_render_cond_cond = ctx->current_render_cond_cond; + ctx->saved_render_cond_mode = ctx->current_render_cond_mode; + ctx->b.render_condition(&ctx->b, NULL, FALSE, 0); + } + + /* suspend queries */ + ctx->nontimer_queries_suspended = false; + if (ctx->num_cs_dw_nontimer_queries_suspend) { + r600_suspend_nontimer_queries(ctx); + ctx->nontimer_queries_suspended = true; + } + + ctx->streamout.suspended = false; + if (ctx->streamout.begin_emitted) { + r600_emit_streamout_end(ctx); + ctx->streamout.suspended = true; + } +} + +void r600_postflush_resume_features(struct r600_common_context *ctx) +{ + if (ctx->streamout.suspended) { + ctx->streamout.append_bitmask = ctx->streamout.enabled_mask; + r600_streamout_buffers_dirty(ctx); + } + + /* resume queries */ + if (ctx->nontimer_queries_suspended) { + r600_resume_nontimer_queries(ctx); + } + + /* Re-enable render condition. */ + if (ctx->saved_render_cond) { + ctx->b.render_condition(&ctx->b, ctx->saved_render_cond, + ctx->saved_render_cond_cond, + ctx->saved_render_cond_mode); + } +} + static void r600_flush_from_st(struct pipe_context *ctx, struct pipe_fence_handle **fence, unsigned flags) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index a87efdcbdae..ada124f93ed 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -407,6 +407,8 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen, bool r600_common_screen_init(struct r600_common_screen *rscreen, struct radeon_winsys *ws); void r600_destroy_common_screen(struct r600_common_screen *rscreen); +void r600_preflush_suspend_features(struct r600_common_context *ctx); +void r600_postflush_resume_features(struct r600_common_context *ctx); bool r600_common_context_init(struct r600_common_context *rctx, struct r600_common_screen *rscreen); void r600_common_context_cleanup(struct r600_common_context *rctx); |