Mesa (master): gallium: skip draws with count == 0 or instance_count == 0 in drivers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jan 9 07:10:54 UTC 2021


Module: Mesa
Branch: master
Commit: 8fc6a197652b12e8de5db2ca9bf4a1cd908ce342
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8fc6a197652b12e8de5db2ca9bf4a1cd908ce342

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Tue Jan  5 23:07:46 2021 -0500

gallium: skip draws with count == 0 or instance_count == 0 in drivers

Fixes: 85b6ba136bdc2db5 "st/mesa: implement Driver.DrawGallium callbacks"

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8345>

---

 src/gallium/drivers/d3d12/d3d12_draw.cpp       | 3 +++
 src/gallium/drivers/etnaviv/etnaviv_context.c  | 3 +++
 src/gallium/drivers/freedreno/freedreno_draw.c | 3 +++
 src/gallium/drivers/iris/iris_draw.c           | 3 +++
 src/gallium/drivers/llvmpipe/lp_draw_arrays.c  | 3 +++
 src/gallium/drivers/nouveau/nv30/nv30_vbo.c    | 3 +++
 src/gallium/drivers/nouveau/nv50/nv50_vbo.c    | 3 +++
 src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c    | 3 +++
 src/gallium/drivers/panfrost/pan_context.c     | 3 +++
 src/gallium/drivers/softpipe/sp_draw_arrays.c  | 3 +++
 src/gallium/drivers/svga/svga_pipe_draw.c      | 3 +++
 src/gallium/drivers/swr/swr_draw.cpp           | 3 +++
 src/gallium/drivers/tegra/tegra_context.c      | 3 +++
 src/gallium/drivers/v3d/v3dx_draw.c            | 3 +++
 src/gallium/drivers/vc4/vc4_draw.c             | 3 +++
 src/gallium/drivers/virgl/virgl_context.c      | 3 +++
 src/gallium/drivers/zink/zink_draw.c           | 3 +++
 17 files changed, 51 insertions(+)

diff --git a/src/gallium/drivers/d3d12/d3d12_draw.cpp b/src/gallium/drivers/d3d12/d3d12_draw.cpp
index c1d37f17ede..557ea589324 100644
--- a/src/gallium/drivers/d3d12/d3d12_draw.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_draw.cpp
@@ -437,6 +437,9 @@ d3d12_draw_vbo(struct pipe_context *pctx,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !dinfo->instance_count))
+      return;
+
    struct d3d12_context *ctx = d3d12_context(pctx);
    struct d3d12_batch *batch;
    struct pipe_resource *index_buffer = NULL;
diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c
index 7a14de0e421..90cd0ea87f2 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_context.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_context.c
@@ -239,6 +239,9 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct etna_context *ctx = etna_context(pctx);
    struct etna_screen *screen = ctx->screen;
    struct pipe_framebuffer_state *pfb = &ctx->framebuffer_s;
diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c
index 692c49ce8d8..723eb928b3b 100644
--- a/src/gallium/drivers/freedreno/freedreno_draw.c
+++ b/src/gallium/drivers/freedreno/freedreno_draw.c
@@ -227,6 +227,9 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
            return;
 	}
 
