diff options
author | Icenowy Zheng <[email protected]> | 2019-04-11 15:26:12 +0800 |
---|---|---|
committer | Qiang Yu <[email protected]> | 2019-04-11 13:45:51 +0000 |
commit | a155c26a66d58d9283b314dce4dd2abb71355349 (patch) | |
tree | 9089829845f3f925a26b4a217bbc9039de775904 /src/gallium/drivers/lima/lima_resource.c | |
parent | 318ccbe7b2616eae9e59c525868d5105be2db179 (diff) |
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 <[email protected]>
Reviewed-by: Qiang Yu <[email protected]>
Diffstat (limited to 'src/gallium/drivers/lima/lima_resource.c')
-rw-r--r-- | src/gallium/drivers/lima/lima_resource.c | 51 |
1 files changed, 50 insertions, 1 deletions
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" @@ -554,9 +555,57 @@ lima_transfer_unmap(struct pipe_context *pctx, } 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 |