i965/skl: Extract the blit command setup in to a helper
authorAnuj Phogat <anuj.phogat@gmail.com>
Thu, 28 May 2015 02:28:34 +0000 (19:28 -0700)
committerAnuj Phogat <anuj.phogat@gmail.com>
Mon, 29 Jun 2015 20:18:42 +0000 (13:18 -0700)
Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
src/mesa/drivers/dri/i965/intel_blit.c

index c773cbca97433d85f943ca55d06633aad2f311db..bc390535c8686814b6050b77ae105e42b1c08f3b 100644 (file)
@@ -456,6 +456,51 @@ can_fast_copy_blit(struct brw_context *brw,
    return true;
 }
 
+static uint32_t
+xy_blit_cmd(uint32_t src_tiling, uint32_t src_tr_mode,
+            uint32_t dst_tiling, uint32_t dst_tr_mode,
+            uint32_t cpp, bool use_fast_copy_blit)
+{
+   uint32_t CMD = 0;
+
+   if (use_fast_copy_blit) {
+      CMD = XY_FAST_COPY_BLT_CMD;
+
+      if (dst_tiling != I915_TILING_NONE)
+         SET_TILING_XY_FAST_COPY_BLT(dst_tiling, dst_tr_mode, XY_FAST_DST);
+
+      if (src_tiling != I915_TILING_NONE)
+         SET_TILING_XY_FAST_COPY_BLT(src_tiling, src_tr_mode, XY_FAST_SRC);
+
+      CMD |= get_tr_horizontal_align(src_tr_mode, cpp, true /* is_src */);
+      CMD |= get_tr_vertical_align(src_tr_mode, cpp, true /* is_src */);
+
+      CMD |= get_tr_horizontal_align(dst_tr_mode, cpp, false /* is_src */);
+      CMD |= get_tr_vertical_align(dst_tr_mode, cpp, false /* is_src */);
+
+   } else {
+      assert(cpp <= 4);
+      switch (cpp) {
+      case 1:
+      case 2:
+         CMD = XY_SRC_COPY_BLT_CMD;
+         break;
+      case 4:
+         CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
+         break;
+      default:
+         unreachable("not reached");
+      }
+
+      if (dst_tiling != I915_TILING_NONE)
+         CMD |= XY_DST_TILED;
+
+      if (src_tiling != I915_TILING_NONE)
+         CMD |= XY_SRC_TILED;
+   }
+   return CMD;
+}
+
 /* Copy BitBlt
  */
 bool
@@ -544,24 +589,18 @@ intelEmitCopyBlit(struct brw_context *brw,
       if (dst_tr_mode == INTEL_MIPTREE_TRMODE_YF)
          BR13 |= XY_FAST_DST_TRMODE_YF;
 
-      CMD = XY_FAST_COPY_BLT_CMD;
+      CMD = xy_blit_cmd(src_tiling, src_tr_mode,
+                        dst_tiling, dst_tr_mode,
+                        cpp, use_fast_copy_blit);
 
-      if (dst_tiling != I915_TILING_NONE) {
-         SET_TILING_XY_FAST_COPY_BLT(dst_tiling, dst_tr_mode, XY_FAST_DST);
-         /* Pitch value should be specified as a number of Dwords. */
+      /* For tiled source and destination, pitch value should be specified
+       * as a number of Dwords.
+       */
+      if (dst_tiling != I915_TILING_NONE)
          dst_pitch /= 4;
-      }
-      if (src_tiling != I915_TILING_NONE) {
-         SET_TILING_XY_FAST_COPY_BLT(src_tiling, src_tr_mode, XY_FAST_SRC);
-         /* Pitch value should be specified as a number of Dwords. */
-         src_pitch /= 4;
-      }
-
-      CMD |= get_tr_horizontal_align(src_tr_mode, cpp, true /* is_src */);
-      CMD |= get_tr_vertical_align(src_tr_mode, cpp, true /* is_src */);
 
-      CMD |= get_tr_horizontal_align(dst_tr_mode, cpp, false /* is_src */);
-      CMD |= get_tr_vertical_align(dst_tr_mode, cpp, false /* is_src */);
+      if (src_tiling != I915_TILING_NONE)
+         src_pitch /= 4;
 
    } else {
       assert(!dst_y_tiled || (dst_pitch % 128) == 0);
@@ -599,26 +638,16 @@ intelEmitCopyBlit(struct brw_context *brw,
 
       assert(cpp <= 4);
       BR13 = br13_for_cpp(cpp) | translate_raster_op(logic_op) << 16;
-      switch (cpp) {
-      case 1:
-      case 2:
-         CMD = XY_SRC_COPY_BLT_CMD;
-         break;
-      case 4:
-         CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
-         break;
-      default:
-         return false;
-      }
 
-      if (dst_tiling != I915_TILING_NONE) {
-         CMD |= XY_DST_TILED;
+      CMD = xy_blit_cmd(src_tiling, src_tr_mode,
+                        dst_tiling, dst_tr_mode,
+                        cpp, use_fast_copy_blit);
+
+      if (dst_tiling != I915_TILING_NONE)
          dst_pitch /= 4;
-      }
-      if (src_tiling != I915_TILING_NONE) {
-         CMD |= XY_SRC_TILED;
+
+      if (src_tiling != I915_TILING_NONE)
          src_pitch /= 4;
-      }
    }
 
    if (dst_y2 <= dst_y || dst_x2 <= dst_x) {