[Mesa-dev] [PATCH 2/4] radeonsi: skip draws with instance_count == 0
Marek Olšák
maraeo at gmail.com
Mon Sep 5 22:46:32 UTC 2016
From: Marek Olšák <marek.olsak at amd.com>
loosely ported from Vulkan
---
src/gallium/drivers/radeonsi/si_state_draw.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
index 0a91291..9469bb4 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -875,23 +875,33 @@ void si_ce_post_draw_synchronization(struct si_context *sctx)
}
}
void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
{
struct si_context *sctx = (struct si_context *)ctx;
struct si_state_rasterizer *rs = sctx->queued.named.rasterizer;
struct pipe_index_buffer ib = {};
unsigned mask, dirty_fb_counter, dirty_tex_counter, rast_prim;
- if (!info->count && !info->indirect &&
- (info->indexed || !info->count_from_stream_output))
- return;
+ if (likely(!info->indirect)) {
+ /* SI-CI treat instance_count==0 as instance_count==1. There is
+ * no workaround for indirect draws, but we can at least skip
+ * direct draws.
+ */
+ if (unlikely(!info->instance_count))
+ return;
+
+ /* Handle count == 0. */
+ if (unlikely(!info->count &&
+ (info->indexed || !info->count_from_stream_output)))
+ return;
+ }
if (!sctx->vs_shader.cso) {
assert(0);
return;
}
if (!sctx->ps_shader.cso && (!rs || !rs->rasterizer_discard)) {
assert(0);
return;
}
if (!!sctx->tes_shader.cso != (info->mode == PIPE_PRIM_PATCHES)) {
--
2.7.4
More information about the mesa-dev
mailing list