[Mesa-dev] [PATCH v5 3/4] st/mesa: add support for nvidia conservative rasterization extensions
Rhys Perry
pendingchaos02 at gmail.com
Sat Apr 7 22:15:04 UTC 2018
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
---
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 a3da0f8f1f..6858f0df11 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 0dc8adb262..5479e637af 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)
@@ -1364,4 +1374,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;
+ extensions->NV_conservative_raster_pre_snap_triangles = pre_snap_triangles;
+ extensions->NV_conservative_raster_pre_snap =
+ pre_snap_triangles && pre_snap_points_lines;
+ }
+ }
}
--
2.14.3
More information about the mesa-dev
mailing list