+        if (!indirect && (!draws[0].count || !info->instance_count))
+           return;
+
 	struct fd_context *ctx = fd_context(pctx);
 
 	/* for debugging problems with indirect draw, it is convenient
diff --git a/src/gallium/drivers/iris/iris_draw.c b/src/gallium/drivers/iris/iris_draw.c
index 9d85360c70f..f64517089c3 100644
--- a/src/gallium/drivers/iris/iris_draw.c
+++ b/src/gallium/drivers/iris/iris_draw.c
@@ -251,6 +251,9 @@ iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct iris_context *ice = (struct iris_context *) ctx;
    struct iris_screen *screen = (struct iris_screen*)ice->ctx.screen;
    const struct gen_device_info *devinfo = &screen->devinfo;
diff --git a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c
index cd38ca9c7c6..a8596b0b32b 100644
--- a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c
+++ b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c
@@ -67,6 +67,9 @@ llvmpipe_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct llvmpipe_context *lp = llvmpipe_context(pipe);
    struct draw_context *draw = lp->draw;
    const void *mapped_indices = NULL;
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_vbo.c b/src/gallium/drivers/nouveau/nv30/nv30_vbo.c
index 8758436e7be..8ab5b8dd80e 100644
--- a/src/gallium/drivers/nouveau/nv30/nv30_vbo.c
+++ b/src/gallium/drivers/nouveau/nv30/nv30_vbo.c
@@ -560,6 +560,9 @@ nv30_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct nv30_context *nv30 = nv30_context(pipe);
    struct nouveau_pushbuf *push = nv30->base.pushbuf;
    int i;
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
index 74030db67e0..d7172b6008f 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
@@ -771,6 +771,9 @@ nv50_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct nv50_context *nv50 = nv50_context(pipe);
    struct nouveau_pushbuf *push = nv50->base.pushbuf;
    bool tex_dirty = false;
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
index 9b8c05450af..7d331304ff2 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
@@ -938,6 +938,9 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct nvc0_context *nvc0 = nvc0_context(pipe);
    struct nouveau_pushbuf *push = nvc0->base.pushbuf;
    struct nvc0_screen *screen = nvc0->screen;
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 61838df9184..56e1c456bc1 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -468,6 +468,9 @@ panfrost_draw_vbo(
            return;
 	}
 
+        if (!indirect && (!draws[0].count || !info->instance_count))
+           return;
+
         struct panfrost_context *ctx = pan_context(pipe);
         struct panfrost_device *device = pan_device(ctx->base.screen);
 
diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c b/src/gallium/drivers/softpipe/sp_draw_arrays.c
index 588c4cceea9..9830042364f 100644
--- a/src/gallium/drivers/softpipe/sp_draw_arrays.c
+++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c
@@ -75,6 +75,9 @@ softpipe_draw_vbo(struct pipe_context *pipe,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct softpipe_context *sp = softpipe_context(pipe);
    struct draw_context *draw = sp->draw;
    const void *mapped_indices = NULL;
diff --git a/src/gallium/drivers/svga/svga_pipe_draw.c b/src/gallium/drivers/svga/svga_pipe_draw.c
index d33bbc06ee5..4d6b61dfe98 100644
--- a/src/gallium/drivers/svga/svga_pipe_draw.c
+++ b/src/gallium/drivers/svga/svga_pipe_draw.c
@@ -233,6 +233,9 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct svga_context *svga = svga_context(pipe);
    enum pipe_prim_type reduced_prim = u_reduced_prim(info->mode);
    unsigned count = draws[0].count;
diff --git a/src/gallium/drivers/swr/swr_draw.cpp b/src/gallium/drivers/swr/swr_draw.cpp
index 02638d2c723..eada9a2e582 100644
--- a/src/gallium/drivers/swr/swr_draw.cpp
+++ b/src/gallium/drivers/swr/swr_draw.cpp
@@ -53,6 +53,9 @@ swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !info->instance_count))
+      return;
+
    struct swr_context *ctx = swr_context(pipe);
 
    if (!indirect &&
diff --git a/src/gallium/drivers/tegra/tegra_context.c b/src/gallium/drivers/tegra/tegra_context.c
index e22b762d454..2dd525090ed 100644
--- a/src/gallium/drivers/tegra/tegra_context.c
+++ b/src/gallium/drivers/tegra/tegra_context.c
@@ -62,6 +62,9 @@ tegra_draw_vbo(struct pipe_context *pcontext,
       return;
    }
 
+   if (!pindirect && (!draws[0].count || !pinfo->instance_count))
+      return;
+
    struct tegra_context *context = to_tegra_context(pcontext);
    struct pipe_draw_indirect_info indirect;
    struct pipe_draw_info info;
diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c
index 45fa747a94d..0b63b1b43c8 100644
--- a/src/gallium/drivers/v3d/v3dx_draw.c
+++ b/src/gallium/drivers/v3d/v3dx_draw.c
@@ -1108,6 +1108,9 @@ v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
            return;
 	}
 
+        if (!indirect && (!draws[0].count || !info->instance_count))
+           return;
+
         struct v3d_context *v3d = v3d_context(pctx);
 
         if (!indirect &&
diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c
index 2b019736dc2..75f4ddcc5c3 100644
--- a/src/gallium/drivers/vc4/vc4_draw.c
+++ b/src/gallium/drivers/vc4/vc4_draw.c
@@ -303,6 +303,9 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
            return;
 	}
 
+        if (!indirect && (!draws[0].count || !info->instance_count))
+           return;
+
         struct vc4_context *vc4 = vc4_context(pctx);
         struct pipe_draw_info local_info;
 
diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c
index df662ea02e1..a7c80d73621 100644
--- a/src/gallium/drivers/virgl/virgl_context.c
+++ b/src/gallium/drivers/virgl/virgl_context.c
@@ -864,6 +864,9 @@ static void virgl_draw_vbo(struct pipe_context *ctx,
       return;
    }
 
+   if (!indirect && (!draws[0].count || !dinfo->instance_count))
+      return;
+
    struct virgl_context *vctx = virgl_context(ctx);
    struct virgl_screen *rs = virgl_screen(ctx->screen);
    struct virgl_indexbuf ib = {};
diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index e6e1a94622f..9e0768d0082 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -224,6 +224,9 @@ zink_draw_vbo(struct pipe_context *pctx,
       return;
    }
 
+   if (!dindirect && (!draws[0].count || !dinfo->instance_count))
+      return;
+
    struct zink_context *ctx = zink_context(pctx);
    struct zink_screen *screen = zink_screen(pctx->screen);
    struct zink_rasterizer_state *rast_state = ctx->rast_state;



More information about the mesa-commit mailing list