diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/softpipe/sp_clear.c | 4 | ||||
| -rw-r--r-- | src/gallium/drivers/softpipe/sp_context.c | 15 | ||||
| -rw-r--r-- | src/gallium/drivers/softpipe/sp_context.h | 4 | ||||
| -rw-r--r-- | src/gallium/drivers/softpipe/sp_draw_arrays.c | 4 | ||||
| -rw-r--r-- | src/gallium/drivers/softpipe/sp_query.c | 26 | ||||
| -rw-r--r-- | src/gallium/drivers/softpipe/sp_query.h | 4 | 
6 files changed, 57 insertions, 0 deletions
| diff --git a/src/gallium/drivers/softpipe/sp_clear.c b/src/gallium/drivers/softpipe/sp_clear.c index f98087deb8..5f130453c3 100644 --- a/src/gallium/drivers/softpipe/sp_clear.c +++ b/src/gallium/drivers/softpipe/sp_clear.c @@ -36,6 +36,7 @@  #include "util/u_pack_color.h"  #include "sp_clear.h"  #include "sp_context.h" +#include "sp_query.h"  #include "sp_tile_cache.h" @@ -55,6 +56,9 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba,     if (softpipe->no_rast)        return; +   if (!softpipe_check_render_cond(softpipe)) +      return; +  #if 0     softpipe_update_derived(softpipe); /* not needed?? */  #endif diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c index 82173a3c2a..f3ac6760db 100644 --- a/src/gallium/drivers/softpipe/sp_context.c +++ b/src/gallium/drivers/softpipe/sp_context.c @@ -176,6 +176,19 @@ softpipe_is_buffer_referenced( struct pipe_context *pipe,  } +static void +softpipe_render_condition( struct pipe_context *pipe, +                           struct pipe_query *query, +                           uint mode ) +{ +   struct softpipe_context *softpipe = softpipe_context( pipe ); + +   softpipe->render_cond_query = query; +   softpipe->render_cond_mode = mode; +} + + +  struct pipe_context *  softpipe_create( struct pipe_screen *screen )  { @@ -252,6 +265,8 @@ softpipe_create( struct pipe_screen *screen )     softpipe_init_query_funcs( softpipe ); +   softpipe->pipe.render_condition = softpipe_render_condition; +     /*      * Alloc caches for accessing drawing surfaces and textures.      * Must be before quad stage setup! diff --git a/src/gallium/drivers/softpipe/sp_context.h b/src/gallium/drivers/softpipe/sp_context.h index 6a89bd4b06..73fa744f9d 100644 --- a/src/gallium/drivers/softpipe/sp_context.h +++ b/src/gallium/drivers/softpipe/sp_context.h @@ -116,6 +116,10 @@ struct softpipe_context {     unsigned line_stipple_counter; +   /** Conditional query object and mode */ +   struct pipe_query *render_cond_query; +   uint render_cond_mode; +     /** Software quad rendering pipeline */     struct {        struct quad_stage *shade; diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c b/src/gallium/drivers/softpipe/sp_draw_arrays.c index 9ea5d6fb9f..7409c3c488 100644 --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c @@ -38,6 +38,7 @@  #include "util/u_prim.h"  #include "sp_context.h" +#include "sp_query.h"  #include "sp_state.h"  #include "draw/draw_context.h" @@ -122,6 +123,9 @@ softpipe_draw_range_elements(struct pipe_context *pipe,     struct draw_context *draw = sp->draw;     unsigned i; +   if (!softpipe_check_render_cond(sp)) +      return TRUE; +     sp->reduced_api_prim = u_reduced_prim(mode);     if (sp->dirty) diff --git a/src/gallium/drivers/softpipe/sp_query.c b/src/gallium/drivers/softpipe/sp_query.c index 379cf4ad06..4ef5d9f7b1 100644 --- a/src/gallium/drivers/softpipe/sp_query.c +++ b/src/gallium/drivers/softpipe/sp_query.c @@ -99,6 +99,32 @@ softpipe_get_query_result(struct pipe_context *pipe,  } +/** + * Called by rendering function to check rendering is conditional. + * \return TRUE if we should render, FALSE if we should skip rendering + */ +boolean +softpipe_check_render_cond(struct softpipe_context *sp) +{ +   struct pipe_context *pipe = &sp->pipe; +   boolean b, wait; +   uint64_t result; + +   if (!sp->render_cond_query) { +      return TRUE;  /* no query predicate, draw normally */ +   } + +   wait = (sp->render_cond_mode == PIPE_RENDER_COND_WAIT || +           sp->render_cond_mode == PIPE_RENDER_COND_BY_REGION_WAIT); + +   b = pipe->get_query_result(pipe, sp->render_cond_query, wait, &result); +   if (b) +      return result > 0; +   else +      return TRUE; +} + +  void softpipe_init_query_funcs(struct softpipe_context *softpipe )  {     softpipe->pipe.create_query = softpipe_create_query; diff --git a/src/gallium/drivers/softpipe/sp_query.h b/src/gallium/drivers/softpipe/sp_query.h index 05060a4575..736c033897 100644 --- a/src/gallium/drivers/softpipe/sp_query.h +++ b/src/gallium/drivers/softpipe/sp_query.h @@ -32,6 +32,10 @@  #ifndef SP_QUERY_H  #define SP_QUERY_H +extern boolean +softpipe_check_render_cond(struct softpipe_context *sp); + +  struct softpipe_context;  extern void softpipe_init_query_funcs(struct softpipe_context * ); | 
