[2/5] panfrost: Specify supported draw modes per-context

Submitted by Alyssa Rosenzweig on Feb. 9, 2019, 1:21 a.m.

Details

Message ID 20190209012145.3308-3-alyssa@rosenzweig.io
State New
Headers show
Series "Cleanup dead code" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Alyssa Rosenzweig Feb. 9, 2019, 1:21 a.m.
Midgard has native support for QUADS and POLYGONS; Bifrost seemingly
does not. Thus, Midgard generally skips prim_convert whereas Bifrost
needs the pass; this patch allows the setting of allowed primitives to
occur on a per-context basis (for runtime hardware selection).

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
---
 src/gallium/drivers/panfrost/pan_context.c | 20 ++++++++------------
 src/gallium/drivers/panfrost/pan_context.h |  3 +++
 2 files changed, 11 insertions(+), 12 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index b60d67da9b4..bc92933ccda 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -1595,14 +1595,10 @@  panfrost_draw_vbo(
 
         int mode = info->mode;
 
-#if 0
-        /* Fallback for non-ES draw modes */
-        /* Primconvert not needed on Midgard anymore due to native
-         * QUADS/POLYGONS. Bifrost/desktop-GL may need it though so not
-         * removing */
+        /* Fallback for unsupported modes */
 
-        if (info->mode >= PIPE_PRIM_QUADS) {
-                if (info->mode == PIPE_PRIM_QUADS && info->count == 4 && ctx->rasterizer && !ctx->rasterizer->base.flatshade) {
+        if (!(ctx->draw_modes & mode)) {
+                if (mode == PIPE_PRIM_QUADS && info->count == 4 && ctx->rasterizer && !ctx->rasterizer->base.flatshade) {
                         mode = PIPE_PRIM_TRIANGLE_FAN;
                 } else {
                         if (info->count < 4) {
@@ -1615,7 +1611,6 @@  panfrost_draw_vbo(
                         return;
                 }
         }
-#endif
 
         ctx->payload_tiler.prefix.draw_mode = g2m_draw_mode(mode);
 
@@ -1629,7 +1624,7 @@  panfrost_draw_vbo(
          * rendering artefacts. It's not clear what these values mean yet. */
 
         ctx->payload_tiler.prefix.unknown_draw &= ~(0x3000 | 0x18000);
-        ctx->payload_tiler.prefix.unknown_draw |= (info->mode == PIPE_PRIM_POINTS || ctx->vertex_count > 65535) ? 0x3000 : 0x18000;
+        ctx->payload_tiler.prefix.unknown_draw |= (mode == PIPE_PRIM_POINTS || ctx->vertex_count > 65535) ? 0x3000 : 0x18000;
 
         if (info->index_size) {
                 /* Calculate the min/max index used so we can figure out how
@@ -2671,9 +2666,10 @@  panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags)
         gallium->const_uploader = gallium->stream_uploader;
         assert(gallium->stream_uploader);
 
-        ctx->primconvert = util_primconvert_create(gallium,
-                           (1 << PIPE_PRIM_QUADS) - 1);
-        assert(ctx->primconvert);
+        /* Midgard supports ES modes, plus QUADS/QUAD_STRIPS/POLYGON */
+        ctx->draw_modes = (1 << PIPE_PRIM_LINES_ADJACENCY) - 1;
+
+        ctx->primconvert = util_primconvert_create(gallium, ctx->draw_modes);
 
         ctx->blitter = util_blitter_create(gallium);
         assert(ctx->blitter);
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index bda8155aac6..89f821318e1 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -106,6 +106,9 @@  struct panfrost_context {
         /* Gallium context */
         struct pipe_context base;
 
+        /* Bit mask for supported PIPE_DRAW for this hardware */
+        unsigned draw_modes;
+
         struct pipe_framebuffer_state pipe_framebuffer;
 
         /* The number of concurrent FBOs allowed depends on the number of pools

Comments

On Fri, Feb 8, 2019 at 8:24 PM Alyssa Rosenzweig <alyssa@rosenzweig.io> wrote:
>
> Midgard has native support for QUADS and POLYGONS; Bifrost seemingly
> does not. Thus, Midgard generally skips prim_convert whereas Bifrost
> needs the pass; this patch allows the setting of allowed primitives to
> occur on a per-context basis (for runtime hardware selection).
>
> Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
> ---
>  src/gallium/drivers/panfrost/pan_context.c | 20 ++++++++------------
>  src/gallium/drivers/panfrost/pan_context.h |  3 +++
>  2 files changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
> index b60d67da9b4..bc92933ccda 100644
> --- a/src/gallium/drivers/panfrost/pan_context.c
> +++ b/src/gallium/drivers/panfrost/pan_context.c
> @@ -1595,14 +1595,10 @@ panfrost_draw_vbo(
>
>          int mode = info->mode;
>
> -#if 0
> -        /* Fallback for non-ES draw modes */
> -        /* Primconvert not needed on Midgard anymore due to native
> -         * QUADS/POLYGONS. Bifrost/desktop-GL may need it though so not
> -         * removing */
> +        /* Fallback for unsupported modes */
>
> -        if (info->mode >= PIPE_PRIM_QUADS) {
> -                if (info->mode == PIPE_PRIM_QUADS && info->count == 4 && ctx->rasterizer && !ctx->rasterizer->base.flatshade) {
> +        if (!(ctx->draw_modes & mode)) {
> +                if (mode == PIPE_PRIM_QUADS && info->count == 4 && ctx->rasterizer && !ctx->rasterizer->base.flatshade) {
>                          mode = PIPE_PRIM_TRIANGLE_FAN;
>                  } else {
>                          if (info->count < 4) {
> @@ -1615,7 +1611,6 @@ panfrost_draw_vbo(
>                          return;
>                  }
>          }
> -#endif
>
>          ctx->payload_tiler.prefix.draw_mode = g2m_draw_mode(mode);
>
> @@ -1629,7 +1624,7 @@ panfrost_draw_vbo(
>           * rendering artefacts. It's not clear what these values mean yet. */
>
>          ctx->payload_tiler.prefix.unknown_draw &= ~(0x3000 | 0x18000);
> -        ctx->payload_tiler.prefix.unknown_draw |= (info->mode == PIPE_PRIM_POINTS || ctx->vertex_count > 65535) ? 0x3000 : 0x18000;
> +        ctx->payload_tiler.prefix.unknown_draw |= (mode == PIPE_PRIM_POINTS || ctx->vertex_count > 65535) ? 0x3000 : 0x18000;
>
>          if (info->index_size) {
>                  /* Calculate the min/max index used so we can figure out how
> @@ -2671,9 +2666,10 @@ panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags)
>          gallium->const_uploader = gallium->stream_uploader;
>          assert(gallium->stream_uploader);
>
> -        ctx->primconvert = util_primconvert_create(gallium,
> -                           (1 << PIPE_PRIM_QUADS) - 1);
> -        assert(ctx->primconvert);
> +        /* Midgard supports ES modes, plus QUADS/QUAD_STRIPS/POLYGON */
> +        ctx->draw_modes = (1 << PIPE_PRIM_LINES_ADJACENCY) - 1;

Might I recommend saying (PIPE_PRIM_POLYGON + 1) instead of
PIPE_PRIM_LINES_ADJACENCY? Otherwise it's a bit unclear why you're
talking about LINES_ADJ.

  -ilia

> +
> +        ctx->primconvert = util_primconvert_create(gallium, ctx->draw_modes);
>
>          ctx->blitter = util_blitter_create(gallium);
>          assert(ctx->blitter);
> diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
> index bda8155aac6..89f821318e1 100644
> --- a/src/gallium/drivers/panfrost/pan_context.h
> +++ b/src/gallium/drivers/panfrost/pan_context.h
> @@ -106,6 +106,9 @@ struct panfrost_context {
>          /* Gallium context */
>          struct pipe_context base;
>
> +        /* Bit mask for supported PIPE_DRAW for this hardware */
> +        unsigned draw_modes;
> +
>          struct pipe_framebuffer_state pipe_framebuffer;
>
>          /* The number of concurrent FBOs allowed depends on the number of pools
> --
> 2.20.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> Might I recommend saying (PIPE_PRIM_POLYGON + 1) instead of
> PIPE_PRIM_LINES_ADJACENCY? Otherwise it's a bit unclear why you're
> talking about LINES_ADJ.

Thanks, just pushed with this change.