virgl: skip empty cmdbufs
authorChia-I Wu <olvaffe@gmail.com>
Thu, 18 Apr 2019 22:34:46 +0000 (15:34 -0700)
committerChia-I Wu <olvaffe@gmail.com>
Tue, 23 Apr 2019 19:07:48 +0000 (19:07 +0000)
Several empty cmdbufs are submitted by app/xserver per frame, from
glamor_block_handler for example.  Let's skip them.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
src/gallium/drivers/virgl/virgl_context.c
src/gallium/drivers/virgl/virgl_context.h

index 69b56bfd0363350e33efae85fd0a7a842eb31205..b3119ee95cc04626f2473959c1f4e5fdf80b0e28 100644 (file)
@@ -756,6 +756,12 @@ static void virgl_flush_eq(struct virgl_context *ctx, void *closure,
 {
    struct virgl_screen *rs = virgl_screen(ctx->base.screen);
 
+   /* skip empty cbuf */
+   if (ctx->cbuf->cdw == ctx->cbuf_initial_cdw &&
+       ctx->queue.num_dwords == 0 &&
+       !fence)
+      return;
+
    if (ctx->num_draws)
       u_upload_unmap(ctx->uploader);
 
@@ -773,6 +779,8 @@ static void virgl_flush_eq(struct virgl_context *ctx, void *closure,
 
    /* add back current framebuffer resources to reference list? */
    virgl_reemit_res(ctx);
+
+   ctx->cbuf_initial_cdw = ctx->cbuf->cdw;
 }
 
 static void virgl_flush_from_st(struct pipe_context *ctx,
index 1ac4ddb05416bef42b438b18eb7bc746f8632d2d..828e72514a4a1a956cd5814fc9b7b71ba827e8af 100644 (file)
@@ -59,6 +59,7 @@ struct virgl_rasterizer_state {
 struct virgl_context {
    struct pipe_context base;
    struct virgl_cmd_buf *cbuf;
+   unsigned cbuf_initial_cdw;
 
    struct virgl_textures_info samplers[PIPE_SHADER_TYPES];
    struct virgl_vertex_elements_state *vertex_elements;