diff options
Diffstat (limited to 'src')
| -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 | ||||
| -rw-r--r-- | src/gallium/include/pipe/p_context.h | 8 | ||||
| -rw-r--r-- | src/gallium/include/pipe/p_defines.h | 9 | ||||
| -rw-r--r-- | src/mesa/SConscript | 1 | ||||
| -rw-r--r-- | src/mesa/sources.mak | 1 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_condrender.c | 95 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_condrender.h | 35 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_queryobj.c | 17 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_queryobj.h | 21 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_context.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_extensions.c | 4 | 
16 files changed, 233 insertions, 17 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 * ); diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index 6c06fb9027..60fa9cef82 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -84,6 +84,14 @@ struct pipe_context {                                     unsigned count);     /*@}*/ +   /** +    * Predicate subsequent rendering on occlusion query result +    * \param query  the query predicate, or NULL if no predicate +    * \param mode  one of PIPE_COND_RENDER_x +    */ +   void (*render_condition)( struct pipe_context *pipe, +                             struct pipe_query *query, +                             uint mode );     /**      * Query objects diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 2cda408fec..c3b1e634ff 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -355,6 +355,15 @@ enum pipe_transfer_usage {  /** + * Conditional rendering modes + */ +#define PIPE_RENDER_COND_WAIT              0 +#define PIPE_RENDER_COND_NO_WAIT           1 +#define PIPE_RENDER_COND_BY_REGION_WAIT    2 +#define PIPE_RENDER_COND_BY_REGION_NO_WAIT 3 + + +/**   * Point sprite coord modes   */  #define PIPE_SPRITE_COORD_NONE       0 diff --git a/src/mesa/SConscript b/src/mesa/SConscript index 7035bdc634..9c933adcf7 100644 --- a/src/mesa/SConscript +++ b/src/mesa/SConscript @@ -162,6 +162,7 @@ if env['platform'] != 'winddk':  		'state_tracker/st_cb_blit.c',  		'state_tracker/st_cb_bufferobjects.c',  		'state_tracker/st_cb_clear.c', +		'state_tracker/st_cb_condrender.c',  		'state_tracker/st_cb_flush.c',  		'state_tracker/st_cb_drawpixels.c',  		'state_tracker/st_cb_fbo.c', diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak index ba56df5418..bd1fe9bc4b 100644 --- a/src/mesa/sources.mak +++ b/src/mesa/sources.mak @@ -191,6 +191,7 @@ STATETRACKER_SOURCES = \  	state_tracker/st_cb_blit.c \  	state_tracker/st_cb_bufferobjects.c \  	state_tracker/st_cb_clear.c \ +	state_tracker/st_cb_condrender.c \  	state_tracker/st_cb_flush.c \  	state_tracker/st_cb_drawpixels.c \  	state_tracker/st_cb_fbo.c \ diff --git a/src/mesa/state_tracker/st_cb_condrender.c b/src/mesa/state_tracker/st_cb_condrender.c new file mode 100644 index 0000000000..780b40c206 --- /dev/null +++ b/src/mesa/state_tracker/st_cb_condrender.c @@ -0,0 +1,95 @@ +/************************************************************************** + *  + * Copyright 2009 VMware, Inc. + * All Rights Reserved. + *  + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + *  + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + *  + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *  + **************************************************************************/ + + +/** + * glBegin/EndCondtionalRender functions + * + * \author Brian Paul + */ + + +#include "main/imports.h" +#include "main/context.h" + +#include "pipe/p_context.h" +#include "pipe/p_defines.h" +#include "st_context.h" +#include "st_cb_queryobj.h" +#include "st_cb_condrender.h" + + +/** + * Called via ctx->Driver.BeginConditionalRender() + */ +static void +st_BeginConditionalRender(GLcontext *ctx, struct gl_query_object *q, +                          GLenum mode) +{ +   struct st_query_object *stq = st_query_object(q); +   struct pipe_context *pipe = ctx->st->pipe; +   uint m; + +   switch (mode) { +   case GL_QUERY_WAIT: +      m = PIPE_RENDER_COND_WAIT; +      break; +   case GL_QUERY_NO_WAIT: +      m = PIPE_RENDER_COND_NO_WAIT; +      break; +   case GL_QUERY_BY_REGION_WAIT: +      m = PIPE_RENDER_COND_BY_REGION_WAIT; +      break; +   case GL_QUERY_BY_REGION_NO_WAIT: +      m = PIPE_RENDER_COND_BY_REGION_NO_WAIT; +      break; +   default: +      assert(0 && "bad mode in st_BeginConditionalRender"); +   } + +   pipe->render_condition(pipe, stq->pq, m); +} + + +/** + * Called via ctx->Driver.BeginConditionalRender() + */ +static void +st_EndConditionalRender(GLcontext *ctx, struct gl_query_object *q) +{ +   struct pipe_context *pipe = ctx->st->pipe; +   (void) q; +   pipe->render_condition(pipe, NULL, 0); +} + + + +void st_init_cond_render_functions(struct dd_function_table *functions) +{ +   functions->BeginConditionalRender = st_BeginConditionalRender; +   functions->EndConditionalRender = st_EndConditionalRender; +} diff --git a/src/mesa/state_tracker/st_cb_condrender.h b/src/mesa/state_tracker/st_cb_condrender.h new file mode 100644 index 0000000000..891f1cbcd8 --- /dev/null +++ b/src/mesa/state_tracker/st_cb_condrender.h @@ -0,0 +1,35 @@ +/************************************************************************** + *  + * Copyright 2009 VMware, Inc. + * All Rights Reserved. + *  + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + *  + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + *  + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *  + **************************************************************************/ + +#ifndef ST_CB_CONDRENDER_H +#define ST_CB_CONDRENDER_H + + +extern void st_init_cond_render_functions(struct dd_function_table *functions); + + +#endif diff --git a/src/mesa/state_tracker/st_cb_queryobj.c b/src/mesa/state_tracker/st_cb_queryobj.c index dcf4c38eb6..10629e9225 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.c +++ b/src/mesa/state_tracker/st_cb_queryobj.c @@ -44,23 +44,6 @@  #include "st_public.h" -struct st_query_object -{ -   struct gl_query_object base; -   struct pipe_query *pq; -}; - - -/** - * Cast wrapper - */ -static struct st_query_object * -st_query_object(struct gl_query_object *q) -{ -   return (struct st_query_object *) q; -} - -  static struct gl_query_object *  st_NewQueryObject(GLcontext *ctx, GLuint id)  { diff --git a/src/mesa/state_tracker/st_cb_queryobj.h b/src/mesa/state_tracker/st_cb_queryobj.h index 9220a212b6..fa256b7182 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.h +++ b/src/mesa/state_tracker/st_cb_queryobj.h @@ -29,6 +29,27 @@  #define ST_CB_QUERYOBJ_H +/** + * Subclass of gl_query_object + */ +struct st_query_object +{ +   struct gl_query_object base; +   struct pipe_query *pq; +}; + + +/** + * Cast wrapper + */ +static INLINE struct st_query_object * +st_query_object(struct gl_query_object *q) +{ +   return (struct st_query_object *) q; +} + + +  extern void  st_init_query_functions(struct dd_function_table *functions); diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index d18a25ab51..e4f18c842c 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -43,6 +43,7 @@  #include "st_cb_blit.h"  #include "st_cb_bufferobjects.h"  #include "st_cb_clear.h" +#include "st_cb_condrender.h"  #if FEATURE_drawpix  #include "st_cb_drawpixels.h"  #include "st_cb_rasterpos.h" @@ -337,6 +338,7 @@ void st_init_driver_functions(struct dd_function_table *functions)  #if FEATURE_queryobj     st_init_query_functions(functions);  #endif +   st_init_cond_render_functions(functions);     st_init_readpixels_functions(functions);     st_init_texture_functions(functions);     st_init_flush_functions(functions); diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index ef3cbc53ee..35e08749df 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -306,4 +306,8 @@ void st_init_extensions(struct st_context *st)        /* we support always support GL_EXT_framebuffer_blit */        ctx->Extensions.ARB_framebuffer_object = GL_TRUE;     } + +   if (st->pipe->render_condition) { +      ctx->Extensions.NV_conditional_render = GL_TRUE; +   }  } | 
