diff options
author | android-build-prod (mdb) <android-build-team-robot@google.com> | 2019-07-17 19:43:27 +0000 |
---|---|---|
committer | android-build-prod (mdb) <android-build-team-robot@google.com> | 2019-07-17 19:43:27 +0000 |
commit | 28ef4464a9a81b692dd998d861fac7eb02ff28d7 (patch) | |
tree | 5900ed1fe6617561a0afeb54e58a1625c1e6a36f /lib/igt_fb.c | |
parent | ce751c3db636af811fcbcc2d65af1232f02c90d0 (diff) | |
parent | 9bf5c5a2babac62ae92c92462025894f463e8214 (diff) | |
download | platform_external_igt-gpu-tools-08f3c47b51f145951319bd307ab56b96a9052051.tar.gz platform_external_igt-gpu-tools-08f3c47b51f145951319bd307ab56b96a9052051.tar.bz2 platform_external_igt-gpu-tools-08f3c47b51f145951319bd307ab56b96a9052051.zip |
Snap for 5735642 from 9bf5c5a2babac62ae92c92462025894f463e8214 to sdk-releaseplatform-tools-29.0.2
Change-Id: Ieffff41050635b81152686e3355c4c40fae706d6
Diffstat (limited to 'lib/igt_fb.c')
-rw-r--r-- | lib/igt_fb.c | 144 |
1 files changed, 72 insertions, 72 deletions
diff --git a/lib/igt_fb.c b/lib/igt_fb.c index d4929019..9d4f905e 100644 --- a/lib/igt_fb.c +++ b/lib/igt_fb.c @@ -98,6 +98,12 @@ static const struct format_desc_struct { .num_planes = 1, .plane_bpp = { 16, }, .hsub = 1, .vsub = 1, }, + { .name = "C8", .depth = -1, .drm_id = DRM_FORMAT_C8, + .cairo_id = CAIRO_FORMAT_INVALID, + .pixman_id = PIXMAN_r3g3b2, + .num_planes = 1, .plane_bpp = { 8, }, + .hsub = 1, .vsub = 1, + }, { .name = "XRGB1555", .depth = -1, .drm_id = DRM_FORMAT_XRGB1555, .cairo_id = CAIRO_FORMAT_INVALID, .pixman_id = PIXMAN_x1r5g5b5, @@ -1716,17 +1722,25 @@ static void free_linear_mapping(struct fb_blit_upload *blit) struct igt_fb *fb = blit->fb; struct fb_blit_linear *linear = &blit->linear; - gem_munmap(linear->map, linear->fb.size); - gem_set_domain(fd, linear->fb.gem_handle, - I915_GEM_DOMAIN_GTT, 0); + if (igt_vc4_is_tiled(fb->modifier)) { + void *map = igt_vc4_mmap_bo(fd, fb->gem_handle, fb->size, PROT_WRITE); - if (blit->batch) - rendercopy(blit, fb, &linear->fb); - else - blitcopy(fb, &linear->fb); + vc4_fb_convert_plane_to_tiled(fb, map, &linear->fb, &linear->map); + + munmap(map, fb->size); + } else { + gem_munmap(linear->map, linear->fb.size); + gem_set_domain(fd, linear->fb.gem_handle, + I915_GEM_DOMAIN_GTT, 0); + + if (blit->batch) + rendercopy(blit, fb, &linear->fb); + else + blitcopy(fb, &linear->fb); - gem_sync(fd, linear->fb.gem_handle); - gem_close(fd, linear->fb.gem_handle); + gem_sync(fd, linear->fb.gem_handle); + gem_close(fd, linear->fb.gem_handle); + } if (blit->batch) { intel_batchbuffer_free(blit->batch); @@ -1751,7 +1765,7 @@ static void setup_linear_mapping(struct fb_blit_upload *blit) struct igt_fb *fb = blit->fb; struct fb_blit_linear *linear = &blit->linear; - if (use_rendercopy(fb)) { + if (!igt_vc4_is_tiled(fb->modifier) && use_rendercopy(fb)) { blit->bufmgr = drm_intel_bufmgr_gem_init(fd, 4096); blit->batch = intel_batchbuffer_alloc(blit->bufmgr, intel_get_drm_devid(fd)); @@ -1771,23 +1785,35 @@ static void setup_linear_mapping(struct fb_blit_upload *blit) igt_assert(linear->fb.gem_handle > 0); - /* Copy fb content to linear BO */ - gem_set_domain(fd, linear->fb.gem_handle, - I915_GEM_DOMAIN_GTT, 0); + if (igt_vc4_is_tiled(fb->modifier)) { + void *map = igt_vc4_mmap_bo(fd, fb->gem_handle, fb->size, PROT_READ); - if (blit->batch) - rendercopy(blit, &linear->fb, fb); - else - blitcopy(&linear->fb, fb); + linear->map = igt_vc4_mmap_bo(fd, linear->fb.gem_handle, + linear->fb.size, + PROT_READ | PROT_WRITE); + + vc4_fb_convert_plane_from_tiled(&linear->fb, &linear->map, fb, map); + + munmap(map, fb->size); + } else { + /* Copy fb content to linear BO */ + gem_set_domain(fd, linear->fb.gem_handle, + I915_GEM_DOMAIN_GTT, 0); + + if (blit->batch) + rendercopy(blit, &linear->fb, fb); + else + blitcopy(&linear->fb, fb); - gem_sync(fd, linear->fb.gem_handle); + gem_sync(fd, linear->fb.gem_handle); - gem_set_domain(fd, linear->fb.gem_handle, - I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU); + gem_set_domain(fd, linear->fb.gem_handle, + I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU); - /* Setup cairo context */ - linear->map = gem_mmap__cpu(fd, linear->fb.gem_handle, - 0, linear->fb.size, PROT_READ | PROT_WRITE); + /* Setup cairo context */ + linear->map = gem_mmap__cpu(fd, linear->fb.gem_handle, + 0, linear->fb.size, PROT_READ | PROT_WRITE); + } } static void create_cairo_surface__gpu(int fd, struct igt_fb *fb) @@ -2902,7 +2928,7 @@ static void create_cairo_surface__convert(int fd, struct igt_fb *fb) &blit->shadow_fb); igt_assert(blit->shadow_ptr); - if (use_rendercopy(fb) || use_blitter(fb)) { + if (use_rendercopy(fb) || use_blitter(fb) || igt_vc4_is_tiled(fb->modifier)) { setup_linear_mapping(&blit->base); } else { blit->base.linear.fb = *fb; @@ -2983,7 +3009,7 @@ cairo_surface_t *igt_get_cairo_surface(int fd, struct igt_fb *fb) ((f->cairo_id == CAIRO_FORMAT_INVALID) && (f->pixman_id != PIXMAN_invalid))) create_cairo_surface__convert(fd, fb); - else if (use_blitter(fb) || use_rendercopy(fb)) + else if (use_blitter(fb) || use_rendercopy(fb) || igt_vc4_is_tiled(fb->modifier)) create_cairo_surface__gpu(fd, fb); else create_cairo_surface__gtt(fd, fb); @@ -3102,58 +3128,23 @@ unsigned int igt_fb_convert_with_stride(struct igt_fb *dst, struct igt_fb *src, uint64_t dst_modifier, unsigned int dst_stride) { - struct fb_convert cvt = { }; - struct igt_fb linear; - void *dst_ptr, *src_ptr; - uint64_t base_modifier; + /* Use the cairo api to convert */ + cairo_surface_t *surf = igt_get_cairo_surface(src->fd, src); + cairo_t *cr; int fb_id; - if (is_vc4_device(src->fd)) - base_modifier = fourcc_mod_broadcom_mod(dst_modifier); - else - base_modifier = dst_modifier; - - fb_id = igt_create_fb_with_bo_size(src->fd, src->width, src->height, - dst_fourcc, - LOCAL_DRM_FORMAT_MOD_NONE, &linear, - 0, dst_stride); + fb_id = igt_create_fb_with_bo_size(src->fd, src->width, + src->height, dst_fourcc, + dst_modifier, dst, 0, + dst_stride); igt_assert(fb_id > 0); - src_ptr = igt_fb_map_buffer(src->fd, src); - igt_assert(src_ptr); - - dst_ptr = igt_fb_map_buffer(linear.fd, &linear); - igt_assert(dst_ptr); - - cvt.dst.ptr = dst_ptr; - cvt.dst.fb = &linear; - cvt.src.ptr = src_ptr; - cvt.src.fb = src; - fb_convert(&cvt); - - igt_fb_unmap_buffer(dst, dst_ptr); - igt_fb_unmap_buffer(src, src_ptr); - - switch (base_modifier) { - case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: - fb_id = igt_vc4_fb_t_tiled_convert(dst, &linear); - break; - case DRM_FORMAT_MOD_BROADCOM_SAND32: - case DRM_FORMAT_MOD_BROADCOM_SAND64: - case DRM_FORMAT_MOD_BROADCOM_SAND128: - case DRM_FORMAT_MOD_BROADCOM_SAND256: - fb_id = vc4_fb_sand_tiled_convert(dst, &linear, dst_modifier); - break; - default: - igt_assert(dst_modifier == LOCAL_DRM_FORMAT_MOD_NONE); - } + cr = igt_get_cairo_ctx(dst->fd, dst); + cairo_set_source_surface(cr, surf, 0, 0); + cairo_paint(cr); + igt_put_cairo_ctx(dst->fd, dst, cr); - igt_assert(fb_id > 0); - - if (dst_modifier == LOCAL_DRM_FORMAT_MOD_NONE) - *dst = linear; - else - igt_remove_fb(linear.fd, &linear); + cairo_surface_destroy(surf); return fb_id; } @@ -3248,6 +3239,15 @@ bool igt_fb_supported_format(uint32_t drm_format) { const struct format_desc_struct *f; + /* + * C8 needs a LUT which (at least for the time being) + * is the responsibility of each test. Not all tests + * have the required code so let's keep C8 hidden from + * most eyes. + */ + if (drm_format == DRM_FORMAT_C8) + return false; + for_each_format(f) if (f->drm_id == drm_format) return (f->cairo_id != CAIRO_FORMAT_INVALID) || |