[i-g-t,1/2] igt_fb: Transfer existing content to Cairo surface for Y/Yf frame buffers
diff mbox

Message ID 1430310275-15075-1-git-send-email-tvrtko.ursulin@linux.intel.com
State New, archived
Headers show

Commit Message

Tvrtko Ursulin April 29, 2015, 12:24 p.m. UTC
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Rendering into Y and Yf tiled frame buffers with Cairo was losing the
previous content ie. was starting from black. This is different than the
behaviour with linear and X tiled so make it the same by blitting the
initial content when creating the rendering context.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Damien Lespiau <damien.lespiau@intel.com>
---
 lib/igt_fb.c | 56 ++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 40 insertions(+), 16 deletions(-)

Comments

Lespiau, Damien April 29, 2015, 2:02 p.m. UTC | #1
On Wed, Apr 29, 2015 at 01:24:34PM +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> 
> Rendering into Y and Yf tiled frame buffers with Cairo was losing the
> previous content ie. was starting from black. This is different than the
> behaviour with linear and X tiled so make it the same by blitting the
> initial content when creating the rendering context.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Damien Lespiau <damien.lespiau@intel.com>

This looks fine to me, pushed.

Patch
diff mbox

diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 6dc22bb..fe0c63f 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -650,11 +650,27 @@  struct fb_blit_upload {
 	} linear;
 };
 
+static unsigned int fb_mod_to_obj_tiling(uint64_t fb_mod)
+{
+	switch (fb_mod) {
+	case LOCAL_DRM_FORMAT_MOD_NONE:
+		return I915_TILING_NONE;
+	case LOCAL_I915_FORMAT_MOD_X_TILED:
+		return I915_TILING_X;
+	case LOCAL_I915_FORMAT_MOD_Y_TILED:
+		return I915_TILING_Y;
+	case LOCAL_I915_FORMAT_MOD_Yf_TILED:
+		return I915_TILING_Yf;
+	default:
+		igt_assert(0);
+	}
+}
+
 static void destroy_cairo_surface__blit(void *arg)
 {
 	struct fb_blit_upload *blit = arg;
 	struct igt_fb *fb = blit->fb;
-	unsigned int obj_tiling = I915_TILING_NONE;
+	unsigned int obj_tiling = fb_mod_to_obj_tiling(fb->tiling);
 
 	munmap(blit->linear.map, blit->linear.size);
 	fb->cairo_surface = NULL;
@@ -662,18 +678,6 @@  static void destroy_cairo_surface__blit(void *arg)
 	gem_set_domain(blit->fd, blit->linear.handle,
 			I915_GEM_DOMAIN_GTT, 0);
 
-	switch (fb->tiling) {
-	case LOCAL_I915_FORMAT_MOD_X_TILED:
-		obj_tiling = I915_TILING_X;
-		break;
-	case LOCAL_I915_FORMAT_MOD_Y_TILED:
-		obj_tiling = I915_TILING_Y;
-		break;
-	case LOCAL_I915_FORMAT_MOD_Yf_TILED:
-		obj_tiling = I915_TILING_Yf;
-		break;
-	}
-
 	igt_blitter_fast_copy__raw(blit->fd,
 				   blit->linear.handle,
 				   blit->linear.stride,
@@ -695,6 +699,7 @@  static void create_cairo_surface__blit(int fd, struct igt_fb *fb)
 {
 	struct fb_blit_upload *blit;
 	cairo_format_t cairo_format;
+	unsigned int obj_tiling = fb_mod_to_obj_tiling(fb->tiling);
 	int bpp, ret;
 
 	blit = malloc(sizeof(*blit));
@@ -716,6 +721,28 @@  static void create_cairo_surface__blit(int fd, struct igt_fb *fb)
 
 	blit->fd = fd;
 	blit->fb = fb;
+
+	/* Copy fb content to linear BO */
+	gem_set_domain(fd, blit->linear.handle,
+			I915_GEM_DOMAIN_GTT, 0);
+
+	igt_blitter_fast_copy__raw(fd,
+				   fb->gem_handle,
+				   fb->stride,
+				   obj_tiling,
+				   0, 0, /* src_x, src_y */
+				   fb->width, fb->height,
+				   blit->linear.handle,
+				   blit->linear.stride,
+				   I915_TILING_NONE,
+				   0, 0 /* dst_x, dst_y */);
+
+	gem_sync(fd, blit->linear.handle);
+
+	gem_set_domain(fd, blit->linear.handle,
+		       I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
+
+	/* Setup cairo context */
 	blit->linear.map = gem_mmap__cpu(fd,
 					 blit->linear.handle,
 					 0,
@@ -723,9 +750,6 @@  static void create_cairo_surface__blit(int fd, struct igt_fb *fb)
 					 PROT_READ | PROT_WRITE);
 	igt_assert(blit->linear.map);
 
-	gem_set_domain(fd, blit->linear.handle,
-		       I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
-
 	cairo_format = drm_format_to_cairo(fb->drm_format);
 	fb->cairo_surface =
 		cairo_image_surface_create_for_data(blit->linear.map,