lima: implement blit with util_blitter
authorIcenowy Zheng <icenowy@aosc.io>
Thu, 11 Apr 2019 07:26:12 +0000 (15:26 +0800)
committerQiang Yu <yuq825@gmail.com>
Thu, 11 Apr 2019 13:45:51 +0000 (13:45 +0000)
As we have already prepared for using util_blitter, use it to implement
lima_blit.

Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
src/gallium/drivers/lima/lima_context.c
src/gallium/drivers/lima/lima_context.h
src/gallium/drivers/lima/lima_resource.c

index 35bf8c89a9ce33a5b8c23ec7fd6a3f3960d98079..7440c1a95787e98e2f07578e55fbe5c392b1b9c4 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include "util/u_memory.h"
+#include "util/u_blitter.h"
 #include "util/u_upload_mgr.h"
 #include "util/u_math.h"
 #include "util/u_debug.h"
@@ -124,6 +125,9 @@ lima_context_destroy(struct pipe_context *pctx)
 
    lima_state_fini(ctx);
 
+   if (ctx->blitter)
+      util_blitter_destroy(ctx->blitter);
+
    if (ctx->suballocator)
       u_suballocator_destroy(ctx->suballocator);
 
@@ -188,6 +192,10 @@ lima_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 
    slab_create_child(&ctx->transfer_pool, &screen->transfer_pool);
 
+   ctx->blitter = util_blitter_create(&ctx->base);
+   if (!ctx->blitter)
+      goto err_out;
+
    ctx->uploader = u_upload_create_default(&ctx->base);
    if (!ctx->uploader)
       goto err_out;
index 8461eb437b8fb78fa7e0b6c6f06650c906eeddcc..4ce3e6f400ded8c62af22b22f5a1f74bd73be042 100644 (file)
@@ -193,6 +193,7 @@ struct lima_context {
 
    struct u_upload_mgr *uploader;
    struct u_suballocator *suballocator;
+   struct blitter_context *blitter;
 
    struct slab_child_pool transfer_pool;
 
index 508b58a9c17edbafb207afcd03ff44eefa8afd5e..a3edfd0931aa74cdab51ddfa2b09b015f2f9682e 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include "util/u_memory.h"
+#include "util/u_blitter.h"
 #include "util/u_format.h"
 #include "util/u_inlines.h"
 #include "util/u_math.h"
@@ -553,10 +554,58 @@ lima_transfer_unmap(struct pipe_context *pctx,
    slab_free(&ctx->transfer_pool, trans);
 }
 
+static void
+lima_util_blitter_save_states(struct lima_context *ctx)
+{
+   util_blitter_save_blend(ctx->blitter, (void *)ctx->blend);
+   util_blitter_save_depth_stencil_alpha(ctx->blitter, (void *)ctx->zsa);
+   util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref);
+   util_blitter_save_rasterizer(ctx->blitter, (void *)ctx->rasterizer);
+   util_blitter_save_fragment_shader(ctx->blitter, ctx->fs);
+   util_blitter_save_vertex_shader(ctx->blitter, ctx->vs);
+   util_blitter_save_viewport(ctx->blitter,
+                              &ctx->viewport.transform);
+   util_blitter_save_scissor(ctx->blitter, &ctx->scissor);
+   util_blitter_save_vertex_elements(ctx->blitter,
+                                     ctx->vertex_elements);
+   util_blitter_save_vertex_buffer_slot(ctx->blitter,
+                                        ctx->vertex_buffers.vb);
+
+   util_blitter_save_framebuffer(ctx->blitter, &ctx->framebuffer.base);
+
+   util_blitter_save_fragment_sampler_states(ctx->blitter,
+                                             ctx->tex_stateobj.num_samplers,
+                                             (void**)ctx->tex_stateobj.samplers);
+   util_blitter_save_fragment_sampler_views(ctx->blitter,
+                                            ctx->tex_stateobj.num_textures,
+                                            ctx->tex_stateobj.textures);
+}
+
 static void
 lima_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
 {
-   debug_error("lima_blit not implemented\n");
+   struct lima_context *ctx = lima_context(pctx);
+   struct pipe_blit_info info = *blit_info;
+
+   if (util_try_blit_via_copy_region(pctx, &info)) {
+      return; /* done */
+   }
+
+   if (info.mask & PIPE_MASK_S) {
+      debug_printf("lima: cannot blit stencil, skipping\n");
+      info.mask &= ~PIPE_MASK_S;
+   }
+
+   if (!util_blitter_is_blit_supported(ctx->blitter, &info)) {
+      debug_printf("lima: blit unsupported %s -> %s\n",
+                   util_format_short_name(info.src.resource->format),
+                   util_format_short_name(info.dst.resource->format));
+      return;
+   }
+
+   lima_util_blitter_save_states(ctx);
+
+   util_blitter_blit(ctx->blitter, &info);
 }
 
 static void