[Mesa-dev] [PATCH v3 1/4] mesa: add support for nvidia conservative rasterization extensions

Brian Paul brianp at vmware.com
Wed Mar 28 14:43:05 UTC 2018


Looks good overall.  Just some style nit-picks below.

-Brian

On 03/28/2018 04:35 AM, Rhys Perry wrote:
> Although the specs are written against compatibility GL 4.3 and allows core
> profile and GLES2+, it is exposed for GL 1.0+ and GLES1 and GLES2+.
> ---
>   src/mapi/glapi/gen/gl_API.xml           |  47 +++++++++++
>   src/mapi/glapi/gen/gl_genexec.py        |   1 +
>   src/mesa/Makefile.sources               |   2 +
>   src/mesa/main/attrib.c                  |  60 +++++++++++---
>   src/mesa/main/conservativeraster.c      | 138 ++++++++++++++++++++++++++++++++
>   src/mesa/main/conservativeraster.h      |  48 +++++++++++
>   src/mesa/main/context.c                 |  10 +++
>   src/mesa/main/dlist.c                   |  86 ++++++++++++++++++++
>   src/mesa/main/enable.c                  |  14 ++++
>   src/mesa/main/extensions_table.h        |   4 +
>   src/mesa/main/get.c                     |   3 +
>   src/mesa/main/get_hash_params.py        |  13 +++
>   src/mesa/main/mtypes.h                  |  28 ++++++-
>   src/mesa/main/tests/dispatch_sanity.cpp |  27 +++++++
>   src/mesa/main/viewport.c                |  57 +++++++++++++
>   src/mesa/main/viewport.h                |   6 ++
>   src/mesa/meson.build                    |   2 +
>   17 files changed, 535 insertions(+), 11 deletions(-)
>   create mode 100644 src/mesa/main/conservativeraster.c
>   create mode 100644 src/mesa/main/conservativeraster.h
> 
> diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
> index 38c1921047..db312370b1 100644
> --- a/src/mapi/glapi/gen/gl_API.xml
> +++ b/src/mapi/glapi/gen/gl_API.xml
> @@ -12871,6 +12871,53 @@
>     <enum name="CONSERVATIVE_RASTERIZATION_INTEL" value="0x83FE"/>
>   </category>
>   
> +<category name="GL_NV_conservative_raster" number="465">
> +    <enum name="CONSERVATIVE_RASTERIZATION_NV"       value="0x9346">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <enum name="SUBPIXEL_PRECISION_BIAS_X_BITS_NV"   value="0x9347">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <enum name="SUBPIXEL_PRECISION_BIAS_Y_BITS_NV"   value="0x9348">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <enum name="MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV" value="0x9349">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <function name="SubpixelPrecisionBiasNV" es1="1.0" es2="2.0" no_error="true">
> +        <param name="xbits" type="GLuint"/>
> +        <param name="ybits" type="GLuint"/>
> +    </function>
> +</category>
> +
> +<category name="GL_NV_conservative_raster_dilate" number="480">
> +    <enum name="CONSERVATIVE_RASTER_DILATE_NV"             value="0x9379">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <enum name="CONSERVATIVE_RASTER_DILATE_RANGE_NV"       value="0x937A">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <enum name="CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV" value="0x937B">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <function name="ConservativeRasterParameterfNV" es1="1.0" es2="2.0" no_error="true">
> +        <param name="pname" type="GLenum"/>
> +        <param name="param" type="GLfloat"/>
> +    </function>
> +</category>
> +
> +<category name="GL_NV_conservative_pre_snap_triangles" number="487">
> +    <enum name="CONSERVATIVE_RASTER_MODE_NV"       value="0x954D">
> +        <size name="Get" mode="get"/>
> +    </enum>
> +    <enum name="CONSERVATIVE_RASTER_MODE_POST_SNAP_NV"   value="0x954E"/>
> +    <enum name="CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV"   value="0x954F"/>
> +    <function name="ConservativeRasterParameteriNV" es1="1.0" es2="2.0" no_error="true">
> +        <param name="pname" type="GLenum"/>
> +        <param name="param" type="GLint"/>
> +    </function>
> +</category>
> +
>   <xi:include href="INTEL_performance_query.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
>   
>   <category name="GL_EXT_polygon_offset_clamp" number="460">
> diff --git a/src/mapi/glapi/gen/gl_genexec.py b/src/mapi/glapi/gen/gl_genexec.py
> index aaff9f230b..be8013b62b 100644
> --- a/src/mapi/glapi/gen/gl_genexec.py
> +++ b/src/mapi/glapi/gen/gl_genexec.py
> @@ -62,6 +62,7 @@ header = """/**
>   #include "main/colortab.h"
>   #include "main/compute.h"
>   #include "main/condrender.h"
> +#include "main/conservativeraster.h"
>   #include "main/context.h"
>   #include "main/convolve.h"
>   #include "main/copyimage.h"
> diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources
> index 0446078136..43ec55f580 100644
> --- a/src/mesa/Makefile.sources
> +++ b/src/mesa/Makefile.sources
> @@ -49,6 +49,8 @@ MAIN_FILES = \
>   	main/condrender.c \
>   	main/condrender.h \
>   	main/config.h \
> +	main/conservativeraster.c \
> +	main/conservativeraster.h \
>   	main/context.c \
>   	main/context.h \
>   	main/convolve.c \
> diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
> index 9d3aa728a1..a8873f2988 100644
> --- a/src/mesa/main/attrib.c
> +++ b/src/mesa/main/attrib.c
> @@ -138,6 +138,9 @@ struct gl_enable_attrib
>   
>      /* GL_ARB_framebuffer_sRGB / GL_EXT_framebuffer_sRGB */
>      GLboolean sRGBEnabled;
> +
> +   /* GL_NV_conservative_raster */
> +   GLboolean ConservativeRasterization;
>   };
>   
>   
> @@ -178,6 +181,13 @@ struct texture_state
>   };
>   
>   
> +struct viewport_state
> +{
> +   struct gl_viewport_attrib ViewportArray[MAX_VIEWPORTS];
> +   GLuint SubpixelPrecisionBias[2];
> +};
> +
> +
>   /** An unused GL_*_BIT value */
>   #define DUMMY_BIT 0x10000000
>   
> @@ -394,6 +404,9 @@ _mesa_PushAttrib(GLbitfield mask)
>   
>         /* GL_ARB_framebuffer_sRGB / GL_EXT_framebuffer_sRGB */
>         attr->sRGBEnabled = ctx->Color.sRGBEnabled;
> +
> +      /* GL_NV_conservative_raster */
> +      attr->ConservativeRasterization = ctx->ConservativeRasterization;
>      }
>   
>      if (mask & GL_EVAL_BIT) {
> @@ -545,11 +558,23 @@ _mesa_PushAttrib(GLbitfield mask)
>      }
>   
>      if (mask & GL_VIEWPORT_BIT) {
> -      if (!push_attrib(ctx, &head, GL_VIEWPORT_BIT,
> -                       sizeof(struct gl_viewport_attrib)
> -                       * ctx->Const.MaxViewports,
> -                       (void*)&ctx->ViewportArray))
> +      struct viewport_state *viewstate = CALLOC_STRUCT(viewport_state);
> +      if (!viewstate) {
> +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glPushAttrib(GL_VIEWPORT_BIT)");
> +         goto end;
> +      }
> +
> +      if (!save_attrib_data(&head, GL_VIEWPORT_BIT, viewstate)) {
> +         free(viewstate);
> +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glPushAttrib(GL_VIEWPORT_BIT)");
>            goto end;
> +      }
> +
> +      memcpy(&viewstate->ViewportArray, &ctx->ViewportArray,
> +             sizeof(struct gl_viewport_attrib)*ctx->Const.MaxViewports);
> +
> +      viewstate->SubpixelPrecisionBias[0] = ctx->NvSubpixelPrecisionBias[0];
> +      viewstate->SubpixelPrecisionBias[1] = ctx->NvSubpixelPrecisionBias[1];
>      }
>   
>      /* GL_ARB_multisample */
> @@ -714,6 +739,13 @@ pop_enable_group(struct gl_context *ctx, const struct gl_enable_attrib *enable)
>      TEST_AND_UPDATE(ctx->Color.sRGBEnabled, enable->sRGBEnabled,
>                      GL_FRAMEBUFFER_SRGB);
>   
> +   /* GL_NV_conservative_raster */
> +   if (ctx->Extensions.NV_conservative_raster) {
> +      TEST_AND_UPDATE(ctx->ConservativeRasterization,
> +                      enable->ConservativeRasterization,
> +                      GL_CONSERVATIVE_RASTERIZATION_NV);
> +   }
> +
>      /* texture unit enables */
>      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
>         const GLbitfield enabled = enable->Texture[i];
> @@ -1127,7 +1159,8 @@ _mesa_PopAttrib(void)
>                                         ctx->DriverFlags.NewSampleAlphaToXEnable |
>                                         ctx->DriverFlags.NewSampleMask |
>                                         ctx->DriverFlags.NewScissorTest |
> -                                      ctx->DriverFlags.NewStencil;
> +                                      ctx->DriverFlags.NewStencil |
> +                                      ctx->DriverFlags.NewNvConservativeRasterization;
>               }
>               break;
>            case GL_EVAL_BIT:
> @@ -1419,13 +1452,20 @@ _mesa_PopAttrib(void)
>            case GL_VIEWPORT_BIT:
>               {
>                  unsigned i;
> -               const struct gl_viewport_attrib *vp;
> -               vp = (const struct gl_viewport_attrib *) attr->data;
> +               const struct viewport_state *viewstate;
> +               viewstate = (const struct viewport_state *) attr->data;
>   
>                  for (i = 0; i < ctx->Const.MaxViewports; i++) {
> -                  _mesa_set_viewport(ctx, i, vp[i].X, vp[i].Y, vp[i].Width,
> -                                     vp[i].Height);
> -                  _mesa_set_depth_range(ctx, i, vp[i].Near, vp[i].Far);
> +                  const struct gl_viewport_attrib* vp = &viewstate->ViewportArray[i];

We put the * next to the variable, not the type, so gl_viewport_attrib *vp


> +                  _mesa_set_viewport(ctx, i, vp->X, vp->Y, vp->Width,
> +                                     vp->Height);
> +                  _mesa_set_depth_range(ctx, i, vp->Near, vp->Far);
> +               }
> +
> +               if (ctx->Extensions.NV_conservative_raster) {
> +                  GLuint biasx = viewstate->SubpixelPrecisionBias[0];
> +                  GLuint biasy = viewstate->SubpixelPrecisionBias[1];
> +                  _mesa_SubpixelPrecisionBiasNV(biasx, biasy);
>                  }
>               }
>               break;
> diff --git a/src/mesa/main/conservativeraster.c b/src/mesa/main/conservativeraster.c
> new file mode 100644
> index 0000000000..70a07175a2
> --- /dev/null
> +++ b/src/mesa/main/conservativeraster.c
> @@ -0,0 +1,138 @@
> +/*
> + * Mesa 3-D graphics library
> + *
> + * Copyright (C) 2018 Rhys Perry
> + *
> + * 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 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 conservativeraster.c
> + * glConservativeRasterParameteriNV and glConservativeRasterParameterfNV functions
> + */
> +
> +#include "conservativeraster.h"
> +#include "context.h"
> +#include "enums.h"
> +
> +static void
> +conservative_raster_parameter(GLenum pname, GLdouble param,
> +                              bool no_error, bool integer)

It looks like integer is only used for the error message strings.  It 
might be simpler to simply pass the function name as a string.  I think 
that's what we do in most other places.

> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   bool dilate = ctx->Extensions.NV_conservative_raster_dilate;
> +   bool pre_snap = ctx->Extensions.NV_conservative_raster_pre_snap_triangles;
> +   if (!dilate && !pre_snap) {

I think I'd omit the locals and just do:

if (!ctx->Extensions.NV_conservative_raster_dilate &&
     !ctx->Extensions.NV_conservative_raster_pre_snap_triangles) {

> +      _mesa_error(ctx, GL_INVALID_OPERATION, "glSubpixelPrecisionBiasNV");
> +      return;
> +   }
> +
> +   if (MESA_VERBOSE & VERBOSE_API)
> +      _mesa_debug(ctx, "glConservativeRasterParameter%cNV(%s, %g)\n",
> +                  integer?'i':'f', _mesa_enum_to_string(pname), param);
> +
> +   ASSERT_OUTSIDE_BEGIN_END(ctx);
> +
> +   switch (pname) {
> +   case GL_CONSERVATIVE_RASTER_DILATE_NV:
> +      {
> +         if (!ctx->Extensions.NV_conservative_raster_dilate) {
> +            _mesa_error(ctx, GL_INVALID_OPERATION, "glConservativeRasterParameter%cNV",
> +                        integer?'i':'f');
> +            return;
> +         }
> +
> +         if (param < 0.0) {
> +            _mesa_error(ctx, GL_INVALID_VALUE,
> +                        "glConservativeRasterParameter%cNV(param=%g)",
> +                        integer?'i':'f', param);
> +            return;
> +         }
> +         if (param < ctx->Const.ConservativeRasterDilateRange[0])
> +            param = ctx->Const.ConservativeRasterDilateRange[0];
> +         if (param > ctx->Const.ConservativeRasterDilateRange[1])
> +            param = ctx->Const.ConservativeRasterDilateRange[1];

param = CLAMP(param, ctx->Const.ConservativeRasterDilateRange[0],
                      ctx->Const.ConservativeRasterDilateRange[1]);


> +         ctx->ConservativeRasterDilate = param;
> +      }

The code in the switch cases doesn't need to be enclosed in braces.


> +      break;
> +   case GL_CONSERVATIVE_RASTER_MODE_NV:
> +      {
> +         if (!ctx->Extensions.NV_conservative_raster_pre_snap_triangles) {
> +            _mesa_error(ctx, GL_INVALID_OPERATION, "glConservativeRasterParameter%cNV",
> +                        integer?'i':'f');
> +            return;
> +         }
> +
> +         if (param!=GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV &&
> +             param!=GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV) {
> +            _mesa_error(ctx, GL_INVALID_ENUM,
> +                        "glConservativeRasterParameter%cNV(param=%s)",
> +                        integer?'i':'f', _mesa_enum_to_string(param));
> +            return;
> +         }
> +         ctx->ConservativeRasterMode = param;
> +      }
> +      break;
> +   default:
> +      {
> +         _mesa_error(ctx, GL_INVALID_ENUM,
> +                     "glConservativeRasterParameter%cNV(pname=%s)",
> +                     integer?'i':'f', _mesa_enum_to_string(pname));
> +         return;
> +      }
> +      break;
> +   }
> +
> +   FLUSH_VERTICES(ctx, 0);
> +   ctx->NewDriverState |=
> +      ctx->DriverFlags.NewNvConservativeRasterizationParams;
> +}
> +
> +void GLAPIENTRY
> +_mesa_ConservativeRasterParameteriNV_no_error(GLenum pname, GLint param)
> +{
> +   conservative_raster_parameter(pname, param, true, true);
> +}
> +
> +void GLAPIENTRY
> +_mesa_ConservativeRasterParameteriNV(GLenum pname, GLint param)
> +{
> +   conservative_raster_parameter(pname, param, false, true);
> +}
> +
> +void GLAPIENTRY
> +_mesa_ConservativeRasterParameterfNV_no_error(GLenum pname, GLfloat param)
> +{
> +   conservative_raster_parameter(pname, param, true, false);
> +}
> +
> +void GLAPIENTRY
> +_mesa_ConservativeRasterParameterfNV(GLenum pname, GLfloat param)
> +{
> +   conservative_raster_parameter(pname, param, false, false);
> +}
> +
> +void
> +_mesa_init_conservative_raster(struct gl_context *ctx)
> +{
> +   ctx->ConservativeRasterDilate = 0.0;
> +   ctx->ConservativeRasterMode = GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV;
> +}
> diff --git a/src/mesa/main/conservativeraster.h b/src/mesa/main/conservativeraster.h
> new file mode 100644
> index 0000000000..1865cfc2a4
> --- /dev/null
> +++ b/src/mesa/main/conservativeraster.h
> @@ -0,0 +1,48 @@
> +/*
> + * Mesa 3-D graphics library
> + *
> + * Copyright (C) 2018 Rhys Perry
> + *
> + * 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 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 CONSERVATIVERASTER_H
> +#define CONSERVATIVERASTER_H
> +
> +#include "glheader.h"
> +
> +struct gl_context;
> +
> +extern void GLAPIENTRY
> +_mesa_ConservativeRasterParameteriNV_no_error(GLenum pname, GLint param);
> +
> +extern void GLAPIENTRY
> +_mesa_ConservativeRasterParameteriNV(GLenum pname, GLint param);
> +
> +extern void GLAPIENTRY
> +_mesa_ConservativeRasterParameterfNV_no_error(GLenum pname, GLfloat param);
> +
> +extern void GLAPIENTRY
> +_mesa_ConservativeRasterParameterfNV(GLenum pname, GLfloat param);
> +
> +extern void
> +_mesa_init_conservative_raster(struct gl_context *ctx);
> +
> +#endif
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index e13343b5e6..9a4bf8d394 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -87,6 +87,7 @@
>   #include "blend.h"
>   #include "buffers.h"
>   #include "bufferobj.h"
> +#include "conservativeraster.h"
>   #include "context.h"
>   #include "cpuinfo.h"
>   #include "debug.h"
> @@ -739,6 +740,14 @@ _mesa_init_constants(struct gl_constants *consts, gl_api api)
>      consts->MaxComputeVariableGroupSize[1] = 512;
>      consts->MaxComputeVariableGroupSize[2] = 64;
>      consts->MaxComputeVariableGroupInvocations = 512;
> +
> +   /** GL_NV_conservative_raster */
> +   consts->MaxSubpixelPrecisionBiasBits = 0;
> +
> +   /** GL_NV_conservative_raster_dilate */
> +   consts->ConservativeRasterDilateRange[0] = 0.0;
> +   consts->ConservativeRasterDilateRange[0] = 0.0;
> +   consts->ConservativeRasterDilateGranularity = 0.0;
>   }
>   
>   
> @@ -828,6 +837,7 @@ init_attrib_groups(struct gl_context *ctx)
>      _mesa_init_bbox( ctx );
>      _mesa_init_buffer_objects( ctx );
>      _mesa_init_color( ctx );
> +   _mesa_init_conservative_raster( ctx );
>      _mesa_init_current( ctx );
>      _mesa_init_depth( ctx );
>      _mesa_init_debug( ctx );
> diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
> index 2086611aa3..1929cdf2af 100644
> --- a/src/mesa/main/dlist.c
> +++ b/src/mesa/main/dlist.c
> @@ -488,6 +488,15 @@ typedef enum
>      /* EXT_window_rectangles */
>      OPCODE_WINDOW_RECTANGLES,
>   
> +   /* NV_conservative_raster */
> +   OPCODE_SUBPIXEL_PRECISION_BIAS,
> +
> +   /* NV_conservative_raster_dilate */
> +   OPCODE_CONSERVATIVE_RASTER_PARAMETER_F,
> +
> +   /* NV_conservative_raster_pre_snap_triangles */
> +   OPCODE_CONSERVATIVE_RASTER_PARAMETER_I,
> +
>      /* The following three are meta instructions */
>      OPCODE_ERROR,                /* raise compiled-in error */
>      OPCODE_CONTINUE,
> @@ -7928,6 +7937,59 @@ save_WindowRectanglesEXT(GLenum mode, GLsizei count, const GLint *box)
>      }
>   }
>   
> +
> +/** GL_NV_conservative_raster */
> +static void GLAPIENTRY
> +save_SubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +   Node *n;
> +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
> +   n = alloc_instruction(ctx, OPCODE_SUBPIXEL_PRECISION_BIAS, 2);
> +   if (n) {
> +      n[1].ui = xbits;
> +      n[2].ui = ybits;
> +   }
> +   if (ctx->ExecuteFlag) {
> +      CALL_SubpixelPrecisionBiasNV(ctx->Exec, (xbits, ybits));
> +   }
> +}
> +
> +/** GL_NV_conservative_raster_dilate */
> +static void GLAPIENTRY
> +save_ConservativeRasterParameterfNV(GLenum pname, GLfloat param)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +   Node *n;
> +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
> +   n = alloc_instruction(ctx, OPCODE_CONSERVATIVE_RASTER_PARAMETER_F, 2);
> +   if (n) {
> +      n[1].e = pname;
> +      n[2].f = param;
> +   }
> +   if (ctx->ExecuteFlag) {
> +      CALL_ConservativeRasterParameterfNV(ctx->Exec, (pname, param));
> +   }
> +}
> +
> +/** GL_NV_conservative_raster_pre_snap_triangles */
> +static void GLAPIENTRY
> +save_ConservativeRasterParameteriNV(GLenum pname, GLint param)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +   Node *n;
> +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
> +   n = alloc_instruction(ctx, OPCODE_CONSERVATIVE_RASTER_PARAMETER_I, 2);
> +   if (n) {
> +      n[1].e = pname;
> +      n[2].i = param;
> +   }
> +   if (ctx->ExecuteFlag) {
> +      CALL_ConservativeRasterParameteriNV(ctx->Exec, (pname, param));
> +   }
> +}
> +
> +
>   /**
>    * Save an error-generating command into display list.
>    *
> @@ -9137,6 +9199,21 @@ execute_list(struct gl_context *ctx, GLuint list)
>                     ctx->Exec, (n[1].e, n[2].si, get_pointer(&n[3])));
>               break;
>   
> +         /* GL_NV_conservative_raster */
> +         case OPCODE_SUBPIXEL_PRECISION_BIAS:
> +            CALL_SubpixelPrecisionBiasNV(ctx->Exec, (n[1].ui, n[2].ui));
> +            break;
> +
> +         /* GL_NV_conservative_raster_dilate */
> +         case OPCODE_CONSERVATIVE_RASTER_PARAMETER_F:
> +            CALL_ConservativeRasterParameterfNV(ctx->Exec, (n[1].e, n[2].f));
> +            break;
> +
> +         /* GL_NV_conservative_raster_pre_snap_triangles */
> +         case OPCODE_CONSERVATIVE_RASTER_PARAMETER_I:
> +            CALL_ConservativeRasterParameteriNV(ctx->Exec, (n[1].e, n[2].i));
> +            break;
> +
>            case OPCODE_CONTINUE:
>               n = (Node *) get_pointer(&n[1]);
>               break;
> @@ -10049,6 +10126,15 @@ _mesa_initialize_save_table(const struct gl_context *ctx)
>   
>      /* GL_EXT_window_rectangles */
>      SET_WindowRectanglesEXT(table, save_WindowRectanglesEXT);
> +
> +   /* GL_NV_conservative_raster */
> +   SET_SubpixelPrecisionBiasNV(table, save_SubpixelPrecisionBiasNV);
> +
> +   /* GL_NV_conservative_raster_dilate */
> +   SET_ConservativeRasterParameterfNV(table, save_ConservativeRasterParameterfNV);
> +
> +   /* GL_NV_conservative_raster_pre_snap_triangles */
> +   SET_ConservativeRasterParameteriNV(table, save_ConservativeRasterParameteriNV);
>   }
>   
>   
> diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
> index 7625a4c957..84f036071a 100644
> --- a/src/mesa/main/enable.c
> +++ b/src/mesa/main/enable.c
> @@ -482,6 +482,16 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
>               ctx->DriverFlags.NewIntelConservativeRasterization;
>            ctx->IntelConservativeRasterization = state;
>            break;
> +      case GL_CONSERVATIVE_RASTERIZATION_NV:
> +         if (!_mesa_has_NV_conservative_raster(ctx))
> +            goto invalid_enum_error;
> +         if (ctx->ConservativeRasterization == state)
> +            return;
> +         FLUSH_VERTICES(ctx, 0);
> +         ctx->NewDriverState |=
> +            ctx->DriverFlags.NewNvConservativeRasterization;
> +         ctx->ConservativeRasterization = state;
> +         break;
>         case GL_COLOR_LOGIC_OP:
>            if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
>               goto invalid_enum_error;
> @@ -1750,6 +1760,10 @@ _mesa_IsEnabled( GLenum cap )
>            CHECK_EXTENSION(INTEL_conservative_rasterization);
>            return ctx->IntelConservativeRasterization;
>   
> +      case GL_CONSERVATIVE_RASTERIZATION_NV:
> +         CHECK_EXTENSION(NV_conservative_raster);
> +         return ctx->ConservativeRasterization;
> +
>         case GL_TILE_RASTER_ORDER_FIXED_MESA:
>            CHECK_EXTENSION(MESA_tile_raster_order);
>            return ctx->TileRasterOrderFixed;
> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
> index 492f7c3d20..5a57fb7a40 100644
> --- a/src/mesa/main/extensions_table.h
> +++ b/src/mesa/main/extensions_table.h
> @@ -332,6 +332,10 @@ EXT(NVX_gpu_memory_info                     , NVX_gpu_memory_info
>   
>   EXT(NV_blend_square                         , dummy_true                             , GLL,  x ,  x ,  x , 1999)
>   EXT(NV_conditional_render                   , NV_conditional_render                  , GLL, GLC,  x ,  x , 2008)
> +EXT(NV_conservative_raster                  , NV_conservative_raster                 , GLL, GLC, ES1, ES2, 2015)
> +EXT(NV_conservative_raster_dilate           , NV_conservative_raster_dilate          , GLL, GLC, ES1, ES2, 2015)
> +EXT(NV_conservative_raster_pre_snap         , NV_conservative_raster_pre_snap        , GLL, GLC, ES1, ES2, 2017)
> +EXT(NV_conservative_raster_pre_snap_triangles, NV_conservative_raster_pre_snap_triangles, GLL, GLC, ES1, ES2, 2015)
>   EXT(NV_depth_clamp                          , ARB_depth_clamp                        , GLL, GLC,  x ,  x , 2001)
>   EXT(NV_draw_buffers                         , dummy_true                             ,  x ,  x ,  x , ES2, 2011)
>   EXT(NV_fbo_color_attachments                , dummy_true                             ,  x ,  x ,  x , ES2, 2010)
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index 90ab7ca60f..44b7b838a3 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -506,6 +506,9 @@ EXTRA_EXT(OES_primitive_bounding_box);
>   EXTRA_EXT(ARB_compute_variable_group_size);
>   EXTRA_EXT(KHR_robustness);
>   EXTRA_EXT(ARB_sparse_buffer);
> +EXTRA_EXT(NV_conservative_raster);
> +EXTRA_EXT(NV_conservative_raster_dilate);
> +EXTRA_EXT(NV_conservative_raster_pre_snap_triangles);
>   
>   static const int
>   extra_ARB_color_buffer_float_or_glcore[] = {
> diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
> index f38a87df88..b02ea15754 100644
> --- a/src/mesa/main/get_hash_params.py
> +++ b/src/mesa/main/get_hash_params.py
> @@ -355,6 +355,19 @@ descriptor=[
>   # GL_ARB_robustness / GL_KHR_robustness
>     [ "CONTEXT_ROBUST_ACCESS", "CONTEXT_ENUM16(Const.RobustAccess), extra_KHR_robustness" ],
>     [ "RESET_NOTIFICATION_STRATEGY_ARB", "CONTEXT_ENUM16(Const.ResetStrategy), extra_KHR_robustness_or_GL" ],
> +
> +# GL_NV_conservative_raster
> +  [ "SUBPIXEL_PRECISION_BIAS_X_BITS_NV", "CONTEXT_UINT(NvSubpixelPrecisionBias[0]), extra_NV_conservative_raster" ],
> +  [ "SUBPIXEL_PRECISION_BIAS_Y_BITS_NV", "CONTEXT_UINT(NvSubpixelPrecisionBias[1]), extra_NV_conservative_raster" ],
> +  [ "MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV", "CONTEXT_UINT(Const.MaxSubpixelPrecisionBiasBits), extra_NV_conservative_raster" ],
> +
> +# GL_NV_conservative_dilate
> +  [ "CONSERVATIVE_RASTER_DILATE_RANGE_NV", "CONTEXT_FLOAT2(Const.ConservativeRasterDilateRange), extra_NV_conservative_raster_dilate" ],
> +  [ "CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV", "CONTEXT_FLOAT(Const.ConservativeRasterDilateGranularity), extra_NV_conservative_raster_dilate" ],
> +  [ "CONSERVATIVE_RASTER_DILATE_NV", "CONTEXT_FLOAT(ConservativeRasterDilate), extra_NV_conservative_raster_dilate" ],
> +
> +# GL_NV_conservative_raster_pre_snap_triangles
> +  [ "CONSERVATIVE_RASTER_MODE_NV", "CONTEXT_ENUM16(ConservativeRasterMode), extra_NV_conservative_raster_pre_snap_triangles" ],
>   ]},
>   
>   # GLES3 is not a typo.
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 08db8062ec..2d619e5de2 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -4133,6 +4133,13 @@ struct gl_constants
>      /** GL_ARB_get_program_binary */
>      GLuint NumProgramBinaryFormats;
>   
> +   /** GL_NV_conservative_raster */
> +   GLuint MaxSubpixelPrecisionBiasBits;
> +
> +   /** GL_NV_conservative_raster_dilate */
> +   GLfloat ConservativeRasterDilateRange[2];
> +   GLfloat ConservativeRasterDilateGranularity;
> +
>      /** Is the drivers uniform storage packed or padded to 16 bytes. */
>      bool PackedDriverUniformStorage;
>   };
> @@ -4347,6 +4354,10 @@ struct gl_extensions
>      GLboolean NV_texture_env_combine4;
>      GLboolean NV_texture_rectangle;
>      GLboolean NV_vdpau_interop;
> +   GLboolean NV_conservative_raster;
> +   GLboolean NV_conservative_raster_dilate;
> +   GLboolean NV_conservative_raster_pre_snap_triangles;
> +   GLboolean NV_conservative_raster_pre_snap;
>      GLboolean NVX_gpu_memory_info;
>      GLboolean TDFX_texture_compression_FXT1;
>      GLboolean OES_EGL_image;
> @@ -4620,6 +4631,17 @@ struct gl_driver_flags
>       */
>      uint64_t NewIntelConservativeRasterization;
>   
> +   /**
> +    * gl_context::NvConservativeRasterization
> +    */
> +   uint64_t NewNvConservativeRasterization;
> +
> +   /**
> +    * gl_context::NvConservativeRasterMode/NvConservativeRasterDilate
> +    * gl_context::NvSubpixelPrecisionBias
> +    */
> +   uint64_t NewNvConservativeRasterizationParams;
> +
>      /**
>       * gl_context::Scissor::WindowRects
>       */
> @@ -4928,6 +4950,7 @@ struct gl_context
>      struct gl_texture_attrib	Texture;	/**< Texture attributes */
>      struct gl_transform_attrib	Transform;	/**< Transformation attributes */
>      struct gl_viewport_attrib	ViewportArray[MAX_VIEWPORTS];	/**< Viewport attributes */
> +   GLuint			NvSubpixelPrecisionBias[2];	/**< Viewport attributes */
>      /*@}*/
>   
>      /** \name Client attribute stack */
> @@ -5108,7 +5131,10 @@ struct gl_context
>      GLboolean TextureFormatSupported[MESA_FORMAT_COUNT];
>   
>      GLboolean RasterDiscard;  /**< GL_RASTERIZER_DISCARD */
> -   GLboolean IntelConservativeRasterization; /**< GL_INTEL_CONSERVATIVE_RASTERIZATION */
> +   GLboolean IntelConservativeRasterization; /**< GL_CONSERVATIVE_RASTERIZATION_INTEL */
> +   GLboolean ConservativeRasterization; /**< GL_CONSERVATIVE_RASTERIZATION_NV */
> +   GLfloat ConservativeRasterDilate;
> +   GLenum16 ConservativeRasterMode;
>   
>      /** Does glVertexAttrib(0) alias glVertex()? */
>      bool _AttribZeroAliasesVertex;
> diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
> index 83a4b04654..b1413907de 100644
> --- a/src/mesa/main/tests/dispatch_sanity.cpp
> +++ b/src/mesa/main/tests/dispatch_sanity.cpp
> @@ -1026,6 +1026,15 @@ const struct function common_desktop_functions_possible[] = {
>      /* GL_EXT_shader_framebuffer_fetch_non_coherent */
>      { "glFramebufferFetchBarrierEXT", 20, -1 },
>   
> +   /* GL_NV_conservative_raster */
> +   { "glSubpixelPrecisionBiasNV", 10, -1 },
> +
> +   /* GL_NV_conservative_raster_dilate */
> +   { "glConservativeRasterParameterfNV", 10, -1 },
> +
> +   /* GL_NV_conservative_raster_pre_snap_triangles */
> +   { "glConservativeRasterParameteriNV", 10, -1 },
> +
>      { NULL, 0, -1 }
>   };
>   
> @@ -2185,6 +2194,15 @@ const struct function gles11_functions_possible[] = {
>      /* GL_EXT_polygon_offset_clamp */
>      { "glPolygonOffsetClampEXT", 11, -1 },
>   
> +   /* GL_NV_conservative_raster */
> +   { "glSubpixelPrecisionBiasNV", 20, -1 },
> +
> +   /* GL_NV_conservative_raster_dilate */
> +   { "glConservativeRasterParameterfNV", 20, -1 },
> +
> +   /* GL_NV_conservative_raster_pre_snap_triangles */
> +   { "glConservativeRasterParameteriNV", 20, -1 },
> +
>      { NULL, 0, -1 }
>   };
>   
> @@ -2452,6 +2470,15 @@ const struct function gles2_functions_possible[] = {
>      /* GL_EXT_shader_framebuffer_fetch_non_coherent */
>      { "glFramebufferFetchBarrierEXT", 20, -1 },
>   
> +   /* GL_NV_conservative_raster */
> +   { "glSubpixelPrecisionBiasNV", 20, -1 },
> +
> +   /* GL_NV_conservative_raster_dilate */
> +   { "glConservativeRasterParameterfNV", 20, -1 },
> +
> +   /* GL_NV_conservative_raster_pre_snap_triangles */
> +   { "glConservativeRasterParameteriNV", 20, -1 },
> +
>      { NULL, 0, -1 }
>   };
>   
> diff --git a/src/mesa/main/viewport.c b/src/mesa/main/viewport.c
> index 398cc63685..b1a65e5b4f 100644
> --- a/src/mesa/main/viewport.c
> +++ b/src/mesa/main/viewport.c
> @@ -489,6 +489,9 @@ void _mesa_init_viewport(struct gl_context *ctx)
>         ctx->ViewportArray[i].Near = 0.0;
>         ctx->ViewportArray[i].Far = 1.0;
>      }
> +
> +   ctx->NvSubpixelPrecisionBias[0] = 0;
> +   ctx->NvSubpixelPrecisionBias[1] = 0;
>   }
>   
>   
> @@ -599,3 +602,57 @@ _mesa_get_viewport_xform(struct gl_context *ctx, unsigned i,
>         translate[2] = n;
>      }
>   }
> +
> +
> +static void
> +subpixel_precision_bias(struct gl_context *ctx, GLuint xbits, GLuint ybits)
> +{
> +   if (MESA_VERBOSE & VERBOSE_API)
> +      _mesa_debug(ctx, "glSubpixelPrecisionBiasNV(%u, %u)\n", xbits, ybits);
> +
> +   ctx->NvSubpixelPrecisionBias[0] = xbits;
> +   ctx->NvSubpixelPrecisionBias[1] = ybits;
> +
> +   FLUSH_VERTICES(ctx, 0);
> +   ctx->NewDriverState |=
> +      ctx->DriverFlags.NewNvConservativeRasterizationParams;
> +}
> +
> +void GLAPIENTRY
> +_mesa_SubpixelPrecisionBiasNV_no_error(GLuint xbits, GLuint ybits)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   if (MESA_VERBOSE & VERBOSE_API)
> +      _mesa_debug(ctx, "glSubpixelPrecisionBiasNV(%u, %u)\n", xbits, ybits);
> +
> +   subpixel_precision_bias(ctx, xbits, ybits);
> +}
> +
> +void GLAPIENTRY
> +_mesa_SubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   if (MESA_VERBOSE & VERBOSE_API)
> +      _mesa_debug(ctx, "glSubpixelPrecisionBiasNV(%u, %u)\n", xbits, ybits);
> +
> +   ASSERT_OUTSIDE_BEGIN_END(ctx);
> +
> +   if (!ctx->Extensions.NV_conservative_raster) {
> +      _mesa_error(ctx, GL_INVALID_OPERATION, "glSubpixelPrecisionBiasNV");
> +      return;
> +   }
> +
> +   if (xbits > ctx->Const.MaxSubpixelPrecisionBiasBits) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glSubpixelPrecisionBiasNV");
> +      return;
> +   }
> +
> +   if (ybits > ctx->Const.MaxSubpixelPrecisionBiasBits) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "glSubpixelPrecisionBiasNV");
> +      return;
> +   }
> +
> +   subpixel_precision_bias(ctx, xbits, ybits);
> +}
> diff --git a/src/mesa/main/viewport.h b/src/mesa/main/viewport.h
> index 5860e4f5dc..aca62965b0 100644
> --- a/src/mesa/main/viewport.h
> +++ b/src/mesa/main/viewport.h
> @@ -104,4 +104,10 @@ extern void
>   _mesa_get_viewport_xform(struct gl_context *ctx, unsigned i,
>                            float scale[3], float translate[3]);
>   
> +extern void GLAPIENTRY
> +_mesa_SubpixelPrecisionBiasNV_no_error(GLuint xbits, GLuint ybits);
> +
> +extern void GLAPIENTRY
> +_mesa_SubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits);
> +
>   #endif
> diff --git a/src/mesa/meson.build b/src/mesa/meson.build
> index b74d169377..0aa7beca1f 100644
> --- a/src/mesa/meson.build
> +++ b/src/mesa/meson.build
> @@ -100,6 +100,8 @@ files_libmesa_common = files(
>     'main/condrender.c',
>     'main/condrender.h',
>     'main/config.h',
> +  'main/conservativeraster.c',
> +  'main/conservativeraster.h',
>     'main/context.c',
>     'main/context.h',
>     'main/convolve.c',
> 



More information about the mesa-dev mailing list