All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Cc: igt-dev@lists.freedesktop.org
Subject: Re: [igt-dev] [HAX 3/5] lib/igt_fb: Use rendercopy for rendering into compressed buffers
Date: Thu, 21 Feb 2019 15:58:40 +0200	[thread overview]
Message-ID: <20190221135840.GK20097@intel.com> (raw)
In-Reply-To: <20190221024123.17516-3-dhinakaran.pandiyan@intel.com>

On Wed, Feb 20, 2019 at 06:41:21PM -0800, Dhinakaran Pandiyan wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Plug in rendercopy to the cairo surface stuff so that we can
> generate compressed buffers with cairo.
> 
> v2: s/modifier_has_ccs/is_ccs_modifier/
> 
> v3: From DK
> Set buf.bpp when initializing and rebase.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
> ---
>  lib/igt_fb.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 139 insertions(+), 11 deletions(-)
> 
> diff --git a/lib/igt_fb.c b/lib/igt_fb.c
> index 462afec2..e0288282 100644
> --- a/lib/igt_fb.c
> +++ b/lib/igt_fb.c
> @@ -290,6 +290,7 @@ void igt_get_fb_tile_size(int fd, uint64_t tiling, int fb_bpp,
>  		}
>  		break;
>  	case LOCAL_I915_FORMAT_MOD_Y_TILED:
> +	case LOCAL_I915_FORMAT_MOD_Y_TILED_CCS:
>  		igt_require_intel(fd);
>  		if (intel_gen(intel_get_drm_devid(fd)) == 2) {
>  			*width_ret = 128;
> @@ -303,6 +304,7 @@ void igt_get_fb_tile_size(int fd, uint64_t tiling, int fb_bpp,
>  		}
>  		break;
>  	case LOCAL_I915_FORMAT_MOD_Yf_TILED:
> +	case LOCAL_I915_FORMAT_MOD_Yf_TILED_CCS:
>  		igt_require_intel(fd);
>  		switch (fb_bpp) {
>  		case 8:
> @@ -328,10 +330,21 @@ void igt_get_fb_tile_size(int fd, uint64_t tiling, int fb_bpp,
>  	}
>  }
>  
> +static bool is_ccs_modifier(uint64_t modifier)
> +{
> +	return modifier == LOCAL_I915_FORMAT_MOD_Y_TILED_CCS ||
> +		modifier == LOCAL_I915_FORMAT_MOD_Yf_TILED_CCS;
> +}
> +
>  static unsigned fb_plane_width(const struct igt_fb *fb, int plane)
>  {
>  	const struct format_desc_struct *format = lookup_drm_format(fb->drm_format);
>  
> +	if (is_ccs_modifier(fb->tiling) && plane == 1)
> +		return DIV_ROUND_UP(fb->width, 1024) * 128;
> +	if (fb->drm_format == DRM_FORMAT_NV12 && plane == 1)
> +		return DIV_ROUND_UP(fb->width, 2);

This nv12 thing doesn't seem relevant to the patch.

> +
>  	if (plane == 0)
>  		return fb->width;
>  
> @@ -342,13 +355,21 @@ static unsigned fb_plane_bpp(const struct igt_fb *fb, int plane)
>  {
>  	const struct format_desc_struct *format = lookup_drm_format(fb->drm_format);
>  
> -	return format->plane_bpp[plane];
> +	if (is_ccs_modifier(fb->tiling) && plane == 1)
> +		return 8;
> +	else
> +		return format->plane_bpp[plane];
>  }
>  
>  static unsigned fb_plane_height(const struct igt_fb *fb, int plane)
>  {
>  	const struct format_desc_struct *format = lookup_drm_format(fb->drm_format);
>  
> +	if (is_ccs_modifier(fb->tiling) && plane == 1)
> +		return DIV_ROUND_UP(fb->height, 512) * 32;
> +	if (fb->drm_format == DRM_FORMAT_NV12 && plane == 1)
> +		return DIV_ROUND_UP(fb->height, 2);
> +
>  	if (plane == 0)
>  		return fb->height;
>  
> @@ -359,7 +380,10 @@ static int fb_num_planes(const struct igt_fb *fb)
>  {
>  	const struct format_desc_struct *format = lookup_drm_format(fb->drm_format);
>  
> -	return format->num_planes;
> +	if (is_ccs_modifier(fb->tiling))
> +		return 2;
> +	else
> +		return format->num_planes;
>  }
>  
>  static void fb_init(struct igt_fb *fb,
> @@ -518,8 +542,10 @@ uint64_t igt_fb_mod_to_tiling(uint64_t modifier)
>  	case LOCAL_I915_FORMAT_MOD_X_TILED:
>  		return I915_TILING_X;
>  	case LOCAL_I915_FORMAT_MOD_Y_TILED:
> +	case LOCAL_I915_FORMAT_MOD_Y_TILED_CCS:
>  		return I915_TILING_Y;
>  	case LOCAL_I915_FORMAT_MOD_Yf_TILED:
> +	case LOCAL_I915_FORMAT_MOD_Yf_TILED_CCS:
>  		return I915_TILING_Yf;
>  	default:
>  		igt_assert(0);
> @@ -1405,8 +1431,54 @@ struct fb_blit_upload {
>  	int fd;
>  	struct igt_fb *fb;
>  	struct fb_blit_linear linear;
> +	drm_intel_bufmgr *bufmgr;
> +	struct intel_batchbuffer *batch;
>  };
>  
> +static void init_buf(struct fb_blit_upload *blit,
> +		     struct igt_buf *buf,
> +		     const struct igt_fb *fb,
> +		     const char *name)
> +{
> +	igt_assert_eq(fb->offsets[0], 0);
> +
> +	buf->bo = gem_handle_to_libdrm_bo(blit->bufmgr, blit->fd,
> +					  name, fb->gem_handle);
> +	buf->tiling = igt_fb_mod_to_tiling(fb->tiling);
> +	buf->stride = fb->strides[0];
> +	buf->bpp = fb->plane_bpp[0];
> +	buf->size = fb->size;
> +
> +	if (is_ccs_modifier(fb->tiling)) {
> +		igt_assert_eq(fb->strides[0] & 127, 0);
> +		igt_assert_eq(fb->strides[1] & 127, 0);
> +
> +		buf->aux.offset = fb->offsets[1];
> +		buf->aux.stride = fb->strides[1];
> +	}
> +}
> +
> +static void rendercopy(struct fb_blit_upload *blit,
> +		       const struct igt_fb *dst_fb,
> +		       const struct igt_fb *src_fb)
> +{
> +	struct igt_buf src = {}, dst = {};
> +	igt_render_copyfunc_t render_copy =
> +		igt_get_render_copyfunc(intel_get_drm_devid(blit->fd));
> +
> +	igt_require(render_copy);
> +
> +	igt_assert_eq(dst_fb->offsets[0], 0);
> +	igt_assert_eq(src_fb->offsets[0], 0);
> +
> +	init_buf(blit, &src, src_fb, "cairo rendercopy src");
> +	init_buf(blit, &dst, dst_fb, "cairo rendercopy dst");
> +
> +	render_copy(blit->batch, NULL,
> +		    &src, 0, 0, dst_fb->plane_width[0], dst_fb->plane_height[0],
> +		    &dst, 0, 0);
> +}
> +
>  static void blitcopy(const struct igt_fb *dst_fb,
>  		     const struct igt_fb *src_fb)
>  {
> @@ -1444,7 +1516,10 @@ static void free_linear_mapping(struct fb_blit_upload *blit)
>  	gem_set_domain(fd, linear->fb.gem_handle,
>  		       I915_GEM_DOMAIN_GTT, 0);
>  
> -	blitcopy(fb, &linear->fb);
> +	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);
> @@ -1461,8 +1536,26 @@ static void destroy_cairo_surface__blit(void *arg)
>  	free(blit);
>  }
>  
> -static void setup_linear_mapping(int fd, struct igt_fb *fb, struct fb_blit_linear *linear)
> +static void destroy_cairo_surface__rendercopy(void *arg)
>  {
> +	struct fb_blit_upload *blit = arg;
> +
> +	blit->fb->cairo_surface = NULL;
> +
> +	free_linear_mapping(blit);
> +
> +	intel_batchbuffer_free(blit->batch);
> +	drm_intel_bufmgr_destroy(blit->bufmgr);
> +
> +	free(blit);
> +}
> +
> +static void setup_linear_mapping(struct fb_blit_upload *blit)
> +{
> +	int fd = blit->fd;
> +	struct igt_fb *fb = blit->fb;
> +	struct fb_blit_linear *linear = &blit->linear;
> +
>  	/*
>  	 * We create a linear BO that we'll map for the CPU to write to (using
>  	 * cairo). This linear bo will be then blitted to its final
> @@ -1481,7 +1574,10 @@ static void setup_linear_mapping(int fd, struct igt_fb *fb, struct fb_blit_linea
>  	gem_set_domain(fd, linear->fb.gem_handle,
>  			I915_GEM_DOMAIN_GTT, 0);
>  
> -	blitcopy(&linear->fb, fb);
> +	if (blit->batch)
> +		rendercopy(blit, &linear->fb, fb);
> +	else
> +		blitcopy(&linear->fb, fb);
>  
>  	gem_sync(fd, linear->fb.gem_handle);
>  
> @@ -1498,12 +1594,12 @@ static void create_cairo_surface__blit(int fd, struct igt_fb *fb)
>  	struct fb_blit_upload *blit;
>  	cairo_format_t cairo_format;
>  
> -	blit = malloc(sizeof(*blit));
> +	blit = calloc(1, sizeof(*blit));
>  	igt_assert(blit);
>  
>  	blit->fd = fd;
>  	blit->fb = fb;
> -	setup_linear_mapping(fd, fb, &blit->linear);
> +	setup_linear_mapping(blit);
>  
>  	cairo_format = drm_format_to_cairo(fb->drm_format);
>  	fb->cairo_surface =
> @@ -1518,6 +1614,36 @@ static void create_cairo_surface__blit(int fd, struct igt_fb *fb)
>  				    blit, destroy_cairo_surface__blit);
>  }
>  
> +static void create_cairo_surface__rendercopy(int fd, struct igt_fb *fb)
> +{
> +	struct fb_blit_upload *blit;
> +	cairo_format_t cairo_format;
> +
> +	blit = calloc(1, sizeof(*blit));
> +	igt_assert(blit);
> +
> +	blit->fd = fd;
> +	blit->fb = fb;
> +
> +	blit->bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
> +	blit->batch = intel_batchbuffer_alloc(blit->bufmgr,
> +					      intel_get_drm_devid(fd));
> +
> +	setup_linear_mapping(blit);
> +
> +	cairo_format = drm_format_to_cairo(fb->drm_format);
> +	fb->cairo_surface =
> +		cairo_image_surface_create_for_data(blit->linear.map,
> +						    cairo_format,
> +						    fb->width, fb->height,
> +						    blit->linear.fb.strides[0]);
> +	fb->domain = I915_GEM_DOMAIN_GTT;
> +
> +	cairo_surface_set_user_data(fb->cairo_surface,
> +				    (cairo_user_data_key_t *)create_cairo_surface__rendercopy,
> +				    blit, destroy_cairo_surface__rendercopy);
> +}
> +
>  /**
>   * igt_dirty_fb:
>   * @fd: open drm file descriptor
> @@ -2278,8 +2404,8 @@ static void destroy_cairo_surface__convert(void *arg)
>  
>  static void create_cairo_surface__convert(int fd, struct igt_fb *fb)
>  {
> -	struct fb_convert_blit_upload *blit = malloc(sizeof(*blit));
> -	struct fb_convert cvt = { };
> +	struct fb_convert_blit_upload *blit = calloc(1, sizeof(*blit));
> +	struct fb_convert cvt = { 0 };

Ugly 0.

>  	const struct format_desc_struct *f = lookup_drm_format(fb->drm_format);
>  	unsigned drm_format;
>  	cairo_format_t cairo_id;
> @@ -2318,7 +2444,7 @@ static void create_cairo_surface__convert(int fd, struct igt_fb *fb)
>  
>  	if (fb->tiling == LOCAL_I915_FORMAT_MOD_Y_TILED ||
>  	    fb->tiling == LOCAL_I915_FORMAT_MOD_Yf_TILED) {
> -		setup_linear_mapping(fd, fb, &blit->base.linear);
> +		setup_linear_mapping(&blit->base);
>  	} else {
>  		blit->base.linear.fb = *fb;
>  		blit->base.linear.fb.gem_handle = 0;
> @@ -2397,8 +2523,10 @@ 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 (is_ccs_modifier(fb->tiling))
> +			create_cairo_surface__rendercopy(fd, fb);
>  		else if (fb->tiling == LOCAL_I915_FORMAT_MOD_Y_TILED ||
> -		    fb->tiling == LOCAL_I915_FORMAT_MOD_Yf_TILED)
> +			 fb->tiling == LOCAL_I915_FORMAT_MOD_Yf_TILED)
>  			create_cairo_surface__blit(fd, fb);
>  		else
>  			create_cairo_surface__gtt(fd, fb);
> -- 
> 2.17.1
> 
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev

-- 
Ville Syrjälä
Intel
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  reply	other threads:[~2019-02-21 13:58 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-21  2:41 [igt-dev] [HAX 1/5] lib/rendercopy: Add support for Yf/Ys tiling to gen9 rendercopy Dhinakaran Pandiyan
2019-02-21  2:41 ` [igt-dev] [HAX 2/5] tests/gem_render_copy: Test Yf tiling Dhinakaran Pandiyan
2019-02-21  2:41 ` [igt-dev] [HAX 3/5] lib/igt_fb: Use rendercopy for rendering into compressed buffers Dhinakaran Pandiyan
2019-02-21 13:58   ` Ville Syrjälä [this message]
2019-02-21 14:06   ` Ville Syrjälä
2019-02-21 23:20     ` Dhinakaran Pandiyan
2019-02-22 17:12       ` Ville Syrjälä
2019-02-22 17:26       ` Ville Syrjälä
2019-02-22 17:29         ` Pandiyan, Dhinakaran
2019-02-22 18:37         ` Dhinakaran Pandiyan
2019-02-22 18:54           ` Ville Syrjälä
2019-02-22 19:12             ` Pandiyan, Dhinakaran
2019-02-22 19:34               ` Ville Syrjälä
2019-02-23  2:16                 ` Dhinakaran Pandiyan
2019-02-21  2:41 ` [igt-dev] [HAX 4/5] lib/igt_fb: s/tiling/modifier/ where appropriate Dhinakaran Pandiyan
2019-02-21  2:41 ` [igt-dev] [HAX 5/5] tests/kms_ccs: Generate compressed surfaces with renderopy Dhinakaran Pandiyan
2019-02-21 10:41 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [HAX,1/5] lib/rendercopy: Add support for Yf/Ys tiling to gen9 rendercopy Patchwork
2019-02-21 15:46 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
2019-02-21 18:25 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [HAX,1/5] lib/rendercopy: Add support for Yf/Ys tiling to gen9 rendercopy (rev2) Patchwork
2019-02-22  7:44 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190221135840.GK20097@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=dhinakaran.pandiyan@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.