[Mesa-dev] [PATCH 2/4] gallium: add initial support for conservative rasterization

Roland Scheidegger sroland at vmware.com
Wed Mar 21 23:37:21 UTC 2018


Personally I'm not a big proponent on propagating single-vendor
extensions (which are useless for anything but one specific driver) more
or less directly through to gallium.
There's an intel extension doing similar things already too.
Ideally we'd end up with some bits in gallium which can do whatever the
standardized version of it is going to require in some sensible way - at
least I'd hope that such an extension will surface...

Roland


Am 22.03.2018 um 00:11 schrieb pendingchaos:
> ---
>  src/gallium/docs/source/cso/rasterizer.rst       | 18 ++++++++++++++++++
>  src/gallium/docs/source/screen.rst               | 18 ++++++++++++++++++
>  src/gallium/drivers/etnaviv/etnaviv_screen.c     | 10 ++++++++++
>  src/gallium/drivers/freedreno/freedreno_screen.c | 10 ++++++++++
>  src/gallium/drivers/i915/i915_screen.c           | 13 +++++++++++++
>  src/gallium/drivers/llvmpipe/lp_screen.c         | 12 ++++++++++++
>  src/gallium/drivers/nouveau/nv30/nv30_screen.c   | 10 ++++++++++
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c   | 10 ++++++++++
>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   | 10 ++++++++++
>  src/gallium/drivers/r300/r300_screen.c           | 10 ++++++++++
>  src/gallium/drivers/r600/r600_pipe.c             |  6 ++++++
>  src/gallium/drivers/r600/r600_pipe_common.c      |  4 ++++
>  src/gallium/drivers/radeonsi/si_get.c            | 10 ++++++++++
>  src/gallium/drivers/softpipe/sp_screen.c         | 12 ++++++++++++
>  src/gallium/drivers/svga/svga_screen.c           | 13 +++++++++++++
>  src/gallium/drivers/swr/swr_screen.cpp           | 10 ++++++++++
>  src/gallium/drivers/vc4/vc4_screen.c             | 13 ++++++++++++-
>  src/gallium/drivers/vc5/vc5_screen.c             | 13 ++++++++++++-
>  src/gallium/drivers/virgl/virgl_screen.c         | 10 ++++++++++
>  src/gallium/include/pipe/p_defines.h             | 20 ++++++++++++++++++++
>  src/gallium/include/pipe/p_state.h               |  6 ++++++
>  21 files changed, 236 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gallium/docs/source/cso/rasterizer.rst b/src/gallium/docs/source/cso/rasterizer.rst
> index 616e4511a2..4e2d487674 100644
> --- a/src/gallium/docs/source/cso/rasterizer.rst
> +++ b/src/gallium/docs/source/cso/rasterizer.rst
> @@ -340,3 +340,21 @@ clip_plane_enable
>      If any clip distance output is written, those half-spaces for which no
>      clip distance is written count as disabled; i.e. user clip planes and
>      shader clip distances cannot be mixed, and clip distances take precedence.
> +
> +conservative_raster_mode
> +    The conservative rasterization mode.  For PIPE_CONSERVATIVE_RASTER_OFF,
> +    conservative rasterization is disabled.  For IPE_CONSERVATIVE_RASTER_POST_SNAP
> +    or PIPE_CONSERVATIVE_RASTER_PRE_SNAP, conservative rasterization is nabled.
> +    When conservative rasterization is enabled, the polygon smooth, line mooth,
> +    point smooth and line stipple settings are ignored.
> +    With the post-snap mode, unlike the pre-snap mode, fragments are never
> +    generated for degenerate primitives.  Degenerate primitives, when rasterized,
> +    are considered back-facing and the vertex attributes and depth are that of
> +    the provoking vertex.
> +    If the post-snap mode is used with an unsupported primitive, the pre-snap
> +    mode is used, if supported.  Behavior is similar for the pre-snap mode.
> +    If the pre-snap mode is used, fragments are generated with respect to the primitive
> +    before vertex snapping.
> +
> +conservative_raster_dilate
> +    The amount of dilation during conservative rasterization.
> diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
> index 3837360fb4..5bc6ee99f0 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -420,6 +420,18 @@ The integer capabilities:
>    by the driver, and the driver can throw assertion failures.
>  * ``PIPE_CAP_PACKED_UNIFORMS``: True if the driver supports packed uniforms
>    as opposed to padding to vec4s.
> +* ``PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES``: Whether the
> +  PIPE_CONSERVATIVE_RASTER_POST_SNAP mode is supported for triangles.
> +* ``PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES``: Whether the
> +PIPE_CONSERVATIVE_RASTER_POST_SNAP mode is supported for points and lines.
> +* ``PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES``: Whether the
> +PIPE_CONSERVATIVE_RASTER_PRE_SNAP mode is supported for triangles.
> +* ``PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES``: Whether the
> +PIPE_CONSERVATIVE_RASTER_PRE_SNAP mode is supported for points and lines.
> +* ``PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE``: Whether PIPE_CAP_POST_DEPTH_COVERAGE
> +works with conservative rasterization.
> +* ``PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS``: The maximum
> +subpixel precision bias in bits during conservative rasterization.
>  
>  
>  .. _pipe_capf:
> @@ -437,6 +449,12 @@ The floating-point capabilities are:
>    applied to anisotropically filtered textures.
>  * ``PIPE_CAPF_MAX_TEXTURE_LOD_BIAS``: The maximum :term:`LOD` bias that may be applied
>    to filtered textures.
> +* ``PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE``: The minimum conservative rasterization
> +  dilation.
> +* ``PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE``: The maximum conservative rasterization
> +  dilation.
> +* ``PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY``: The conservative rasterization
> +  dilation granularity for values relative to the minimum dilation.
>  
>  
>  .. _pipe_shader_cap:
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index 2ae4e86c63..6f3a892b10 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -269,6 +269,12 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_CONTEXT_PRIORITY_MASK:
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>     case PIPE_CAP_PACKED_UNIFORMS:
>        return 0;
>  
> @@ -370,6 +376,10 @@ etna_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
>        return 16.0f;
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return util_last_bit(screen->specs.max_texture_size);
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0f;
>     }
>  
>     debug_printf("unknown paramf %d", param);
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
> index f338d756df..c59995c75d 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -340,6 +340,12 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>  	case PIPE_CAP_FENCE_SIGNAL:
>  	case PIPE_CAP_CONSTBUF0_FLAGS:
>  	case PIPE_CAP_PACKED_UNIFORMS:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +	case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>  		return 0;
>  
>  	case PIPE_CAP_CONTEXT_PRIORITY_MASK:
> @@ -479,6 +485,10 @@ fd_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
>  		return 16.0f;
>  	case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>  		return 15.0f;
> +	case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +	case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +	case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +		return 0.0f;
>  	}
>  	debug_printf("unknown paramf %d\n", param);
>  	return 0;
> diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
> index 59d2ec6628..9d99238f2b 100644
> --- a/src/gallium/drivers/i915/i915_screen.c
> +++ b/src/gallium/drivers/i915/i915_screen.c
> @@ -283,6 +283,12 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
>     case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
>     case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
>     case PIPE_CAP_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>  
>     case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
> @@ -435,6 +441,13 @@ i915_get_paramf(struct pipe_screen *screen, enum pipe_capf cap)
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 16.0;
>  
> +   case PIPE_CAPF_MIN_CONSERVTIVE_RASTER_DILATE:
> +      /* fall-through */
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +      /* fall-through */
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0f;
> +
>     default:
>        debug_printf("%s: Unknown cap %u.\n", __FUNCTION__, cap);
>        return 0;
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
> index 3f5d0327bf..af1aff4e1e 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -362,6 +362,12 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
>     case PIPE_CAP_PACKED_UNIFORMS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>     }
>     /* should only get here on unhandled cases */
> @@ -422,6 +428,12 @@ llvmpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
>        return 16.0; /* not actually signficant at this time */
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 16.0; /* arbitrary */
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +      return 0.0;
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +      return 0.0;
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0;
>     }
>     /* should only get here on unhandled cases */
>     debug_printf("Unexpected PIPE_CAP %d query\n", param);
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> index 1d1fbaad60..a24176a8e9 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
> @@ -229,6 +229,12 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
>     case PIPE_CAP_PACKED_UNIFORMS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> @@ -270,6 +276,10 @@ nv30_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
>        return (eng3d->oclass >= NV40_3D_CLASS) ? 16.0 : 8.0;
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 15.0;
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0;
>     default:
>        debug_printf("unknown paramf %d\n", param);
>        return 0;
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index 6fd2982e3c..1db112fa6c 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -281,6 +281,12 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
>     case PIPE_CAP_PACKED_UNIFORMS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> @@ -398,6 +404,10 @@ nv50_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
>        return 16.0f;
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 4.0f;
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0f;
>     }
>  
>     NOUVEAU_ERR("unknown PIPE_CAPF %d\n", param);
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index b4a2c676f5..ddbb3ec16d 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -309,6 +309,12 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
>     case PIPE_CAP_PACKED_UNIFORMS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> @@ -450,6 +456,10 @@ nvc0_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
>        return 16.0f;
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 15.0f;
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0f;
>     }
>  
>     NOUVEAU_ERR("unknown PIPE_CAPF %d\n", param);
> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
> index 8ea2e87ce6..8a6e0c2f21 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -251,6 +251,12 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>          case PIPE_CAP_FENCE_SIGNAL:
>          case PIPE_CAP_CONSTBUF0_FLAGS:
>          case PIPE_CAP_PACKED_UNIFORMS:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +        case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>              return 0;
>  
>          /* SWTCL-only features. */
> @@ -475,6 +481,10 @@ static float r300_get_paramf(struct pipe_screen* pscreen,
>              return 16.0f;
>          case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>              return 16.0f;
> +        case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +        case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +        case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +            return 0.0f;
>          default:
>              debug_printf("r300: Warning: Unknown CAP %d in get_paramf.\n",
>                           param);
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index 43f2dfae7e..102e75035f 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -415,6 +415,12 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>  	case PIPE_CAP_FENCE_SIGNAL:
>  	case PIPE_CAP_CONSTBUF0_FLAGS:
>  	case PIPE_CAP_PACKED_UNIFORMS:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +	case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>  		return 0;
>  
>  	case PIPE_CAP_DOUBLES:
> diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c
> index 026e8dc986..c53a7cc4f0 100644
> --- a/src/gallium/drivers/r600/r600_pipe_common.c
> +++ b/src/gallium/drivers/r600/r600_pipe_common.c
> @@ -910,6 +910,10 @@ static float r600_get_paramf(struct pipe_screen* pscreen,
>  		return 16.0f;
>  	case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>  		return 16.0f;
> +    case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +    case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +    case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +        return 0.0f;
>  	}
>  	return 0.0f;
>  }
> diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c
> index b4ca5bea94..b5c6a3a4c8 100644
> --- a/src/gallium/drivers/radeonsi/si_get.c
> +++ b/src/gallium/drivers/radeonsi/si_get.c
> @@ -274,6 +274,12 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>  	case PIPE_CAP_TILE_RASTER_ORDER:
>  	case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
>  	case PIPE_CAP_CONTEXT_PRIORITY_MASK:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +	case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +	case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>  		return 0;
>  
>  	case PIPE_CAP_FENCE_SIGNAL:
> @@ -373,6 +379,10 @@ static float si_get_paramf(struct pipe_screen* pscreen, enum pipe_capf param)
>  		return 16.0f;
>  	case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>  		return 16.0f;
> +	case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +	case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +	case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +		return 0.0f;
>  	}
>  	return 0.0f;
>  }
> diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
> index 25f6f74f36..f9c786ae75 100644
> --- a/src/gallium/drivers/softpipe/sp_screen.c
> +++ b/src/gallium/drivers/softpipe/sp_screen.c
> @@ -314,6 +314,12 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
>     case PIPE_CAP_PACKED_UNIFORMS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>     case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
>        return 4;
> @@ -362,6 +368,12 @@ softpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
>        return 16.0;
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 16.0; /* arbitrary */
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +      return 0.0;
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +      return 0.0;
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0;
>     }
>     /* should only get here on unhandled cases */
>     debug_printf("Unexpected PIPE_CAPF %d query\n", param);
> diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
> index f5f07fa75e..82d7c98b68 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -167,6 +167,13 @@ svga_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 15.0;
>  
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +      /* fall-through */
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +      /* fall-through */
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0f;
> +
>     }
>  
>     debug_printf("Unexpected PIPE_CAPF_ query %u\n", param);
> @@ -373,6 +380,12 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_PCI_DEVICE:
>     case PIPE_CAP_PCI_FUNCTION:
>     case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>     case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>        return 64;
> diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp
> index dd2d003d15..17d54b3220 100644
> --- a/src/gallium/drivers/swr/swr_screen.cpp
> +++ b/src/gallium/drivers/swr/swr_screen.cpp
> @@ -347,6 +347,12 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
>     case PIPE_CAP_PACKED_UNIFORMS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>  
>     case PIPE_CAP_VENDOR_ID:
> @@ -400,6 +406,10 @@ swr_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
>        return 0.0;
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return 16.0; /* arbitrary */
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0f;
>     }
>     /* should only get here on unhandled cases */
>     debug_printf("Unexpected PIPE_CAPF %d query\n", param);
> diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c
> index cead71b77c..81c8049325 100644
> --- a/src/gallium/drivers/vc4/vc4_screen.c
> +++ b/src/gallium/drivers/vc4/vc4_screen.c
> @@ -287,7 +287,13 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>          case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:
>          case PIPE_CAP_CONTEXT_PRIORITY_MASK:
>          case PIPE_CAP_FENCE_SIGNAL:
> -	case PIPE_CAP_CONSTBUF0_FLAGS:
> +        case PIPE_CAP_CONSTBUF0_FLAGS:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +        case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>          case PIPE_CAP_PACKED_UNIFORMS:
>                  return 0;
>  
> @@ -375,6 +381,11 @@ vc4_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
>                  return 0.0f;
>          case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>                  return 0.0f;
> +
> +        case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +        case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +        case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +                return 0.0f;
>          default:
>                  fprintf(stderr, "unknown paramf %d\n", param);
>                  return 0;
> diff --git a/src/gallium/drivers/vc5/vc5_screen.c b/src/gallium/drivers/vc5/vc5_screen.c
> index add5a2f358..2f64c2d0e6 100644
> --- a/src/gallium/drivers/vc5/vc5_screen.c
> +++ b/src/gallium/drivers/vc5/vc5_screen.c
> @@ -259,7 +259,13 @@ vc5_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>          case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
>          case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
>          case PIPE_CAP_CONTEXT_PRIORITY_MASK:
> -	case PIPE_CAP_CONSTBUF0_FLAGS:
> +        case PIPE_CAP_CONSTBUF0_FLAGS:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +        case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +        case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>          case PIPE_CAP_PACKED_UNIFORMS:
>                  return 0;
>  
> @@ -333,6 +339,11 @@ vc5_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
>                  return 0.0f;
>          case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>                  return 16.0f;
> +
> +        case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +        case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +        case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +                return 0.0f;
>          default:
>                  fprintf(stderr, "unknown paramf %d\n", param);
>                  return 0;
> diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
> index 1878def474..469d6fc2eb 100644
> --- a/src/gallium/drivers/virgl/virgl_screen.c
> +++ b/src/gallium/drivers/virgl/virgl_screen.c
> @@ -275,6 +275,12 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
>     case PIPE_CAP_FENCE_SIGNAL:
>     case PIPE_CAP_CONSTBUF0_FLAGS:
>     case PIPE_CAP_PACKED_UNIFORMS:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
> +   case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
> +   case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>        return 0;
>     case PIPE_CAP_VENDOR_ID:
>        return 0x1af4;
> @@ -372,6 +378,10 @@ virgl_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
>        return 16.0;
>     case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
>        return vscreen->caps.caps.v2.max_texture_lod_bias;
> +   case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
> +   case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
> +      return 0.0f;
>     }
>     /* should only get here on unhandled cases */
>     debug_printf("Unexpected PIPE_CAPF %d query\n", param);
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index c4ae053206..6b2f33b9e3 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -606,6 +606,17 @@ enum pipe_reset_status
>  };
>  
>  
> +/**
> + * Conservative rasterization modes.
> + */
> +enum pipe_conservative_raster_mode
> +{
> +   PIPE_CONSERVATIVE_RASTER_OFF,
> +   PIPE_CONSERVATIVE_RASTER_POST_SNAP,
> +   PIPE_CONSERVATIVE_RASTER_PRE_SNAP,
> +};
> +
> +
>  /**
>   * resource_get_handle flags.
>   */
> @@ -795,6 +806,12 @@ enum pipe_cap
>     PIPE_CAP_FENCE_SIGNAL,
>     PIPE_CAP_CONSTBUF0_FLAGS,
>     PIPE_CAP_PACKED_UNIFORMS,
> +   PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES,
> +   PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES,
> +   PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES,
> +   PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES,
> +   PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS,
> +   PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE,
>  };
>  
>  /**
> @@ -834,6 +851,9 @@ enum pipe_capf
>     PIPE_CAPF_MAX_POINT_WIDTH_AA,
>     PIPE_CAPF_MAX_TEXTURE_ANISOTROPY,
>     PIPE_CAPF_MAX_TEXTURE_LOD_BIAS,
> +   PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE,
> +   PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE,
> +   PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY,
>  };
>  
>  /** Shader caps not specific to any single stage */
> diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
> index 4dce399f84..913a79faee 100644
> --- a/src/gallium/include/pipe/p_state.h
> +++ b/src/gallium/include/pipe/p_state.h
> @@ -113,6 +113,7 @@ struct pipe_rasterizer_state
>     unsigned line_smooth:1;
>     unsigned line_stipple_enable:1;
>     unsigned line_last_pixel:1;
> +   unsigned conservative_raster_mode:2; /**< PIPE_CONSERVATIVE_RASTER_x */
>  
>     /**
>      * Use the first vertex of a primitive as the provoking vertex for
> @@ -186,6 +187,7 @@ struct pipe_rasterizer_state
>     float offset_units;
>     float offset_scale;
>     float offset_clamp;
> +   float conservative_raster_dilate;
>  };
>  
>  
> @@ -199,6 +201,10 @@ struct pipe_viewport_state
>  {
>     float scale[3];
>     float translate[3];
> +   /*
> +    * Conservative rasterization subpixel precision bias in bits
> +    */
> +   uint16_t subpixel_precision[2];
>  };
>  
>  
> 



More information about the mesa-dev mailing list