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

Marek Olšák maraeo at gmail.com
Mon Apr 2 02:30:42 UTC 2018


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Mar 28, 2018 at 6:35 AM, Rhys Perry <pendingchaos02 at gmail.com>
wrote:

> ---
>  src/gallium/docs/source/cso/rasterizer.rst       | 23
> +++++++++++++++++++++++
>  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               |  8 ++++++++
>  21 files changed, 243 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/docs/source/cso/rasterizer.rst
> b/src/gallium/docs/source/cso/rasterizer.rst
> index 616e4511a2..4dabcc032f 100644
> --- a/src/gallium/docs/source/cso/rasterizer.rst
> +++ b/src/gallium/docs/source/cso/rasterizer.rst
> @@ -340,3 +340,26 @@ 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.
> +
> +subpixel_precision_x
> +    A bias added to the horizontal subpixel precision during conservative
> rasterization.
> +subpixel_precision_y
> +    A bias added to the vertical subpixel precision 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..db9fa1a8e9 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
> @@ -123,6 +124,12 @@ struct pipe_rasterizer_state
>     unsigned half_pixel_center:1;
>     unsigned bottom_edge_rule:1;
>
> +   /*
> +    * Conservative rasterization subpixel precision bias in bits
> +    */
> +   unsigned subpixel_precision_x:4;
> +   unsigned subpixel_precision_y:4;
> +
>     /**
>      * When true, rasterization is disabled and no pixels are written.
>      * This only makes sense with the Stream Out functionality.
> @@ -186,6 +193,7 @@ struct pipe_rasterizer_state
>     float offset_units;
>     float offset_scale;
>     float offset_clamp;
> +   float conservative_raster_dilate;
>  };
>
>
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180401/a1f284f8/attachment-0001.html>


More information about the mesa-dev mailing list