From 37464efa3f80c141c2d73af5615e401763b2bbc8 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 22 Nov 2017 12:37:15 -0500 Subject: [PATCH] freedreno: add generic blitter Basically a clone of util_blitter_blit() but with special handling to blit PIPE_BUFFER as a PIPE_TEXTURE_1D. Signed-off-by: Rob Clark --- .../drivers/freedreno/Makefile.sources | 2 + .../drivers/freedreno/freedreno_blitter.c | 112 ++++++++++++++++++ .../drivers/freedreno/freedreno_blitter.h | 36 ++++++ .../drivers/freedreno/freedreno_context.c | 4 + .../drivers/freedreno/freedreno_context.h | 3 + .../drivers/freedreno/freedreno_resource.c | 4 +- src/gallium/drivers/freedreno/meson.build | 2 + 7 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 src/gallium/drivers/freedreno/freedreno_blitter.c create mode 100644 src/gallium/drivers/freedreno/freedreno_blitter.h diff --git a/src/gallium/drivers/freedreno/Makefile.sources b/src/gallium/drivers/freedreno/Makefile.sources index 40c2eff0455..e6147151c6b 100644 --- a/src/gallium/drivers/freedreno/Makefile.sources +++ b/src/gallium/drivers/freedreno/Makefile.sources @@ -6,6 +6,8 @@ C_SOURCES := \ freedreno_batch.h \ freedreno_batch_cache.c \ freedreno_batch_cache.h \ + freedreno_blitter.c \ + freedreno_blitter.h \ freedreno_context.c \ freedreno_context.h \ freedreno_draw.c \ diff --git a/src/gallium/drivers/freedreno/freedreno_blitter.c b/src/gallium/drivers/freedreno/freedreno_blitter.c new file mode 100644 index 00000000000..6fab261df9c --- /dev/null +++ b/src/gallium/drivers/freedreno/freedreno_blitter.c @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2017 Rob Clark + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Rob Clark + */ + +#include "util/u_blitter.h" + +#include "freedreno_blitter.h" +#include "freedreno_context.h" + +/* generic blit using u_blitter.. slightly modified version of util_blitter_blit + * which also handles PIPE_BUFFER: + */ + +static void +default_dst_texture(struct pipe_surface *dst_templ, struct pipe_resource *dst, + unsigned dstlevel, unsigned dstz) +{ + memset(dst_templ, 0, sizeof(*dst_templ)); + if (dst->target == PIPE_BUFFER) + dst_templ->format = PIPE_FORMAT_R8_UINT; + else + dst_templ->format = util_format_linear(dst->format); + dst_templ->u.tex.level = dstlevel; + dst_templ->u.tex.first_layer = dstz; + dst_templ->u.tex.last_layer = dstz; +} + +static void +default_src_texture(struct pipe_sampler_view *src_templ, + struct pipe_resource *src, unsigned srclevel) +{ + bool cube_as_2darray = src->screen->get_param(src->screen, + PIPE_CAP_SAMPLER_VIEW_TARGET); + + memset(src_templ, 0, sizeof(*src_templ)); + + if (cube_as_2darray && (src->target == PIPE_TEXTURE_CUBE || + src->target == PIPE_TEXTURE_CUBE_ARRAY)) + src_templ->target = PIPE_TEXTURE_2D_ARRAY; + else + src_templ->target = src->target; + + if (src->target == PIPE_BUFFER) { + src_templ->target = PIPE_TEXTURE_1D; + src_templ->format = PIPE_FORMAT_R8_UINT; + } else { + src_templ->format = util_format_linear(src->format); + } + src_templ->u.tex.first_level = srclevel; + src_templ->u.tex.last_level = srclevel; + src_templ->u.tex.first_layer = 0; + src_templ->u.tex.last_layer = + src->target == PIPE_TEXTURE_3D ? u_minify(src->depth0, srclevel) - 1 + : (unsigned)(src->array_size - 1); + src_templ->swizzle_r = PIPE_SWIZZLE_X; + src_templ->swizzle_g = PIPE_SWIZZLE_Y; + src_templ->swizzle_b = PIPE_SWIZZLE_Z; + src_templ->swizzle_a = PIPE_SWIZZLE_W; +} + +void +fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info) +{ + struct pipe_resource *dst = info->dst.resource; + struct pipe_resource *src = info->src.resource; + struct pipe_context *pipe = &ctx->base; + struct pipe_surface *dst_view, dst_templ; + struct pipe_sampler_view src_templ, *src_view; + + /* Initialize the surface. */ + default_dst_texture(&dst_templ, dst, info->dst.level, + info->dst.box.z); + dst_templ.format = info->dst.format; + dst_view = pipe->create_surface(pipe, dst, &dst_templ); + + /* Initialize the sampler view. */ + default_src_texture(&src_templ, src, info->src.level); + src_templ.format = info->src.format; + src_view = pipe->create_sampler_view(pipe, src, &src_templ); + + /* Copy. */ + util_blitter_blit_generic(ctx->blitter, dst_view, &info->dst.box, + src_view, &info->src.box, src->width0, src->height0, + info->mask, info->filter, + info->scissor_enable ? &info->scissor : NULL, + info->alpha_blend); + + pipe_surface_reference(&dst_view, NULL); + pipe_sampler_view_reference(&src_view, NULL); +} diff --git a/src/gallium/drivers/freedreno/freedreno_blitter.h b/src/gallium/drivers/freedreno/freedreno_blitter.h new file mode 100644 index 00000000000..9d213b577b5 --- /dev/null +++ b/src/gallium/drivers/freedreno/freedreno_blitter.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 Rob Clark + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Rob Clark + */ + +#ifndef FREEDRENO_BLIT_H_ +#define FREEDRENO_BLIT_H_ + +#include "pipe/p_state.h" + +#include "freedreno_context.h" + +void fd_blitter_blit(struct fd_context *ctx, const struct pipe_blit_info *info); + +#endif /* FREEDRENO_BLIT_H_ */ diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index 3da058dcdef..66088da8c7e 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -27,6 +27,7 @@ */ #include "freedreno_context.h" +#include "freedreno_blitter.h" #include "freedreno_draw.h" #include "freedreno_fence.h" #include "freedreno_program.h" @@ -293,6 +294,9 @@ fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen, slab_create_child(&ctx->transfer_pool, &screen->transfer_pool); + if (!ctx->blit) + ctx->blit = fd_blitter_blit; + fd_draw_init(pctx); fd_resource_context_init(pctx); fd_query_context_init(pctx); diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index 02656e82519..1e9911ea9bf 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -329,6 +329,9 @@ struct fd_context { struct fd_ringbuffer *ring); void (*query_set_stage)(struct fd_batch *batch, enum fd_render_stage stage); + /* blit: */ + void (*blit)(struct fd_context *ctx, const struct pipe_blit_info *info); + /* * Common pre-cooked VBO state (used for a3xx and later): */ diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index a04c49b7094..cb13f671c48 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -121,7 +121,7 @@ do_blit(struct fd_context *ctx, const struct pipe_blit_info *blit, bool fallback if (!fallback) { /* do blit on gpu: */ fd_blitter_pipe_begin(ctx, false, true, FD_STAGE_BLIT); - util_blitter_blit(ctx->blitter, blit); + ctx->blit(ctx, blit); fd_blitter_pipe_end(ctx); } else { /* do blit on cpu: */ @@ -977,7 +977,7 @@ fd_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info) } fd_blitter_pipe_begin(ctx, info.render_condition_enable, discard, FD_STAGE_BLIT); - util_blitter_blit(ctx->blitter, &info); + ctx->blit(ctx, &info); fd_blitter_pipe_end(ctx); } diff --git a/src/gallium/drivers/freedreno/meson.build b/src/gallium/drivers/freedreno/meson.build index daae8efdd66..7c45d4fe844 100644 --- a/src/gallium/drivers/freedreno/meson.build +++ b/src/gallium/drivers/freedreno/meson.build @@ -36,6 +36,8 @@ files_libfreedreno = files( 'freedreno_batch.h', 'freedreno_batch_cache.c', 'freedreno_batch_cache.h', + 'freedreno_blitter.c', + 'freedreno_blitter.h', 'freedreno_context.c', 'freedreno_context.h', 'freedreno_draw.c', -- 2.30.2