ilo: add pipe-based copy method to ilo_blitter
authorChia-I Wu <olvaffe@gmail.com>
Mon, 17 Jun 2013 06:17:10 +0000 (14:17 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Mon, 17 Jun 2013 10:28:58 +0000 (18:28 +0800)
It enables accelerated resource_copy_region() when blt-based method fails.

src/gallium/drivers/ilo/ilo_blit.c
src/gallium/drivers/ilo/ilo_blitter_pipe.c

index 0041cd10916ab21ac2818134a887bf35cfeabfd8..ff8e5869658897b41004253e1e463a7d80f6585d 100644 (file)
  */
 
 #include "util/u_surface.h"
-#include "intel_reg.h"
 
 #include "ilo_blitter.h"
 #include "ilo_context.h"
-#include "ilo_cp.h"
-#include "ilo_resource.h"
-#include "ilo_screen.h"
 #include "ilo_blit.h"
 
 static void
@@ -51,6 +47,11 @@ ilo_resource_copy_region(struct pipe_context *pipe,
             src, src_level, src_box))
       return;
 
+   if (ilo_blitter_pipe_copy_resource(ilo->blitter,
+            dst, dst_level, dstx, dsty, dstz,
+            src, src_level, src_box))
+      return;
+
    util_resource_copy_region(&ilo->base, dst, dst_level,
          dstx, dsty, dstz, src, src_level, src_box);
 }
index cfec8b10e5f619f7fe2ce213fb11a5a7267daea7..e37231ac00b7209a33640a5029d2c46cfbe4f668 100644 (file)
@@ -139,7 +139,26 @@ ilo_blitter_pipe_copy_resource(struct ilo_blitter *blitter,
                                struct pipe_resource *src, unsigned src_level,
                                const struct pipe_box *src_box)
 {
-   return false;
+   const unsigned mask = PIPE_MASK_RGBAZS;
+   const bool copy_all_samples = true;
+
+   /* not until we allow rendertargets to be buffers */
+   if (dst->target == PIPE_BUFFER || src->target == PIPE_BUFFER)
+      return false;
+
+   if (!util_blitter_is_copy_supported(blitter->pipe_blitter, dst, src, mask))
+      return false;
+
+   ilo_blitter_pipe_begin(blitter, ILO_BLITTER_PIPE_COPY);
+
+   util_blitter_copy_texture(blitter->pipe_blitter,
+         dst, dst_level, dst_x, dst_y, dst_z,
+         src, src_level, src_box,
+         mask, copy_all_samples);
+
+   ilo_blitter_pipe_end(blitter);
+
+   return true;
 }
 
 bool