summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>2015-04-29 13:24:34 +0100
committerDamien Lespiau <damien.lespiau@intel.com>2015-04-29 15:02:19 +0100
commit30a1360f6abeed5f7aaaa069380d07f94ae9a036 (patch)
tree5afef5e1ef258d276e3bc8b83c7c88ae8868eb12
parentfc69bb0de5f072be45e327bfff0efade6880a1a9 (diff)
igt_fb: Transfer existing content to Cairo surface for Y/Yf frame buffers
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> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
-rw-r--r--lib/igt_fb.c56
1 files changed, 40 insertions, 16 deletions
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 6dc22bbb..fe0c63f8 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,