[Intel-gfx] [PATCH 3/5] drm/i915: add SNB and IVB video sprite support
Daniel Vetter
daniel at ffwll.ch
Tue Nov 8 23:57:39 CET 2011
On Tue, Nov 08, 2011 at 02:31:00PM -0800, Jesse Barnes wrote:
> On Tue, 8 Nov 2011 22:57:03 +0100 Daniel Vetter <daniel at ffwll.ch> wrote:
> > > @@ -270,8 +270,14 @@ void intel_fb_restore_mode(struct drm_device *dev)
> > > {
> > > int ret;
> > > drm_i915_private_t *dev_priv = dev->dev_private;
> > > + struct drm_mode_config *config = &dev->mode_config;
> > > + struct drm_plane *plane;
> > >
> > > ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
> > > if (ret)
> > > DRM_DEBUG("failed to restore crtc mode\n");
> > > +
> > > + /* Be sure to shut off any planes that may be active */
> > > + list_for_each_entry(plane, &config->plane_list, head)
> > > + plane->funcs->disable_plane(plane);
> >
> > This should be part of the fb_helper above.
>
> That would be a bit invasive... and may not be what every driver
> wants. Does it belong in set_config? Or do we just forcibly disable
> the planes everywhere?
Core drm code currently does not call fb_helper_restore, that's the
drivers job atm (yeah, somewhere on my todo). And i915 is currently the
only one with sprite support. And I don't think we want the last video
frame to occlude the OOPS when X died. So yes, this imo belongs into the
fb_helper.
> > > + * Note on refcounting:
> > > + * When the user creates an fb for the GEM object to be used for the plane,
> > > + * a ref is taken on the object. However, if the application exits before
> > > + * disabling the plane, the DRM close handling will free all the fbs and
> > > + * unless we take a ref on the object, it will be destroyed before the
> > > + * plane disable hook is called, causing obvious trouble with our efforts
> > > + * to look up and unpin the object. So we take a ref after we move the
> > > + * object to the display plane so it won't be destroyed until our disable
> > > + * hook is called and we drop our private reference.
> > > + */
> >
> > Actually, this is wrong. Before the fb gets destroyed we call
> > drm_framebuffer_cleanup which takes care of this problem. The fact that
> > - currently drivers call this instead of the drm core
> > - it's a ducttape solution instead of refcounting
> > doesn't really make it nice, but it works.
>
> Not sure I understand what you mean about drm_framebuffer_cleanup
> taking care of the problem. The refcounting and fb handling may not be
> ideal, but taking refs on the underlying objects is what we need to do
> today.
Well, I think we don't need to take refs. set_base gets away with it, too:
- the pin/unpin ensures that the buffer doesn't move.
- the drm core holds onto both the old and the new fb for the duration of
the update_plane, so we also have a reference on that. And that
reference won't disappear without a disable_plane thanks to the addition to
drm_framebuffer_cleanup I've prodded you into writing.
> I don't want to change that as part of this series, but did want to
> explain why we take a private ref for the plane object here.
Yeah, cleanup up our fb handling will be a bit messy.
>
> > > + sprctl = I915_READ(reg);
> >
> > reg isn't really a great var name. Imo just drop it, only used twice and
> > reduces readability.
>
> Sure, easy enough.
>
> > > + I915_WRITE(SPRCTL(pipe), I915_READ(SPRCTL(pipe)) & ~SPRITE_ENABLE);
> > > + I915_WRITE(SPRSCALE(pipe), 0);
> > > + I915_WRITE(SPRSURF(pipe), 0);
> >
> > Is that required or just paranoia? I haven't found anything in bspec
> > suggesting it's required.
>
> The scaling disable was just to avoid surprises (in fact now that I look
> I need to mask it off in the update function).
>
> The surf write is definitely needed, since it triggers the double
> buffered reg update.
Ok, missed that in bspec review. Maybe add a comment for dummies
somewhere?
[snip]
> > > + ret = i915_gem_object_finish_gpu(intel_plane->obj);
> > > + if (ret)
> > > + goto out_unlock;
> >
> > What's the reason for that finish_gpu here?
>
> Slavish emulation of some other teardown code paths. If we ever do
> flipping on the sprites, I think we'll want it.
I think when we do flipping on sprites, we should try MI_LOAD_REG to latch
the double-buffered regs in the command stream. That way it'd work like
the pageflip paths.
-Daniel
--
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48
More information about the Intel-gfx
mailing list