From 793e8e3d7ed816cc9a066245dde798afdcf8b581 Mon Sep 17 00:00:00 2001 From: Roland Scheidegger Date: Fri, 14 Jun 2013 19:48:57 +0200 Subject: 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 --- src/gallium/auxiliary/cso_cache/cso_context.c | 13 ++++++++++--- src/gallium/auxiliary/cso_cache/cso_context.h | 3 ++- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src/gallium/auxiliary/cso_cache') diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index b06a070ad83..6805427b816 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -111,6 +111,7 @@ struct cso_context { void *velements, *velements_saved; struct pipe_query *render_condition, *render_condition_saved; uint render_condition_mode, render_condition_mode_saved; + boolean render_condition_cond, render_condition_cond_saved; struct pipe_clip_state clip; struct pipe_clip_state clip_saved; @@ -723,13 +724,17 @@ void cso_restore_stencil_ref(struct cso_context *ctx) } void cso_set_render_condition(struct cso_context *ctx, - struct pipe_query *query, uint mode) + struct pipe_query *query, + boolean condition, uint mode) { struct pipe_context *pipe = ctx->pipe; - if (ctx->render_condition != query || ctx->render_condition_mode != mode) { - pipe->render_condition(pipe, query, mode); + if (ctx->render_condition != query || + ctx->render_condition_mode != mode || + ctx->render_condition_cond != condition) { + pipe->render_condition(pipe, query, condition, mode); ctx->render_condition = query; + ctx->render_condition_cond = condition; ctx->render_condition_mode = mode; } } @@ -737,12 +742,14 @@ void cso_set_render_condition(struct cso_context *ctx, void cso_save_render_condition(struct cso_context *ctx) { ctx->render_condition_saved = ctx->render_condition; + ctx->render_condition_cond_saved = ctx->render_condition_cond; ctx->render_condition_mode_saved = ctx->render_condition_mode; } void cso_restore_render_condition(struct cso_context *ctx) { cso_set_render_condition(ctx, ctx->render_condition_saved, + ctx->render_condition_cond_saved, ctx->render_condition_mode_saved); } diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h index 20ab4ef1aaa..82c8e18def0 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.h +++ b/src/gallium/auxiliary/cso_cache/cso_context.h @@ -170,7 +170,8 @@ void cso_save_stencil_ref(struct cso_context *cso); void cso_restore_stencil_ref(struct cso_context *cso); void cso_set_render_condition(struct cso_context *cso, - struct pipe_query *query, uint mode); + struct pipe_query *query, + boolean condition, uint mode); void cso_save_render_condition(struct cso_context *cso); void cso_restore_render_condition(struct cso_context *cso); -- cgit v1.2.3