From a155c26a66d58d9283b314dce4dd2abb71355349 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng Date: Thu, 11 Apr 2019 15:26:12 +0800 Subject: [PATCH] lima: implement blit with util_blitter As we have already prepared for using util_blitter, use it to implement lima_blit. Signed-off-by: Icenowy Zheng Reviewed-by: Qiang Yu --- src/gallium/drivers/lima/lima_context.c | 8 ++++ src/gallium/drivers/lima/lima_context.h | 1 + src/gallium/drivers/lima/lima_resource.c | 51 +++++++++++++++++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/lima/lima_context.c b/src/gallium/drivers/lima/lima_context.c index 35bf8c89a9c..7440c1a9578 100644 --- a/src/gallium/drivers/lima/lima_context.c +++ b/src/gallium/drivers/lima/lima_context.c @@ -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; diff --git a/src/gallium/drivers/lima/lima_context.h b/src/gallium/drivers/lima/lima_context.h index 8461eb437b8..4ce3e6f400d 100644 --- a/src/gallium/drivers/lima/lima_context.h +++ b/src/gallium/drivers/lima/lima_context.h @@ -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; diff --git a/src/gallium/drivers/lima/lima_resource.c b/src/gallium/drivers/lima/lima_resource.c index 508b58a9c17..a3edfd0931a 100644 --- a/src/gallium/drivers/lima/lima_resource.c +++ b/src/gallium/drivers/lima/lima_resource.c @@ -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 -- 2.30.2