diff options
Diffstat (limited to 'drivers/gpu/drm/virtio/virtgpu_plane.c')
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_plane.c | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c index a2e045f3a000..a72a2dbda031 100644 --- a/drivers/gpu/drm/virtio/virtgpu_plane.c +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c @@ -79,6 +79,8 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,  {  	struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,  										 plane); +	struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state, +										 plane);  	bool is_cursor = plane->type == DRM_PLANE_TYPE_CURSOR;  	struct drm_crtc_state *crtc_state;  	int ret; @@ -86,6 +88,14 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane,  	if (!new_plane_state->fb || WARN_ON(!new_plane_state->crtc))  		return 0; +	/* +	 * Ignore damage clips if the framebuffer attached to the plane's state +	 * has changed since the last plane update (page-flip). In this case, a +	 * full plane update should happen because uploads are done per-buffer. +	 */ +	if (old_plane_state->fb != new_plane_state->fb) +		new_plane_state->ignore_damage_clips = true; +  	crtc_state = drm_atomic_get_crtc_state(state,  					       new_plane_state->crtc);  	if (IS_ERR(crtc_state)) @@ -323,16 +333,16 @@ static void virtio_gpu_cursor_plane_update(struct drm_plane *plane,  		DRM_DEBUG("update, handle %d, pos +%d+%d, hot %d,%d\n", handle,  			  plane->state->crtc_x,  			  plane->state->crtc_y, -			  plane->state->fb ? plane->state->fb->hot_x : 0, -			  plane->state->fb ? plane->state->fb->hot_y : 0); +			  plane->state->hotspot_x, +			  plane->state->hotspot_y);  		output->cursor.hdr.type =  			cpu_to_le32(VIRTIO_GPU_CMD_UPDATE_CURSOR);  		output->cursor.resource_id = cpu_to_le32(handle);  		if (plane->state->fb) {  			output->cursor.hot_x = -				cpu_to_le32(plane->state->fb->hot_x); +				cpu_to_le32(plane->state->hotspot_x);  			output->cursor.hot_y = -				cpu_to_le32(plane->state->fb->hot_y); +				cpu_to_le32(plane->state->hotspot_y);  		} else {  			output->cursor.hot_x = cpu_to_le32(0);  			output->cursor.hot_y = cpu_to_le32(0); | 
