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

Ilia Mirkin imirkin at alum.mit.edu
Fri Jun 10 15:16:19 UTC 2016


On Fri, Jun 10, 2016 at 9:47 AM, Brian Paul <brianp at vmware.com> wrote:
> 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?
>

Happy to go with your suggestion - naming is one of the things I
usually care the least about.

>
>
>> +   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()?

I thought about that. I explicitly left it as an integer though, since
the mode is not one of the recognized values, it's unclear that it
would make sense to convert it to an enum string - it's probably just
some random value.

I can make the switch though - I don't feel strongly about it either.

>
>
>
>> +      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>

Thanks!

>
> Any plans for a driver implementation?

Yep. We have it documented for G80 and GF100+ in rnndb, and I'm going
to go digging to see if it's available prior to that.

Marek mentioned last night that AMD hardware should be able to support
it, but it only has 4 cliprects, not 8. Perhaps that number could be
reduced in the spec.

Cheers,

  -ilia


More information about the mesa-dev mailing list