backend/drm: make wlr_drm_plane.{pending,queued,current}_fb pointers
This will be useful once we start re-using wlr_drm_fb.
This commit is contained in:
		
							parent
							
								
									64da8f0c8d
								
							
						
					
					
						commit
						5b1b43c68c
					
				|  | @ -134,7 +134,7 @@ static void set_plane_props(struct atomic *atom, struct wlr_drm_backend *drm, | ||||||
| 	uint32_t id = plane->id; | 	uint32_t id = plane->id; | ||||||
| 	const union wlr_drm_plane_props *props = &plane->props; | 	const union wlr_drm_plane_props *props = &plane->props; | ||||||
| 	struct wlr_drm_fb *fb = plane_get_next_fb(plane); | 	struct wlr_drm_fb *fb = plane_get_next_fb(plane); | ||||||
| 	if (!fb->id) { | 	if (fb == NULL) { | ||||||
| 		wlr_log(WLR_ERROR, "Failed to acquire FB"); | 		wlr_log(WLR_ERROR, "Failed to acquire FB"); | ||||||
| 		goto error; | 		goto error; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -324,9 +324,9 @@ static bool drm_connector_attach_render(struct wlr_output *output, | ||||||
| static void drm_plane_set_committed(struct wlr_drm_plane *plane) { | static void drm_plane_set_committed(struct wlr_drm_plane *plane) { | ||||||
| 	drm_fb_move(&plane->queued_fb, &plane->pending_fb); | 	drm_fb_move(&plane->queued_fb, &plane->pending_fb); | ||||||
| 
 | 
 | ||||||
| 	struct wlr_buffer *queued = plane->queued_fb.wlr_buf; | 	if (plane->queued_fb && plane->queued_fb->wlr_buf) { | ||||||
| 	if (queued != NULL) { | 		wlr_swapchain_set_buffer_submitted(plane->surf.swapchain, | ||||||
| 		wlr_swapchain_set_buffer_submitted(plane->surf.swapchain, queued); | 			plane->queued_fb->wlr_buf); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -366,7 +366,7 @@ static bool drm_crtc_page_flip(struct wlr_drm_connector *conn) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	assert(crtc->pending.active); | 	assert(crtc->pending.active); | ||||||
| 	assert(plane_get_next_fb(crtc->primary)->bo); | 	assert(plane_get_next_fb(crtc->primary)); | ||||||
| 	if (!drm_crtc_commit(conn, DRM_MODE_PAGE_FLIP_EVENT)) { | 	if (!drm_crtc_commit(conn, DRM_MODE_PAGE_FLIP_EVENT)) { | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
|  | @ -638,11 +638,11 @@ static bool drm_connector_export_dmabuf(struct wlr_output *output, | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	struct wlr_drm_fb *fb = &crtc->primary->queued_fb; | 	struct wlr_drm_fb *fb = crtc->primary->queued_fb; | ||||||
| 	if (fb->wlr_buf == NULL) { | 	if (fb == NULL) { | ||||||
| 		fb = &crtc->primary->current_fb; | 		fb = crtc->primary->current_fb; | ||||||
| 	} | 	} | ||||||
| 	if (fb->wlr_buf == NULL) { | 	if (fb == NULL) { | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -657,13 +657,13 @@ static bool drm_connector_export_dmabuf(struct wlr_output *output, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct wlr_drm_fb *plane_get_next_fb(struct wlr_drm_plane *plane) { | struct wlr_drm_fb *plane_get_next_fb(struct wlr_drm_plane *plane) { | ||||||
| 	if (plane->pending_fb.bo) { | 	if (plane->pending_fb) { | ||||||
| 		return &plane->pending_fb; | 		return plane->pending_fb; | ||||||
| 	} | 	} | ||||||
| 	if (plane->queued_fb.bo) { | 	if (plane->queued_fb) { | ||||||
| 		return &plane->queued_fb; | 		return plane->queued_fb; | ||||||
| 	} | 	} | ||||||
| 	return &plane->current_fb; | 	return plane->current_fb; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool drm_connector_pageflip_renderer(struct wlr_drm_connector *conn) { | static bool drm_connector_pageflip_renderer(struct wlr_drm_connector *conn) { | ||||||
|  | @ -676,7 +676,7 @@ static bool drm_connector_pageflip_renderer(struct wlr_drm_connector *conn) { | ||||||
| 
 | 
 | ||||||
| 	// drm_crtc_page_flip expects a FB to be available
 | 	// drm_crtc_page_flip expects a FB to be available
 | ||||||
| 	struct wlr_drm_plane *plane = crtc->primary; | 	struct wlr_drm_plane *plane = crtc->primary; | ||||||
| 	if (!plane_get_next_fb(plane)->bo) { | 	if (!plane_get_next_fb(plane)) { | ||||||
| 		if (!drm_surface_render_black_frame(&plane->surf)) { | 		if (!drm_surface_render_black_frame(&plane->surf)) { | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  | @ -1466,10 +1466,10 @@ static void page_flip_handler(int fd, unsigned seq, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	struct wlr_drm_plane *plane = conn->crtc->primary; | 	struct wlr_drm_plane *plane = conn->crtc->primary; | ||||||
| 	if (plane->queued_fb.bo) { | 	if (plane->queued_fb) { | ||||||
| 		drm_fb_move(&plane->current_fb, &plane->queued_fb); | 		drm_fb_move(&plane->current_fb, &plane->queued_fb); | ||||||
| 	} | 	} | ||||||
| 	if (conn->crtc->cursor && conn->crtc->cursor->queued_fb.bo) { | 	if (conn->crtc->cursor && conn->crtc->cursor->queued_fb) { | ||||||
| 		drm_fb_move(&conn->crtc->cursor->current_fb, | 		drm_fb_move(&conn->crtc->cursor->current_fb, | ||||||
| 			&conn->crtc->cursor->queued_fb); | 			&conn->crtc->cursor->queued_fb); | ||||||
| 	} | 	} | ||||||
|  | @ -1480,8 +1480,8 @@ static void page_flip_handler(int fd, unsigned seq, | ||||||
| 	 * data between the GPUs, even if we were using the direct scanout | 	 * data between the GPUs, even if we were using the direct scanout | ||||||
| 	 * interface. | 	 * interface. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (!drm->parent && plane->current_fb.wlr_buf && | 	if (!drm->parent && plane->current_fb->wlr_buf && | ||||||
| 			wlr_client_buffer_get(plane->current_fb.wlr_buf)) { | 			wlr_client_buffer_get(plane->current_fb->wlr_buf)) { | ||||||
| 		present_flags |= WLR_OUTPUT_PRESENT_ZERO_COPY; | 		present_flags |= WLR_OUTPUT_PRESENT_ZERO_COPY; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ static bool legacy_crtc_commit(struct wlr_drm_backend *drm, | ||||||
| 	uint32_t fb_id = 0; | 	uint32_t fb_id = 0; | ||||||
| 	if (crtc->pending.active) { | 	if (crtc->pending.active) { | ||||||
| 		struct wlr_drm_fb *fb = plane_get_next_fb(crtc->primary); | 		struct wlr_drm_fb *fb = plane_get_next_fb(crtc->primary); | ||||||
| 		if (!fb->id) { | 		if (fb == NULL) { | ||||||
| 			wlr_log(WLR_ERROR, "%s: failed to acquire primary FB", | 			wlr_log(WLR_ERROR, "%s: failed to acquire primary FB", | ||||||
| 				conn->output.name); | 				conn->output.name); | ||||||
| 			return false; | 			return false; | ||||||
|  | @ -76,7 +76,7 @@ static bool legacy_crtc_commit(struct wlr_drm_backend *drm, | ||||||
| 
 | 
 | ||||||
| 	if (cursor != NULL && drm_connector_is_cursor_visible(conn)) { | 	if (cursor != NULL && drm_connector_is_cursor_visible(conn)) { | ||||||
| 		struct wlr_drm_fb *cursor_fb = plane_get_next_fb(cursor); | 		struct wlr_drm_fb *cursor_fb = plane_get_next_fb(cursor); | ||||||
| 		if (!cursor_fb->bo) { | 		if (cursor_fb == NULL) { | ||||||
| 			wlr_drm_conn_log(conn, WLR_DEBUG, "Failed to acquire cursor FB"); | 			wlr_drm_conn_log(conn, WLR_DEBUG, "Failed to acquire cursor FB"); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -291,12 +291,13 @@ bool drm_plane_init_surface(struct wlr_drm_plane *plane, | ||||||
| 	return ok; | 	return ok; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void drm_fb_clear(struct wlr_drm_fb *fb) { | void drm_fb_clear(struct wlr_drm_fb **fb_ptr) { | ||||||
| 	if (!fb->bo) { | 	if (*fb_ptr == NULL) { | ||||||
| 		assert(!fb->wlr_buf); |  | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	struct wlr_drm_fb *fb = *fb_ptr; | ||||||
|  | 
 | ||||||
| 	struct gbm_device *gbm = gbm_bo_get_device(fb->bo); | 	struct gbm_device *gbm = gbm_bo_get_device(fb->bo); | ||||||
| 	if (drmModeRmFB(gbm_device_get_fd(gbm), fb->id) != 0) { | 	if (drmModeRmFB(gbm_device_get_fd(gbm), fb->id) != 0) { | ||||||
| 		wlr_log(WLR_ERROR, "drmModeRmFB failed"); | 		wlr_log(WLR_ERROR, "drmModeRmFB failed"); | ||||||
|  | @ -305,11 +306,12 @@ void drm_fb_clear(struct wlr_drm_fb *fb) { | ||||||
| 	gbm_bo_destroy(fb->bo); | 	gbm_bo_destroy(fb->bo); | ||||||
| 	wlr_buffer_unlock(fb->wlr_buf); | 	wlr_buffer_unlock(fb->wlr_buf); | ||||||
| 	wlr_buffer_unlock(fb->mgpu_wlr_buf); | 	wlr_buffer_unlock(fb->mgpu_wlr_buf); | ||||||
|  | 	free(fb); | ||||||
| 
 | 
 | ||||||
| 	memset(fb, 0, sizeof(*fb)); | 	*fb_ptr = NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool drm_fb_lock_surface(struct wlr_drm_fb *fb, struct wlr_drm_backend *drm, | bool drm_fb_lock_surface(struct wlr_drm_fb **fb_ptr, struct wlr_drm_backend *drm, | ||||||
| 		struct wlr_drm_surface *surf, struct wlr_drm_surface *mgpu) { | 		struct wlr_drm_surface *surf, struct wlr_drm_surface *mgpu) { | ||||||
| 	assert(surf->back_buffer != NULL); | 	assert(surf->back_buffer != NULL); | ||||||
| 
 | 
 | ||||||
|  | @ -319,7 +321,7 @@ bool drm_fb_lock_surface(struct wlr_drm_fb *fb, struct wlr_drm_backend *drm, | ||||||
| 	// making another context current.
 | 	// making another context current.
 | ||||||
| 	drm_surface_unset_current(surf); | 	drm_surface_unset_current(surf); | ||||||
| 
 | 
 | ||||||
| 	bool ok = drm_fb_import(fb, drm, buffer, mgpu, NULL); | 	bool ok = drm_fb_import(fb_ptr, drm, buffer, mgpu, NULL); | ||||||
| 	wlr_buffer_unlock(buffer); | 	wlr_buffer_unlock(buffer); | ||||||
| 	return ok; | 	return ok; | ||||||
| } | } | ||||||
|  | @ -361,10 +363,13 @@ static struct gbm_bo *get_bo_for_dmabuf(struct gbm_device *gbm, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool drm_fb_import(struct wlr_drm_fb *fb, struct wlr_drm_backend *drm, | bool drm_fb_import(struct wlr_drm_fb **fb_ptr, struct wlr_drm_backend *drm, | ||||||
| 		struct wlr_buffer *buf, struct wlr_drm_surface *mgpu, | 		struct wlr_buffer *buf, struct wlr_drm_surface *mgpu, | ||||||
| 		struct wlr_drm_format_set *set) { | 		struct wlr_drm_format_set *set) { | ||||||
| 	drm_fb_clear(fb); | 	struct wlr_drm_fb *fb = calloc(1, sizeof(*fb)); | ||||||
|  | 	if (!fb) { | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	fb->wlr_buf = wlr_buffer_lock(buf); | 	fb->wlr_buf = wlr_buffer_lock(buf); | ||||||
| 
 | 
 | ||||||
|  | @ -410,6 +415,8 @@ bool drm_fb_import(struct wlr_drm_fb *fb, struct wlr_drm_backend *drm, | ||||||
| 		goto error_get_fb_for_bo; | 		goto error_get_fb_for_bo; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	drm_fb_move(fb_ptr, &fb); | ||||||
|  | 
 | ||||||
| 	return true; | 	return true; | ||||||
| 
 | 
 | ||||||
| error_get_fb_for_bo: | error_get_fb_for_bo: | ||||||
|  | @ -418,15 +425,14 @@ error_get_dmabuf: | ||||||
| 	wlr_buffer_unlock(fb->mgpu_wlr_buf); | 	wlr_buffer_unlock(fb->mgpu_wlr_buf); | ||||||
| error_mgpu_wlr_buf: | error_mgpu_wlr_buf: | ||||||
| 	wlr_buffer_unlock(fb->wlr_buf); | 	wlr_buffer_unlock(fb->wlr_buf); | ||||||
| 	memset(fb, 0, sizeof(*fb)); | 	free(fb); | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void drm_fb_move(struct wlr_drm_fb *new, struct wlr_drm_fb *old) { | void drm_fb_move(struct wlr_drm_fb **new, struct wlr_drm_fb **old) { | ||||||
| 	drm_fb_clear(new); | 	drm_fb_clear(new); | ||||||
| 
 |  | ||||||
| 	*new = *old; | 	*new = *old; | ||||||
| 	memset(old, 0, sizeof(*old)); | 	*old = NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool drm_surface_render_black_frame(struct wlr_drm_surface *surf) { | bool drm_surface_render_black_frame(struct wlr_drm_surface *surf) { | ||||||
|  |  | ||||||
|  | @ -24,11 +24,11 @@ struct wlr_drm_plane { | ||||||
| 	struct wlr_drm_surface mgpu_surf; | 	struct wlr_drm_surface mgpu_surf; | ||||||
| 
 | 
 | ||||||
| 	/* Buffer to be submitted to the kernel on the next page-flip */ | 	/* Buffer to be submitted to the kernel on the next page-flip */ | ||||||
| 	struct wlr_drm_fb pending_fb; | 	struct wlr_drm_fb *pending_fb; | ||||||
| 	/* Buffer submitted to the kernel, will be presented on next vblank */ | 	/* Buffer submitted to the kernel, will be presented on next vblank */ | ||||||
| 	struct wlr_drm_fb queued_fb; | 	struct wlr_drm_fb *queued_fb; | ||||||
| 	/* Buffer currently displayed on screen */ | 	/* Buffer currently displayed on screen */ | ||||||
| 	struct wlr_drm_fb current_fb; | 	struct wlr_drm_fb *current_fb; | ||||||
| 
 | 
 | ||||||
| 	struct wlr_drm_format_set formats; | 	struct wlr_drm_format_set formats; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,14 +45,14 @@ void finish_drm_renderer(struct wlr_drm_renderer *renderer); | ||||||
| bool drm_surface_make_current(struct wlr_drm_surface *surf, int *buffer_age); | bool drm_surface_make_current(struct wlr_drm_surface *surf, int *buffer_age); | ||||||
| void drm_surface_unset_current(struct wlr_drm_surface *surf); | void drm_surface_unset_current(struct wlr_drm_surface *surf); | ||||||
| 
 | 
 | ||||||
| void drm_fb_clear(struct wlr_drm_fb *fb); | bool drm_fb_lock_surface(struct wlr_drm_fb **fb, struct wlr_drm_backend *drm, | ||||||
| bool drm_fb_lock_surface(struct wlr_drm_fb *fb, struct wlr_drm_backend *drm, |  | ||||||
| 		struct wlr_drm_surface *surf, struct wlr_drm_surface *mgpu); | 		struct wlr_drm_surface *surf, struct wlr_drm_surface *mgpu); | ||||||
| bool drm_fb_import(struct wlr_drm_fb *fb, struct wlr_drm_backend *drm, | bool drm_fb_import(struct wlr_drm_fb **fb, struct wlr_drm_backend *drm, | ||||||
| 		struct wlr_buffer *buf, struct wlr_drm_surface *mgpu, | 		struct wlr_buffer *buf, struct wlr_drm_surface *mgpu, | ||||||
| 		struct wlr_drm_format_set *set); | 		struct wlr_drm_format_set *set); | ||||||
| 
 | 
 | ||||||
| void drm_fb_move(struct wlr_drm_fb *new, struct wlr_drm_fb *old); | void drm_fb_clear(struct wlr_drm_fb **fb); | ||||||
|  | void drm_fb_move(struct wlr_drm_fb **new, struct wlr_drm_fb **old); | ||||||
| 
 | 
 | ||||||
| bool drm_surface_render_black_frame(struct wlr_drm_surface *surf); | bool drm_surface_render_black_frame(struct wlr_drm_surface *surf); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue