Message ID | 1455569699-27905-10-git-send-email-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Feb 15, 2016 at 10:54:47PM +0200, ville.syrjala@linux.intel.com wrote: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Instead of repopulatin the rotation_info struct for the fb every time > we try to use the fb, we can just populate it once when creating the fb, > and later we can just copy the pre-populate struct into the gtt_view. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Merged up to here. Thanks for the reviews. > --- > drivers/gpu/drm/i915/intel_display.c | 27 ++++++++++++++++----------- > drivers/gpu/drm/i915/intel_drv.h | 1 + > 2 files changed, 17 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 74252433b1ec..fddfc5875752 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -2309,18 +2309,20 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, > const struct drm_framebuffer *fb, > unsigned int rotation) > { > - struct drm_i915_private *dev_priv = to_i915(fb->dev); > - struct intel_rotation_info *info = &view->params.rotated; > - unsigned int tile_size, tile_width, tile_height, cpp; > - > - *view = i915_ggtt_view_normal; > - > - if (!intel_rotation_90_or_270(rotation)) > - return; > - > - *view = i915_ggtt_view_rotated; > + if (intel_rotation_90_or_270(rotation)) { > + *view = i915_ggtt_view_rotated; > + view->params.rotated = to_intel_framebuffer(fb)->rot_info; > + } else { > + *view = i915_ggtt_view_normal; > + } > +} > > - info->uv_offset = fb->offsets[1]; > +static void > +intel_fill_fb_info(struct drm_i915_private *dev_priv, > + struct drm_framebuffer *fb) > +{ > + struct intel_rotation_info *info = &to_intel_framebuffer(fb)->rot_info; > + unsigned int tile_size, tile_width, tile_height, cpp; > > tile_size = intel_tile_size(dev_priv); > > @@ -2336,6 +2338,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, > intel_tile_dims(dev_priv, &tile_width, &tile_height, > fb->modifier[1], cpp); > > + info->uv_offset = fb->offsets[1]; > info->plane[1].width = DIV_ROUND_UP(fb->pitches[1], tile_width * cpp); > info->plane[1].height = DIV_ROUND_UP(fb->height / 2, tile_height); > } > @@ -14891,6 +14894,8 @@ static int intel_framebuffer_init(struct drm_device *dev, > drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd); > intel_fb->obj = obj; > > + intel_fill_fb_info(dev_priv, &intel_fb->base); > + > ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs); > if (ret) { > DRM_ERROR("framebuffer init failed %d\n", ret); > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 59bed59388ad..674afa1f9f97 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -118,6 +118,7 @@ enum intel_output_type { > struct intel_framebuffer { > struct drm_framebuffer base; > struct drm_i915_gem_object *obj; > + struct intel_rotation_info rot_info; > }; > > struct intel_fbdev { > -- > 2.4.10
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 74252433b1ec..fddfc5875752 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -2309,18 +2309,20 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, const struct drm_framebuffer *fb, unsigned int rotation) { - struct drm_i915_private *dev_priv = to_i915(fb->dev); - struct intel_rotation_info *info = &view->params.rotated; - unsigned int tile_size, tile_width, tile_height, cpp; - - *view = i915_ggtt_view_normal; - - if (!intel_rotation_90_or_270(rotation)) - return; - - *view = i915_ggtt_view_rotated; + if (intel_rotation_90_or_270(rotation)) { + *view = i915_ggtt_view_rotated; + view->params.rotated = to_intel_framebuffer(fb)->rot_info; + } else { + *view = i915_ggtt_view_normal; + } +} - info->uv_offset = fb->offsets[1]; +static void +intel_fill_fb_info(struct drm_i915_private *dev_priv, + struct drm_framebuffer *fb) +{ + struct intel_rotation_info *info = &to_intel_framebuffer(fb)->rot_info; + unsigned int tile_size, tile_width, tile_height, cpp; tile_size = intel_tile_size(dev_priv); @@ -2336,6 +2338,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, intel_tile_dims(dev_priv, &tile_width, &tile_height, fb->modifier[1], cpp); + info->uv_offset = fb->offsets[1]; info->plane[1].width = DIV_ROUND_UP(fb->pitches[1], tile_width * cpp); info->plane[1].height = DIV_ROUND_UP(fb->height / 2, tile_height); } @@ -14891,6 +14894,8 @@ static int intel_framebuffer_init(struct drm_device *dev, drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd); intel_fb->obj = obj; + intel_fill_fb_info(dev_priv, &intel_fb->base); + ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs); if (ret) { DRM_ERROR("framebuffer init failed %d\n", ret); diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 59bed59388ad..674afa1f9f97 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -118,6 +118,7 @@ enum intel_output_type { struct intel_framebuffer { struct drm_framebuffer base; struct drm_i915_gem_object *obj; + struct intel_rotation_info rot_info; }; struct intel_fbdev {