Hi Mark,
Thanks for getting back to this.
On 1 December 2015 at 09:31, Mark yao <mark.yao@xxxxxxxxxxxxxx> wrote:
On 2015å12æ01æ 16:18, Daniel Stone wrote:Ah, OK. I mean that rockchip_crtc_wait_for_update takes a drm_crtc
On 1 December 2015 at 03:26, Mark Yao<mark.yao@xxxxxxxxxxxxxx> wrote:Hi Daniel
I'd be much more comfortable if this passed in an explicit pointer to+ for_each_crtc_in_state(state, crtc, crtc_state, i) {
+ if (!crtc->state->active)
+ continue;
+
+ rockchip_crtc_wait_for_update(crtc);
+ }
state, or an address to wait for, rather than have wait_for_complete
dig out state with no locking. The latter is potentially racy for
async operations.
"if this passed in an explicit pointer to state, or an address to wait
for", I don't understand, can you point how it work?
pointer, and establishes the state from that (e.g.
crtc->primary->state). This can easily lead to confusion in async
contexts, as the states attached to a drm_crtc and a drm_plane can
change here while you wait for it.
It would be better if the call was:
for_each_plane_in_state(state, plane, plane_state, i) {
if (plane->type == DRM_PLANE_TYPE_PRIMARY)
rockchip_crtc_wait_for_update(plane_state->crtc, plane_state);
}
This way it is very clear, and there is no confusion as to which
request we are waiting to complete.
In general, using crtc->state or plane->state is a very bad idea,
_except_ in the atomic_check function where you are calculating
changes (e.g. if (plane_state->fb->pitches[0] !=
plane->state->fb->pitches[0]) rockchip_plane_state->pitch_changed =
true). After atomic_check, you should always pass around pointers to
the plane state explicitly, and avoid using the pointers from drm_crtc
and drm_plane.
Does that help?
For me, it is more confusing when the display shows somethingthe origin src.x1 would align with 2 pixel, but when we move the destif (is_yuv) {I know this isn't new, but moving the plane around is bad. If the user
/*
* Src.x1 can be odd when do clip, but yuv plane start
point
* need align with 2 pixel.
*/
- val = (src.x1 >> 16) % 2;
- src.x1 += val << 16;
- src.x2 += val << 16;
+ uint32_t temp = (src->x1 >> 16) % 2;
+
+ src->x1 += temp << 16;
+ src->x2 += temp << 16;
}
gives you a pixel boundary that you can't actually use, please reject
the configuration rather than silently trying to fix it up.
window, and do clip by output, the src.x1 may be clipped to odd.
regect this configuration may let user confuse, sometimes good, sometimes
bad.
different to what I have requested. In some media usecases, doing this
is a showstopper and will result in products failing acceptance
testing. Userspace can make a policy decision to try different
alignments to get _something_ to show (even if it's not what was
explicitly requested), but doing this in the kernel is inappropriate:
please just reject it, and have userspace fall back to another
composition method (e.g. GL) in these cases.
Ah yes, you're right. But still, using that would be better than duplicating it.-static void vop_plane_destroy(struct drm_plane *plane)You can replace this hook with drm_atomic_helper_plane_destroy_state.
+static void vop_atomic_plane_destroy_state(struct drm_plane *plane,
+ struct drm_plane_state *state)
{
- vop_disable_plane(plane);
- drm_plane_cleanup(plane);
+ struct vop_plane_state *vop_state = to_vop_plane_state(state);
+
+ if (state->fb)
+ drm_framebuffer_unreference(state->fb);
+
+ kfree(vop_state);
}
Hmm, only can hook with __drm_atomic_helper_plane_destroy_state.
Can you share your Weston environment to me, I'm interesting to test drmOf course. You can download Weston from http://wayland.freedesktop.org
rockchip on weston.
- the most interesting dependencies are libevdev, libinput, and
wayland itself. If you are building newer Weston from git, you'll need
the wayland-protocols repository as well, from
anongit.freedesktop.org/git/wayland/wayland-protocols/. Please let me
know privately if you need some more help with building these, but
they should be quite straightforward.
Cheers,
Daniel