[Mesa-dev] [PATCH 3/3] mesa: add GL_EXT_window_rectangles state storage/retrieval functionality

Brian Paul brianp at vmware.com
Fri Jun 10 13:47:29 UTC 2016


On 06/09/2016 09:37 PM, Ilia Mirkin wrote:
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>   src/mesa/main/attrib.c           |  7 ++++++
>   src/mesa/main/config.h           |  7 ++++--
>   src/mesa/main/extensions_table.h |  1 +
>   src/mesa/main/get.c              | 12 ++++++++++
>   src/mesa/main/get_hash_params.py |  5 +++++
>   src/mesa/main/mtypes.h           |  5 +++++
>   src/mesa/main/scissor.c          | 48 ++++++++++++++++++++++++++++++++++++++++
>   7 files changed, 83 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
> index 61f7036..3bd7fc2 100644
> --- a/src/mesa/main/attrib.c
> +++ b/src/mesa/main/attrib.c
> @@ -1305,6 +1305,13 @@ _mesa_PopAttrib(void)
>                     _mesa_set_enablei(ctx, GL_SCISSOR_TEST, i,
>                                       (scissor->EnableFlags >> i) & 1);
>                  }
> +               if (ctx->Extensions.EXT_window_rectangles) {
> +                  STATIC_ASSERT(sizeof(struct gl_scissor_rect) ==
> +                                4 * sizeof(GLint));
> +                  _mesa_WindowRectanglesEXT(
> +                        scissor->WindowRectMode, scissor->EnabledRects,
> +                        (const GLint *)scissor->WindowRects);
> +               }
>               }
>               break;
>            case GL_STENCIL_BUFFER_BIT:
> diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h
> index bc5e569..0d0ee90 100644
> --- a/src/mesa/main/config.h
> +++ b/src/mesa/main/config.h
> @@ -132,10 +132,13 @@
>    */
>   #define MAX_TEXTURE_UNITS ((MAX_TEXTURE_COORD_UNITS > MAX_TEXTURE_IMAGE_UNITS) ? MAX_TEXTURE_COORD_UNITS : MAX_TEXTURE_IMAGE_UNITS)
>
> -/** Maximun number of viewports supported with ARB_viewport_array */
> +/** Maximum number of viewports supported with ARB_viewport_array */
>   #define MAX_VIEWPORTS 16
>
> -/** Maxmimum size for CVA.  May be overridden by the drivers.  */
> +/** Maximum number of window rectangles supported with EXT_window_rectangles */
> +#define MAX_WINDOW_RECTANGLES 8
> +
> +/** Maximum size for CVA.  May be overridden by the drivers.  */
>   #define MAX_ARRAY_LOCK_SIZE 3000
>
>   /** Subpixel precision for antialiasing, window coordinate snapping */
> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
> index ea8eb30..ad3bffc 100644
> --- a/src/mesa/main/extensions_table.h
> +++ b/src/mesa/main/extensions_table.h
> @@ -267,6 +267,7 @@ EXT(EXT_transform_feedback                  , EXT_transform_feedback
>   EXT(EXT_unpack_subimage                     , dummy_true                             ,  x ,  x ,  x , ES2, 2011)
>   EXT(EXT_vertex_array                        , dummy_true                             , GLL,  x ,  x ,  x , 1995)
>   EXT(EXT_vertex_array_bgra                   , EXT_vertex_array_bgra                  , GLL, GLC,  x ,  x , 2008)
> +EXT(EXT_window_rectangles                   , EXT_window_rectangles                  , GLL, GLC,  x ,  30, 2016)
>
>   EXT(GREMEDY_string_marker                   , GREMEDY_string_marker                  , GLL, GLC,  x ,  x , 2007)
>
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index 9f70749..815af50 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -464,6 +464,7 @@ EXTRA_EXT(ARB_indirect_parameters);
>   EXTRA_EXT(ATI_meminfo);
>   EXTRA_EXT(NVX_gpu_memory_info);
>   EXTRA_EXT(ARB_cull_distance);
> +EXTRA_EXT(EXT_window_rectangles);
>
>   static const int
>   extra_ARB_color_buffer_float_or_glcore[] = {
> @@ -2009,6 +2010,17 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
>         v->value_int_4[3] = ctx->Scissor.ScissorArray[index].Height;
>         return TYPE_INT_4;
>
> +   case GL_WINDOW_RECTANGLE_EXT:
> +      if (!ctx->Extensions.EXT_window_rectangles)
> +         goto invalid_enum;
> +      if (index >= ctx->Const.MaxWindowRectangles)
> +         goto invalid_value;
> +      v->value_int_4[0] = ctx->Scissor.WindowRects[index].X;
> +      v->value_int_4[1] = ctx->Scissor.WindowRects[index].Y;
> +      v->value_int_4[2] = ctx->Scissor.WindowRects[index].Width;
> +      v->value_int_4[3] = ctx->Scissor.WindowRects[index].Height;
> +      return TYPE_INT_4;
> +
>      case GL_VIEWPORT:
>         if (index >= ctx->Const.MaxViewports)
>            goto invalid_value;
> diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
> index bfcbfd6..3af6df0 100644
> --- a/src/mesa/main/get_hash_params.py
> +++ b/src/mesa/main/get_hash_params.py
> @@ -416,6 +416,11 @@ descriptor=[
>     [ "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS", "CONTEXT_INT(Const.MaxTransformFeedbackInterleavedComponents), extra_EXT_transform_feedback" ],
>     [ "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS", "CONTEXT_INT(Const.MaxTransformFeedbackBuffers), extra_EXT_transform_feedback" ],
>     [ "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS", "CONTEXT_INT(Const.MaxTransformFeedbackSeparateComponents), extra_EXT_transform_feedback" ],
> +
> +# GL_EXT_window_rectangles
> +  [ "MAX_WINDOW_RECTANGLES_EXT", "CONTEXT_INT(Const.MaxWindowRectangles), extra_EXT_window_rectangles" ],
> +  [ "NUM_WINDOW_RECTANGLES_EXT", "CONTEXT_INT(Scissor.EnabledRects), extra_EXT_window_rectangles" ],
> +  [ "WINDOW_RECTANGLE_MODE_EXT", "CONTEXT_ENUM(Scissor.WindowRectMode), extra_EXT_window_rectangles" ],
>   ]},
>
>   { "apis": ["GLES", "GLES2"], "params": [
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 471d41d..9e5ba97 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -796,6 +796,9 @@ struct gl_scissor_attrib
>   {
>      GLbitfield EnableFlags;	/**< Scissor test enabled? */
>      struct gl_scissor_rect ScissorArray[MAX_VIEWPORTS];
> +   GLint EnabledRects;          /**< Count of enabled window rectangles */

I'd have gone with GLuint NumWindowRects;  'Enabled' usually implies a 
boolean or bitmask of flags.  What do you think?


> +   GLenum WindowRectMode;       /**< Whether to include or exclude the rects */
> +   struct gl_scissor_rect WindowRects[MAX_WINDOW_RECTANGLES];
>   };
>
>
> @@ -3449,6 +3452,7 @@ struct gl_constants
>         GLfloat Min;
>         GLfloat Max;
>      } ViewportBounds;                         /**< GL_ARB_viewport_array */
> +   GLuint MaxWindowRectangles;               /**< GL_EXT_window_rectangles */
>
>      struct gl_program_constants Program[MESA_SHADER_STAGES];
>      GLuint MaxProgramMatrices;
> @@ -3916,6 +3920,7 @@ struct gl_extensions
>      GLboolean EXT_transform_feedback;
>      GLboolean EXT_timer_query;
>      GLboolean EXT_vertex_array_bgra;
> +   GLboolean EXT_window_rectangles;
>      GLboolean OES_copy_image;
>      GLboolean OES_sample_variables;
>      GLboolean OES_shader_io_blocks;
> diff --git a/src/mesa/main/scissor.c b/src/mesa/main/scissor.c
> index 2b568e4..c1a5f37 100644
> --- a/src/mesa/main/scissor.c
> +++ b/src/mesa/main/scissor.c
> @@ -25,6 +25,7 @@
>
>   #include "main/glheader.h"
>   #include "main/context.h"
> +#include "main/enums.h"
>   #include "main/mtypes.h"
>   #include "main/scissor.h"
>
> @@ -213,7 +214,53 @@ _mesa_ScissorIndexedv(GLuint index, const GLint *v)
>   void GLAPIENTRY
>   _mesa_WindowRectanglesEXT(GLenum mode, GLsizei count, const GLint *box)
>   {
> +   int i;
> +   struct gl_scissor_rect newval[MAX_WINDOW_RECTANGLES];
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   if (MESA_VERBOSE & VERBOSE_API)
> +      _mesa_debug(ctx, "glWindowRectanglesEXT(%s, %d, %p)\n",
> +                  _mesa_enum_to_string(mode), count, box);
> +
> +   if (mode != GL_INCLUSIVE_EXT && mode != GL_EXCLUSIVE_EXT) {
> +      _mesa_error(ctx, GL_INVALID_ENUM,
> +                  "glWindowRectanglesEXT(invalid mode 0x%x", mode);

How about %s and _mesa_enum_to_string()?


> +      return;
> +   }
> +
> +   if (count < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glWindowRectanglesEXT(count < 0)");
> +      return;
> +   }
> +
> +   if (count >= ctx->Const.MaxWindowRectangles) {
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glWindowRectanglesEXT(count >= MaxWindowRectangles (%d)",
> +                  ctx->Const.MaxWindowRectangles);
> +      return;
> +   }
> +
> +   for (i = 0; i < count; i++) {
> +      if (box[2] < 0 || box[3] < 0) {
> +         _mesa_error(ctx, GL_INVALID_VALUE,
> +                     "glWindowRectanglesEXT(box %d: w < 0 || h < 0)", i);
> +         return;
> +      }
> +      newval[i].X = box[0];
> +      newval[i].Y = box[1];
> +      newval[i].Width = box[2];
> +      newval[i].Height = box[3];
> +      box += 4;
> +   }
> +
> +   FLUSH_VERTICES(ctx, _NEW_SCISSOR);
> +   memcpy(ctx->Scissor.WindowRects, newval,
> +          sizeof(struct gl_scissor_rect) * count);
> +   ctx->Scissor.EnabledRects = count;
> +   ctx->Scissor.WindowRectMode = mode;
>
> +   if (ctx->Driver.Scissor)
> +      ctx->Driver.Scissor(ctx);
>   }
>
>
> @@ -228,6 +275,7 @@ _mesa_init_scissor(struct gl_context *ctx)
>
>      /* Scissor group */
>      ctx->Scissor.EnableFlags = 0;
> +   ctx->Scissor.WindowRectMode = GL_EXCLUSIVE_EXT;
>
>      /* Note: ctx->Const.MaxViewports may not have been set by the driver yet,
>       * so just initialize all of them.
>

Otherwise the series looks good.

Reviewed-by: Brian Paul <brianp at vmware.com>

Any plans for a driver implementation?



More information about the mesa-dev mailing list