diff options
| -rw-r--r-- | src/mesa/SConscript | 1 | ||||
| -rw-r--r-- | src/mesa/main/condrender.c | 143 | ||||
| -rw-r--r-- | src/mesa/main/condrender.h | 45 | ||||
| -rw-r--r-- | src/mesa/main/dd.h | 5 | ||||
| -rw-r--r-- | src/mesa/main/mtypes.h | 4 | ||||
| -rw-r--r-- | src/mesa/sources.mak | 1 | 
6 files changed, 199 insertions, 0 deletions
| diff --git a/src/mesa/SConscript b/src/mesa/SConscript index f4e0b98570..7035bdc634 100644 --- a/src/mesa/SConscript +++ b/src/mesa/SConscript @@ -38,6 +38,7 @@ if env['platform'] != 'winddk':  		'main/clear.c',  		'main/clip.c',  		'main/colortab.c', +		'main/condrender.c',  		'main/context.c',  		'main/convolve.c',  		'main/cpuinfo.c', diff --git a/src/mesa/main/condrender.c b/src/mesa/main/condrender.c new file mode 100644 index 0000000000..52762133a0 --- /dev/null +++ b/src/mesa/main/condrender.c @@ -0,0 +1,143 @@ +/* + * Mesa 3-D graphics library + * Version:  7.8 + * + * Copyright (C) 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, sublicense, + * 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 NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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. + */ + +/** + * \file condrender.c + * Conditional rendering functions + * + * \author Brian Paul + */ + +#include "glheader.h" +#include "condrender.h" +#include "enums.h" +#include "queryobj.h" + + +GLAPI void GLAPIENTRY +_mesa_BeginConditionalRender(GLuint queryId, GLenum mode) +{ +   struct gl_query_object *q; +   GET_CURRENT_CONTEXT(ctx); + +   if (ctx->Query.CondRenderQuery) { +      _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()"); +      return; +   } + +   ASSERT(ctx->Query.CondRenderMode == GL_NONE); + +   switch (mode) { +   case GL_QUERY_WAIT: +   case GL_QUERY_NO_WAIT: +   case GL_QUERY_BY_REGION_WAIT: +   case GL_QUERY_BY_REGION_NO_WAIT: +      /* OK */ +      break; +   default: +      _mesa_error(ctx, GL_INVALID_ENUM, "glBeginConditionalRender(mode=%s)", +                  _mesa_lookup_enum_by_nr(mode)); +      return; +   } + +   q = _mesa_lookup_query_object(ctx, queryId); +   if (!q) { +      _mesa_error(ctx, GL_INVALID_VALUE, +                  "glBeginConditionalRender(bad queryId=%u)", queryId); +      return; +   } +   ASSERT(q->Id == queryId); + +   if (q->Target != GL_SAMPLES_PASSED) { +      _mesa_error(ctx, GL_INVALID_OPERATION, "glBeginConditionalRender()"); +      return; +   } + +   ctx->Query.CondRenderQuery = q; +   ctx->Query.CondRenderMode = mode; + +   if (ctx->Driver.BeginConditionalRender) +      ctx->Driver.BeginConditionalRender(ctx, q, mode); +} + + +GLAPI void APIENTRY +_mesa_EndConditionalRender(void) +{ +   GET_CURRENT_CONTEXT(ctx); + +   if (!ctx->Query.CondRenderQuery) { +      _mesa_error(ctx, GL_INVALID_OPERATION, "glEndConditionalRender()"); +      return; +   } + +   if (ctx->Driver.EndConditionalRender) +      ctx->Driver.EndConditionalRender(ctx, ctx->Query.CondRenderQuery); + +   ctx->Query.CondRenderQuery = NULL; +   ctx->Query.CondRenderMode = GL_NONE; +} + + +/** + * This function is called by software rendering commands to determine if + * subsequent drawing commands should be executed or discarded depending + * on the current conditional rendering state. + * Ideally, this check would be implemented by the GPU when doing hardware + * rendering. + * XXX should this function be called via a new driver hook? + * + * \return GL_TRUE if we should render, GL_FALSE if we should discard + */ +GLboolean +_mesa_check_conditional_render(GLcontext *ctx) +{ +   struct gl_query_object *q = ctx->Query.CondRenderQuery; + +   if (!q) { +      /* no query in progress - draw normally */ +      return GL_TRUE; +   } + +   switch (ctx->Query.CondRenderMode) { +   case GL_QUERY_BY_REGION_WAIT: +      /* fall-through */ +   case GL_QUERY_WAIT: +      if (!q->Ready) { +         ctx->Driver.WaitQuery(ctx, q); +      } +      return q->Result > 0; +   case GL_QUERY_BY_REGION_NO_WAIT: +      /* fall-through */ +   case GL_QUERY_NO_WAIT: +      return q->Ready ? (q->Result > 0) : GL_TRUE; +   default: +      _mesa_problem(ctx, "Bad cond render mode %s in " +                    " _mesa_check_conditional_render()", +                    _mesa_lookup_enum_by_nr(ctx->Query.CondRenderMode)); +      return GL_TRUE; +   } +} diff --git a/src/mesa/main/condrender.h b/src/mesa/main/condrender.h new file mode 100644 index 0000000000..d55e9805fe --- /dev/null +++ b/src/mesa/main/condrender.h @@ -0,0 +1,45 @@ +/* + * Mesa 3-D graphics library + * Version:  7.8 + * + * Copyright (C) 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, sublicense, + * 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 NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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 CONDRENDER_H +#define CONDRENDER_H + + +#include "glheader.h" +#include "context.h" + + +extern void GLAPIENTRY +_mesa_BeginConditionalRender(GLuint queryId, GLenum mode); + +extern void APIENTRY +_mesa_EndConditionalRender(void); + +extern GLboolean +_mesa_check_conditional_render(GLcontext *ctx); + + +#endif /* CONDRENDER_H */ diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 496b0d2ba8..e99e87d905 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -1016,6 +1016,11 @@ struct dd_function_table {  			  GLbitfield, GLuint64);     /*@}*/  #endif + +   /** GL_NV_conditional_render */ +   void (*BeginConditionalRender)(GLcontext *ctx, struct gl_query_object *q, +                                  GLenum mode); +   void (*EndConditionalRender)(GLcontext *ctx, struct gl_query_object *q);  }; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 849d1689c3..1a7f87897a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1899,6 +1899,10 @@ struct gl_query_state     struct _mesa_HashTable *QueryObjects;     struct gl_query_object *CurrentOcclusionObject; /* GL_ARB_occlusion_query */     struct gl_query_object *CurrentTimerObject;     /* GL_EXT_timer_query */ + +   /** GL_NV_conditional_render */ +   struct gl_query_object *CondRenderQuery; +   GLenum CondRenderMode;  }; diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak index a7a3b9a7f9..ba56df5418 100644 --- a/src/mesa/sources.mak +++ b/src/mesa/sources.mak @@ -15,6 +15,7 @@ MAIN_SOURCES = \  	main/clear.c \  	main/clip.c \  	main/colortab.c \ +	main/condrender.c \  	main/context.c \  	main/convolve.c \  	main/cpuinfo.c \ | 
