[Intel-gfx] [PATCH 2/3] drm/i915: Move rotated geometry calculations into the fill helper
Joonas Lahtinen
joonas.lahtinen at linux.intel.com
Wed Jun 24 00:41:48 PDT 2015
On ti, 2015-06-23 at 12:57 +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>
> This way data is available as soon as the view is passed into the call chain.
>
> v2: Store size in bytes instead of pages under the appropriate name. (Chris Wilson)
>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> This will be needed in the following patch which fixes i915_ggtt_view_size.
> ---
> drivers/gpu/drm/i915/i915_gem_gtt.c | 36 +++++++++++++-----------------------
> drivers/gpu/drm/i915/i915_gem_gtt.h | 2 ++
> drivers/gpu/drm/i915/intel_display.c | 8 ++++++++
> 3 files changed, 23 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index c1c16b0..9777ef4 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -2700,29 +2700,17 @@ static struct sg_table *
> intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
> struct drm_i915_gem_object *obj)
> {
> - struct drm_device *dev = obj->base.dev;
> struct intel_rotation_info *rot_info = &ggtt_view->rotation_info;
> - unsigned long pages, rot_pages;
> + unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
> struct sg_page_iter sg_iter;
> unsigned long i;
> dma_addr_t *page_addr_list;
> struct sg_table *st;
> - unsigned int tile_pitch, tile_height;
> - unsigned int width_pages, height_pages;
> int ret = -ENOMEM;
>
> - pages = obj->base.size / PAGE_SIZE;
> -
> - /* Calculate tiling geometry. */
> - tile_height = intel_tile_height(dev, rot_info->pixel_format,
> - rot_info->fb_modifier);
> - tile_pitch = PAGE_SIZE / tile_height;
> - width_pages = DIV_ROUND_UP(rot_info->pitch, tile_pitch);
> - height_pages = DIV_ROUND_UP(rot_info->height, tile_height);
> - rot_pages = width_pages * height_pages;
> -
> /* Allocate a temporary list of source pages for random access. */
> - page_addr_list = drm_malloc_ab(pages, sizeof(dma_addr_t));
> + page_addr_list = drm_malloc_ab(obj->base.size / PAGE_SIZE,
> + sizeof(dma_addr_t));
> if (!page_addr_list)
> return ERR_PTR(ret);
>
> @@ -2731,7 +2719,7 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
> if (!st)
> goto err_st_alloc;
>
> - ret = sg_alloc_table(st, rot_pages, GFP_KERNEL);
> + ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
> if (ret)
> goto err_sg_alloc;
>
> @@ -2743,13 +2731,15 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
> }
>
> /* Rotate the pages. */
> - rotate_pages(page_addr_list, width_pages, height_pages, st);
> + rotate_pages(page_addr_list,
> + rot_info->width_pages, rot_info->height_pages,
> + st);
>
> DRM_DEBUG_KMS(
> - "Created rotated page mapping for object size %lu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %lu pages).\n",
> + "Created rotated page mapping for object size %lu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
> obj->base.size, rot_info->pitch, rot_info->height,
> - rot_info->pixel_format, width_pages, height_pages,
> - rot_pages);
> + rot_info->pixel_format, rot_info->width_pages,
> + rot_info->height_pages, size_pages);
>
> drm_free_large(page_addr_list);
>
> @@ -2761,10 +2751,10 @@ err_st_alloc:
> drm_free_large(page_addr_list);
>
> DRM_DEBUG_KMS(
> - "Failed to create rotated mapping for object size %lu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %lu pages)\n",
> + "Failed to create rotated mapping for object size %lu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages)\n",
> obj->base.size, ret, rot_info->pitch, rot_info->height,
> - rot_info->pixel_format, width_pages, height_pages,
> - rot_pages);
> + rot_info->pixel_format, rot_info->width_pages,
> + rot_info->height_pages, size_pages);
> return ERR_PTR(ret);
> }
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 735f119..3f9fc17 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -126,6 +126,8 @@ struct intel_rotation_info {
> unsigned int pitch;
> uint32_t pixel_format;
> uint64_t fb_modifier;
> + unsigned int width_pages, height_pages;
> + size_t size;
> };
>
> struct i915_ggtt_view {
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 1bc217a..54315aa 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2268,6 +2268,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
> const struct drm_plane_state *plane_state)
> {
> struct intel_rotation_info *info = &view->rotation_info;
> + unsigned int tile_height, tile_pitch;
>
> *view = i915_ggtt_view_normal;
>
> @@ -2284,6 +2285,13 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
> info->pitch = fb->pitches[0];
> info->fb_modifier = fb->modifier[0];
>
> + tile_height = intel_tile_height(fb->dev, fb->pixel_format,
> + fb->modifier[0]);
> + tile_pitch = PAGE_SIZE / tile_height;
> + info->width_pages = DIV_ROUND_UP(fb->pitches[0], tile_pitch);
> + info->height_pages = DIV_ROUND_UP(fb->height, tile_height);
> + info->size = info->width_pages * info->height_pages * PAGE_SIZE;
> +
> return 0;
> }
>
More information about the Intel-gfx
mailing list