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

Brian Paul brianp at vmware.com
Wed Mar 28 14:49:32 UTC 2018


On 03/28/2018 04:35 AM, Rhys Perry wrote:
> ---
>   src/mesa/state_tracker/st_atom_rasterizer.c | 15 +++++++++++++
>   src/mesa/state_tracker/st_context.c         |  2 ++
>   src/mesa/state_tracker/st_extensions.c      | 34 +++++++++++++++++++++++++++++
>   3 files changed, 51 insertions(+)
> 
> diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c
> index 1be072e6e3..5b747a924e 100644
> --- a/src/mesa/state_tracker/st_atom_rasterizer.c
> +++ b/src/mesa/state_tracker/st_atom_rasterizer.c
> @@ -298,5 +298,20 @@ st_update_rasterizer(struct st_context *st)
>      raster->clip_plane_enable = ctx->Transform.ClipPlanesEnabled;
>      raster->clip_halfz = (ctx->Transform.ClipDepthMode == GL_ZERO_TO_ONE);
>   
> +    /* ST_NEW_RASTERIZER */
> +   if (ctx->ConservativeRasterization) {
> +      if (ctx->ConservativeRasterMode == GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV)
> +         raster->conservative_raster_mode = PIPE_CONSERVATIVE_RASTER_POST_SNAP;
> +      else
> +         raster->conservative_raster_mode = PIPE_CONSERVATIVE_RASTER_PRE_SNAP;
> +   } else {
> +      raster->conservative_raster_mode = PIPE_CONSERVATIVE_RASTER_OFF;
> +   }
> +
> +   raster->conservative_raster_dilate = ctx->ConservativeRasterDilate;
> +
> +   raster->subpixel_precision_x = ctx->NvSubpixelPrecisionBias[0];
> +   raster->subpixel_precision_y = ctx->NvSubpixelPrecisionBias[1];
> +
>      cso_set_rasterizer(st->cso_context, raster);
>   }
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index 90b7f9359a..0709681e16 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -344,6 +344,8 @@ st_init_driver_flags(struct st_context *st)
>      f->NewPolygonState = ST_NEW_RASTERIZER;
>      f->NewPolygonStipple = ST_NEW_POLY_STIPPLE;
>      f->NewViewport = ST_NEW_VIEWPORT;
> +   f->NewNvConservativeRasterization = ST_NEW_RASTERIZER;
> +   f->NewNvConservativeRasterizationParams = ST_NEW_RASTERIZER;
>   }
>   
>   
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index bea61f21cb..02832f3951 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -494,6 +494,16 @@ void st_init_limits(struct pipe_screen *screen,
>      c->UseSTD430AsDefaultPacking =
>         screen->get_param(screen, PIPE_CAP_LOAD_CONSTBUF);
>   
> +   c->MaxSubpixelPrecisionBiasBits =
> +      screen->get_param(screen, PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS);
> +
> +   c->ConservativeRasterDilateRange[0] =
> +      screen->get_paramf(screen, PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE);
> +   c->ConservativeRasterDilateRange[1] =
> +      screen->get_paramf(screen, PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE);
> +   c->ConservativeRasterDilateGranularity =
> +      screen->get_paramf(screen, PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY);
> +
>      /* limit the max combined shader output resources to a driver limit */
>      temp = screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES);
>      if (temp > 0 && c->MaxCombinedShaderOutputResources > temp)
> @@ -1363,4 +1373,28 @@ void st_init_extensions(struct pipe_screen *screen,
>         extensions->ARB_texture_cube_map_array &&
>         extensions->ARB_texture_stencil8 &&
>         extensions->ARB_texture_multisample;
> +
> +   if (screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES) &&
> +       screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES) &&
> +       screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE)) {
> +      float max_dilate;
> +      bool pre_snap_triangles, pre_snap_points_lines;
> +
> +      max_dilate = screen->get_paramf(screen, PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE);
> +
> +      pre_snap_triangles =
> +         screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES);
> +      pre_snap_points_lines =
> +         screen->get_param(screen, PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES);
> +
> +      extensions->NV_conservative_raster =
> +         screen->get_param(screen, PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS) > 1;
> +
> +      if (extensions->NV_conservative_raster) {
> +         extensions->NV_conservative_raster_dilate = max_dilate>=0.75;

Spaces before/after >=


> +         extensions->NV_conservative_raster_pre_snap_triangles = pre_snap_triangles;
> +         extensions->NV_conservative_raster_pre_snap =
> +            pre_snap_triangles && pre_snap_points_lines;
> +      }
> +   }
>   }
> 

Other than that, patches 2&3 look OK to me.
Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list