static void r600_copy_first_sample(struct pipe_context *ctx, const struct pipe_resolve_info *info) { struct r600_context *rctx = (struct r600_context *)ctx; struct r600_texture *rsrc = (struct r600_texture*)info->src.res; struct pipe_surface *dst_view, dst_templ; struct pipe_sampler_view src_templ, *src_view; struct pipe_box box; if (rsrc->is_depth && !rsrc->is_flushing_texture) { if (!r600_init_flushed_depth_texture(ctx, info->src.res, NULL)) return; /* error */ /* Decompress the first sample only. */ r600_blit_decompress_depth(ctx, rsrc, NULL, 0, 0, info->src.layer, info->src.layer, 0, 0); } if (rctx->chip_class != CAYMAN && rsrc->fmask_size && rsrc->cmask_size) { r600_blit_decompress_color(ctx, rsrc, 0, 0, info->src.layer, info->src.layer); } /* this is correct for upside-down blits too */ u_box_2d(info->src.x0, info->src.y0, info->src.x1 - info->src.x0, info->src.y1 - info->src.y0, &box); /* Initialize the surface. */ util_blitter_default_dst_texture(&dst_templ, info->dst.res, info->dst.level, info->dst.layer, &box); dst_view = ctx->create_surface(ctx, info->dst.res, &dst_templ); /* Initialize the sampler view. */ util_blitter_default_src_texture(&src_templ, info->src.res, 0); src_view = ctx->create_sampler_view(ctx, info->src.res, &src_templ); /* Copy the first sample into dst. */ r600_blitter_begin(ctx, R600_COPY_TEXTURE); util_blitter_copy_texture_view(rctx->blitter, dst_view, ~0, info->dst.x0, info->dst.y0, src_view, 0, &box, info->src.res->width0, info->src.res->height0, info->mask); r600_blitter_end(ctx); pipe_surface_reference(&dst_view, NULL); pipe_sampler_view_reference(&src_view, NULL); }
void util_blitter_copy_texture(struct blitter_context *blitter, struct pipe_resource *dst, unsigned dstlevel, unsigned dstx, unsigned dsty, unsigned dstz, struct pipe_resource *src, unsigned srclevel, const struct pipe_box *srcbox, boolean ignore_stencil) { struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; struct pipe_context *pipe = ctx->base.pipe; struct pipe_screen *screen = pipe->screen; struct pipe_surface *dst_view, dst_templ; struct pipe_sampler_view src_templ, *src_view; unsigned bind; boolean is_stencil, is_depth; /* Give up if textures are not set. */ assert(dst && src); if (!dst || !src) return; assert(src->target < PIPE_MAX_TEXTURE_TYPES); /* Is this a ZS format? */ is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0; is_stencil = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 1) != 0; if (is_depth || is_stencil) bind = PIPE_BIND_DEPTH_STENCIL; else bind = PIPE_BIND_RENDER_TARGET; /* Check if we can sample from and render to the surfaces. */ /* (assuming copying a stencil buffer is not possible) */ if ((!ignore_stencil && is_stencil) || !screen->is_format_supported(screen, dst->format, dst->target, dst->nr_samples, bind) || !screen->is_format_supported(screen, src->format, src->target, src->nr_samples, PIPE_BIND_SAMPLER_VIEW)) { blitter_set_running_flag(ctx); util_resource_copy_region(pipe, dst, dstlevel, dstx, dsty, dstz, src, srclevel, srcbox); blitter_unset_running_flag(ctx); return; } /* Initialize the surface. */ util_blitter_default_dst_texture(&dst_templ, dst, dstlevel, dstz, srcbox); dst_view = pipe->create_surface(pipe, dst, &dst_templ); /* Initialize the sampler view. */ util_blitter_default_src_texture(&src_templ, src, srclevel); src_view = pipe->create_sampler_view(pipe, src, &src_templ); /* Copy. */ util_blitter_copy_texture_view(blitter, dst_view, dstx, dsty, src_view, srcbox, src->width0, src->height0); pipe_surface_reference(&dst_view, NULL); pipe_sampler_view_reference(&src_view, NULL); }