From: Tvrtko Ursulin <[email protected]>

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 <[email protected]>
Cc: Damien Lespiau <[email protected]>
---
 lib/igt_fb.c | 56 ++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 40 insertions(+), 16 deletions(-)

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,
-- 
2.3.5

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to