From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>,
intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v3] drm/i915: Compare GGTT view structs instead of types
Date: Fri, 27 Mar 2015 10:41:17 +0000 [thread overview]
Message-ID: <551533CD.8000506@linux.intel.com> (raw)
In-Reply-To: <1427450584.4966.8.camel@jlahtine-mobl1>
Hi,
On 03/27/2015 10:03 AM, Joonas Lahtinen wrote:
> To allow for views where the view type is not defined by the view type only,
> like it is in stereo or rotated 90 degree view, change the semantic to require
> the whole view structure for comparison when we match a GGTT view.
>
> This allows including parameters like offset to be included in the view which
> is useful for eg. partial views.
>
> v3:
> - Rely on ggtt_view type being 0 for non-GGTT vma's, which equals to
> I915_GGTT_VIEW_NORMAL. (Daniel Vetter)
> - Do not use potentially slower comparison when we only want to know if
> something is or is not a normal view.
> - Rebase on top of rotated view patches. Add rotated view singleton.
> - If one view is missing in comparison they're equal only if both are missing.
>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> (v2)
> Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 8 ++++----
> drivers/gpu/drm/i915/i915_gem.c | 13 +++++++------
> drivers/gpu/drm/i915/i915_gem_gtt.c | 3 +++
> drivers/gpu/drm/i915/i915_gem_gtt.h | 8 ++++++++
> drivers/gpu/drm/i915/intel_display.c | 8 +++-----
> 5 files changed, 25 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 256369f..5aeba60 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2794,19 +2794,19 @@ void i915_gem_restore_fences(struct drm_device *dev);
>
> unsigned long
> i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
> - enum i915_ggtt_view_type view);
> + const struct i915_ggtt_view *view);
> unsigned long
> i915_gem_obj_offset(struct drm_i915_gem_object *o,
> struct i915_address_space *vm);
> static inline unsigned long
> i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *o)
> {
> - return i915_gem_obj_ggtt_offset_view(o, I915_GGTT_VIEW_NORMAL);
> + return i915_gem_obj_ggtt_offset_view(o, &i915_ggtt_view_normal);
> }
>
> bool i915_gem_obj_bound_any(struct drm_i915_gem_object *o);
> bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
> - enum i915_ggtt_view_type view);
> + const struct i915_ggtt_view *view);
> bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
> struct i915_address_space *vm);
>
> @@ -2854,7 +2854,7 @@ i915_vm_to_ppgtt(struct i915_address_space *vm)
>
> static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj)
> {
> - return i915_gem_obj_ggtt_bound_view(obj, I915_GGTT_VIEW_NORMAL);
> + return i915_gem_obj_ggtt_bound_view(obj, &i915_ggtt_view_normal);
> }
>
> static inline unsigned long
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 3300963..8c32b1d 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -4131,7 +4131,7 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj,
>
> if (i915_vma_misplaced(vma, alignment, flags)) {
> unsigned long offset;
> - offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, ggtt_view->type) :
> + offset = ggtt_view ? i915_gem_obj_ggtt_offset_view(obj, ggtt_view) :
> i915_gem_obj_offset(obj, vm);
> WARN(vma->pin_count,
> "bo is already pinned in %s with incorrect alignment:"
> @@ -4230,7 +4230,7 @@ i915_gem_object_ggtt_unpin_view(struct drm_i915_gem_object *obj,
>
> BUG_ON(!vma);
> WARN_ON(vma->pin_count == 0);
> - WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view->type));
> + WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view));
>
> if (--vma->pin_count == 0 && view->type == I915_GGTT_VIEW_NORMAL)
> obj->pin_mappable = false;
No comparison helper in i915_gem_obj_to_ggtt_view()?
> @@ -5109,13 +5109,14 @@ i915_gem_obj_offset(struct drm_i915_gem_object *o,
>
> unsigned long
> i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
> - enum i915_ggtt_view_type view)
> + const struct i915_ggtt_view *view)
> {
> struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
> struct i915_vma *vma;
>
> list_for_each_entry(vma, &o->vma_list, vma_link)
> - if (vma->vm == ggtt && vma->ggtt_view.type == view)
> + if (vma->vm == ggtt &&
> + i915_ggtt_view_equal(&vma->ggtt_view, view))
> return vma->node.start;
>
> WARN(1, "global vma for this object not found.\n");
> @@ -5139,14 +5140,14 @@ bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
> }
>
> bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
> - enum i915_ggtt_view_type view)
> + const struct i915_ggtt_view *view)
> {
> struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
> struct i915_vma *vma;
>
> list_for_each_entry(vma, &o->vma_list, vma_link)
> if (vma->vm == ggtt &&
> - vma->ggtt_view.type == view &&
> + i915_ggtt_view_equal(&vma->ggtt_view, view) &&
> drm_mm_node_allocated(&vma->node))
> return true;
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 9903bb0..13eb769 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -93,6 +93,9 @@
> */
>
> const struct i915_ggtt_view i915_ggtt_view_normal;
> +const struct i915_ggtt_view i915_ggtt_view_rotated = {
> + .type = I915_GGTT_VIEW_ROTATED
> +};
>
> static void bdw_setup_private_ppat(struct drm_i915_private *dev_priv);
> static void chv_setup_private_ppat(struct drm_i915_private *dev_priv);
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 0dad426..c1c426a 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -138,6 +138,7 @@ struct i915_ggtt_view {
> };
>
> extern const struct i915_ggtt_view i915_ggtt_view_normal;
> +extern const struct i915_ggtt_view i915_ggtt_view_rotated;
>
> enum i915_cache_level;
>
> @@ -422,4 +423,11 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev);
> int __must_check i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj);
> void i915_gem_gtt_finish_object(struct drm_i915_gem_object *obj);
>
> +static inline bool
> +i915_ggtt_view_equal(const struct i915_ggtt_view *a,
> + const struct i915_ggtt_view *b)
> +{
> + return !!a && !!b ? a->type == b->type : !a && !b;
> +}
What's the background behind this both NULL check? Will you ever use it
like that?
I think the code elsewhere makes sure to always pass valid views to this
internal helper so I don't get it.
> +
> #endif
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index cb50854..d6c2e34 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2293,8 +2293,6 @@ 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;
> - static const struct i915_ggtt_view rotated_view =
> - { .type = I915_GGTT_VIEW_ROTATED };
>
> *view = i915_ggtt_view_normal;
>
> @@ -2304,7 +2302,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
> if (!intel_rotation_90_or_270(plane_state->rotation))
> return 0;
>
> - *view = rotated_view;
> + *view = i915_ggtt_view_rotated;
>
> info->height = fb->height;
> info->pixel_format = fb->pixel_format;
> @@ -2904,10 +2902,10 @@ u32 intel_fb_stride_alignment(struct drm_device *dev, uint64_t fb_modifier,
> unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane,
> struct drm_i915_gem_object *obj)
> {
> - enum i915_ggtt_view_type view = I915_GGTT_VIEW_NORMAL;
> + const struct i915_ggtt_view *view = &i915_ggtt_view_normal;
>
> if (intel_rotation_90_or_270(intel_plane->base.state->rotation))
> - view = I915_GGTT_VIEW_ROTATED;
> + view = &i915_ggtt_view_rotated;
>
> return i915_gem_obj_ggtt_offset_view(obj, view);
> }
>
Regards,
Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-03-27 10:41 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-23 12:51 [PATCH v2] drm/i915: Compare GGTT view structs instead of types Joonas Lahtinen
2015-03-23 13:39 ` Tvrtko Ursulin
2015-03-24 12:45 ` Joonas Lahtinen
2015-03-25 10:59 ` Daniel Vetter
2015-03-27 10:03 ` [PATCH v3] " Joonas Lahtinen
2015-03-27 10:41 ` Tvrtko Ursulin [this message]
2015-03-27 11:09 ` [PATCH v4] " Joonas Lahtinen
2015-03-27 11:46 ` Tvrtko Ursulin
2015-03-27 14:05 ` Daniel Vetter
2015-03-27 15:32 ` shuang.he
2015-03-27 13:22 ` [PATCH v3] " shuang.he
2015-03-24 18:18 ` [PATCH v2] " shuang.he
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=551533CD.8000506@linux.intel.com \
--to=tvrtko.ursulin@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=joonas.lahtinen@linux.intel.com \
/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.