diff options
author | Roland Scheidegger <[email protected]> | 2013-06-14 19:48:57 +0200 |
---|---|---|
committer | Roland Scheidegger <[email protected]> | 2013-06-18 18:01:24 +0200 |
commit | 793e8e3d7ed816cc9a066245dde798afdcf8b581 (patch) | |
tree | b71d5597d0d8669df8ed896b989bc519c82659d2 /src/gallium/drivers/r600 | |
parent | 443dc15cf77edcaa7804c4277f0cce5d7c1d6b25 (diff) |
gallium: add condition parameter to render_condition
For conditional rendering this makes it possible to skip rendering
if either the predicate is true or false, as supported by d3d10
(in fact previously it was sort of implied skip rendering if predicate
is false for occlusion predicate, and true for so_overflow predicate).
There's no cap bit for this as presumably all drivers could do it trivially
(but this patch does not implement it for the drivers using true
hw predicates, nvxx, r600, radeonsi, no change is expected for OpenGL
functionality).
Reviewed-by: Jose Fonseca <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600')
-rw-r--r-- | src/gallium/drivers/r600/r600_blit.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.c | 6 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_query.c | 2 |
4 files changed, 8 insertions, 2 deletions
diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index 660f4f9aa96..dcc397851fc 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -88,6 +88,7 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op if ((op & R600_DISABLE_RENDER_COND) && rctx->current_render_cond) { util_blitter_save_render_condition(rctx->blitter, rctx->current_render_cond, + rctx->current_render_cond_cond, rctx->current_render_cond_mode); } } diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 71f555b0eab..74a650a01e7 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -162,13 +162,15 @@ static void r600_flush(struct pipe_context *ctx, unsigned flags) struct r600_context *rctx = (struct r600_context *)ctx; struct pipe_query *render_cond = NULL; unsigned render_cond_mode = 0; + boolean render_cond_cond = FALSE; rctx->rings.gfx.flushing = true; /* Disable render condition. */ if (rctx->current_render_cond) { render_cond = rctx->current_render_cond; + render_cond_cond = rctx->current_render_cond_cond; render_cond_mode = rctx->current_render_cond_mode; - ctx->render_condition(ctx, NULL, 0); + ctx->render_condition(ctx, NULL, FALSE, 0); } r600_context_flush(rctx, flags); @@ -177,7 +179,7 @@ static void r600_flush(struct pipe_context *ctx, unsigned flags) /* Re-enable render condition. */ if (render_cond) { - ctx->render_condition(ctx, render_cond, render_cond_mode); + ctx->render_condition(ctx, render_cond, render_cond_cond, render_cond_mode); } } diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 2a81434155e..1dc346f049f 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -629,6 +629,7 @@ struct r600_context { /* Render condition. */ struct pipe_query *current_render_cond; unsigned current_render_cond_mode; + boolean current_render_cond_cond; boolean predicate_drawing; void *sb_context; diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c index d264b7f3970..f77e1a8f52d 100644 --- a/src/gallium/drivers/r600/r600_query.c +++ b/src/gallium/drivers/r600/r600_query.c @@ -669,6 +669,7 @@ static boolean r600_get_query_result(struct pipe_context *ctx, static void r600_render_condition(struct pipe_context *ctx, struct pipe_query *query, + boolean condition, uint mode) { struct r600_context *rctx = (struct r600_context *)ctx; @@ -676,6 +677,7 @@ static void r600_render_condition(struct pipe_context *ctx, bool wait_flag = false; rctx->current_render_cond = query; + rctx->current_render_cond_cond = condition; rctx->current_render_cond_mode = mode; if (query == NULL) { |