From 8fc6a197652b12e8de5db2ca9bf4a1cd908ce342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 5 Jan 2021 23:07:46 -0500 Subject: [PATCH] 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 Part-of: --- 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;