radeonsi: convert the framebuffer state to atom-based
[mesa.git] / src / gallium / drivers / radeonsi / si_blit.c
index 8bfa6ed96e685b794137b6282312b44e13fd90d8..dd303c800085a3f3b9898270dbdd9599b3ff8fb3 100644 (file)
@@ -68,7 +68,7 @@ static void si_blitter_begin(struct pipe_context *ctx, enum si_blitter_op op)
                                     (struct pipe_stream_output_target**)sctx->b.streamout.targets);
 
        if (op & SI_SAVE_FRAMEBUFFER)
-               util_blitter_save_framebuffer(sctx->blitter, &sctx->framebuffer);
+               util_blitter_save_framebuffer(sctx->blitter, &sctx->framebuffer.state);
 
        if (op & SI_SAVE_TEXTURES) {
                util_blitter_save_fragment_sampler_states(
@@ -320,7 +320,7 @@ static void si_clear(struct pipe_context *ctx, unsigned buffers,
                     double depth, unsigned stencil)
 {
        struct si_context *sctx = (struct si_context *)ctx;
-       struct pipe_framebuffer_state *fb = &sctx->framebuffer;
+       struct pipe_framebuffer_state *fb = &sctx->framebuffer.state;
 
        si_blitter_begin(ctx, SI_CLEAR);
        util_blitter_clear(sctx->blitter, fb->width, fb->height,
@@ -483,8 +483,11 @@ static void si_resource_copy_region(struct pipe_context *ctx,
                                    const struct pipe_box *src_box)
 {
        struct si_context *sctx = (struct si_context *)ctx;
+       struct r600_texture *rdst = (struct r600_texture*)dst;
+       struct pipe_surface *dst_view, dst_templ;
+       struct pipe_sampler_view src_templ, *src_view;
        struct texture_orig_info orig_info[2];
-       struct pipe_box sbox;
+       struct pipe_box sbox, dstbox;
        boolean restore_orig[2];
 
        /* Fallback for buffers. */
@@ -562,11 +565,29 @@ static void si_resource_copy_region(struct pipe_context *ctx,
                restore_orig[1] = TRUE;
        }
 
+       /* Initialize the surface. */
+       util_blitter_default_dst_texture(&dst_templ, dst, dst_level, dstz);
+       dst_view = r600_create_surface_custom(ctx, dst, &dst_templ,
+                                             rdst->surface.level[dst_level].npix_x,
+                                             rdst->surface.level[dst_level].npix_y);
+
+       /* Initialize the sampler view. */
+       util_blitter_default_src_texture(&src_templ, src, src_level);
+       src_view = ctx->create_sampler_view(ctx, src, &src_templ);
+
+       u_box_3d(dstx, dsty, dstz, abs(src_box->width), abs(src_box->height),
+                abs(src_box->depth), &dstbox);
+
+       /* Copy. */
        si_blitter_begin(ctx, SI_COPY);
-       util_blitter_copy_texture(sctx->blitter, dst, dst_level, dstx, dsty, dstz,
-                                 src, src_level, src_box);
+       util_blitter_blit_generic(sctx->blitter, dst_view, &dstbox,
+                                 src_view, src_box, src->width0, src->height0,
+                                 PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL);
        si_blitter_end(ctx);
 
+       pipe_surface_reference(&dst_view, NULL);
+       pipe_sampler_view_reference(&src_view, NULL);
+
        if (restore_orig[0])
                si_reset_blittable_to_orig(src, src_level, &orig_info[0]);