diff options
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/drm/drm.c | 3 | ||||
| -rw-r--r-- | backend/headless/backend.c | 22 | ||||
| -rw-r--r-- | backend/headless/output.c | 71 | ||||
| -rw-r--r-- | backend/wayland/output.c | 6 | ||||
| -rw-r--r-- | backend/x11/backend.c | 3 | 
5 files changed, 73 insertions, 32 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 96b7d93d..1fceff95 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -452,8 +452,7 @@ static bool wlr_drm_connector_set_mode(struct wlr_output *output,  		crtc->cursor ? crtc->cursor - drm->cursor_planes : -1);  	conn->state = WLR_DRM_CONN_CONNECTED; -	conn->output.current_mode = mode; -	wlr_output_update_size(&conn->output, mode->width, mode->height); +	wlr_output_update_mode(&conn->output, mode);  	// Since realloc_crtcs can deallocate planes on OTHER outputs,  	// we actually need to reinitalise any than has changed diff --git a/backend/headless/backend.c b/backend/headless/backend.c index bc2de2f2..c56753ba 100644 --- a/backend/headless/backend.c +++ b/backend/headless/backend.c @@ -2,19 +2,23 @@  #include <EGL/egl.h>  #include <EGL/eglext.h>  #include <wlr/util/log.h> +#include <wlr/interfaces/wlr_output.h>  #include "backend/headless.h"  #include "glapi.h"  static bool backend_start(struct wlr_backend *wlr_backend) {  	struct wlr_headless_backend *backend =  		(struct wlr_headless_backend *)wlr_backend; -	wlr_log(L_INFO, "Initializating headless backend"); +	wlr_log(L_INFO, "Starting headless backend"); -	// TODO -	for (size_t i = 0; i < 1; ++i) { -		wlr_headless_add_output(&backend->backend, 1280, 720); +	struct wlr_headless_backend_output *output; +	wl_list_for_each(output, &backend->outputs, link) { +		wl_event_source_timer_update(output->frame_timer, output->frame_delay); +		wlr_output_create_global(&output->wlr_output, backend->display); +		wl_signal_emit(&backend->backend.events.output_add, &output->wlr_output);  	} +	backend->started = true;  	return true;  } @@ -27,7 +31,10 @@ static void backend_destroy(struct wlr_backend *wlr_backend) {  	wl_list_remove(&backend->display_destroy.link); -	// TODO: destroy outputs +	struct wlr_headless_backend_output *output, *tmp; +	wl_list_for_each_safe(output, tmp, &backend->outputs, link) { +		wlr_output_destroy(&output->wlr_output); +	}  	wlr_egl_finish(&backend->egl);  	free(backend); @@ -64,7 +71,6 @@ static bool egl_get_config(EGLDisplay disp, EGLConfig *out) {  	static const EGLint attribs[] = {  		EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, -		EGL_BUFFER_SIZE, 32,  		EGL_ALPHA_SIZE, 0,  		EGL_BLUE_SIZE, 8,  		EGL_GREEN_SIZE, 8, @@ -164,3 +170,7 @@ struct wlr_backend *wlr_headless_backend_create(struct wl_display *display) {  	return &backend->backend;  } + +bool wlr_backend_is_headless(struct wlr_backend *backend) { +	return backend->impl == &backend_impl; +} diff --git a/backend/headless/output.c b/backend/headless/output.c index d4a46978..a6d48400 100644 --- a/backend/headless/output.c +++ b/backend/headless/output.c @@ -6,6 +6,41 @@  #include <wlr/util/log.h>  #include "backend/headless.h" +static EGLSurface egl_create_surface(struct wlr_egl *egl, unsigned int width, +		unsigned int height) { +	EGLint attribs[] = {EGL_WIDTH, width, EGL_HEIGHT, height, EGL_NONE}; + +	EGLSurface surf = eglCreatePbufferSurface(egl->display, egl->config, attribs); +	if (surf == EGL_NO_SURFACE) { +		wlr_log(L_ERROR, "Failed to create EGL surface: %s", egl_error()); +		return EGL_NO_SURFACE; +	} +	return surf; +} + +static bool output_set_custom_mode(struct wlr_output *wlr_output, int32_t width, +		int32_t height, int32_t refresh) { +	struct wlr_headless_backend_output *output = +		(struct wlr_headless_backend_output *)wlr_output; +	struct wlr_headless_backend *backend = output->backend; + +	if (output->egl_surface) { +		eglDestroySurface(backend->egl.display, output->egl_surface); +	} + +	output->egl_surface = egl_create_surface(&backend->egl, width, height); +	if (output->egl_surface == EGL_NO_SURFACE) { +		wlr_log(L_ERROR, "Failed to recreate EGL surface"); +		wlr_output_destroy(wlr_output); +		return false; +	} + +	output->frame_delay = 1000000 / refresh; + +	wlr_output_update_custom_mode(&output->wlr_output, width, height, refresh); +	return true; +} +  static void output_transform(struct wlr_output *wlr_output,  		enum wl_output_transform transform) {  	struct wlr_headless_backend_output *output = @@ -40,7 +75,7 @@ static void output_destroy(struct wlr_output *wlr_output) {  }  static const struct wlr_output_impl output_impl = { -	//.set_custom_mode = output_set_custom_mode, +	.set_custom_mode = output_set_custom_mode,  	.transform = output_transform,  	.destroy = output_destroy,  	.make_current = output_make_current, @@ -50,22 +85,10 @@ static const struct wlr_output_impl output_impl = {  static int signal_frame(void *data) {  	struct wlr_headless_backend_output *output = data;  	wl_signal_emit(&output->wlr_output.events.frame, &output->wlr_output); -	wl_event_source_timer_update(output->frame_timer, 16); +	wl_event_source_timer_update(output->frame_timer, output->frame_delay);  	return 0;  } -static EGLSurface egl_create_surface(struct wlr_egl *egl, unsigned int width, -		unsigned int height) { -	EGLint attribs[] = {EGL_WIDTH, width, EGL_HEIGHT, height, EGL_NONE}; - -	EGLSurface surf = eglCreatePbufferSurface(egl->display, egl->config, attribs); -	if (surf == EGL_NO_SURFACE) { -		wlr_log(L_ERROR, "Failed to create EGL surface: %s", egl_error()); -		return EGL_NO_SURFACE; -	} -	return surf; -} -  struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,  		unsigned int width, unsigned int height) {  	struct wlr_headless_backend *backend = @@ -83,11 +106,15 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,  	output->egl_surface = egl_create_surface(&backend->egl, width, height);  	if (output->egl_surface == EGL_NO_SURFACE) { -		// TODO: cleanup -		return NULL; +		wlr_log(L_ERROR, "Failed to create EGL surface"); +		goto error;  	} -	wlr_output_update_size(wlr_output, width, height); +	output_set_custom_mode(wlr_output, width, height, 60*1000); +	strncpy(wlr_output->make, "headless", sizeof(wlr_output->make)); +	strncpy(wlr_output->model, "headless", sizeof(wlr_output->model)); +	snprintf(wlr_output->name, sizeof(wlr_output->name), "HEADLESS-%d", +		wl_list_length(&backend->outputs) + 1);  	if (!eglMakeCurrent(output->backend->egl.display,  			output->egl_surface, output->egl_surface, @@ -104,9 +131,13 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,  	output->frame_timer = wl_event_loop_add_timer(ev, signal_frame, output);  	wl_list_insert(&backend->outputs, &output->link); -	wlr_output_create_global(wlr_output, backend->display); -	wl_signal_emit(&backend->backend.events.output_add, wlr_output); -	wl_event_source_timer_update(output->frame_timer, 16); + +	if (backend->started) { +		wl_event_source_timer_update(output->frame_timer, output->frame_delay); +		wlr_output_create_global(wlr_output, backend->display); +		wl_signal_emit(&backend->backend.events.output_add, wlr_output); +	} +  	return wlr_output;  error: diff --git a/backend/wayland/output.c b/backend/wayland/output.c index fc09903e..d841ec49 100644 --- a/backend/wayland/output.c +++ b/backend/wayland/output.c @@ -32,7 +32,7 @@ static bool wlr_wl_output_set_custom_mode(struct wlr_output *_output,  		int32_t width, int32_t height, int32_t refresh) {  	struct wlr_wl_backend_output *output = (struct wlr_wl_backend_output *)_output;  	wl_egl_window_resize(output->egl_window, width, height, 0, 0); -	wlr_output_update_size(&output->wlr_output, width, height); +	wlr_output_update_custom_mode(&output->wlr_output, width, height, 0);  	return true;  } @@ -229,7 +229,7 @@ static void xdg_toplevel_handle_configure(void *data, struct zxdg_toplevel_v6 *x  	}  	// loop over states for maximized etc?  	wl_egl_window_resize(output->egl_window, width, height, 0, 0); -	wlr_output_update_size(&output->wlr_output, width, height); +	wlr_output_update_custom_mode(&output->wlr_output, width, height, 0);  }  static void xdg_toplevel_handle_close(void *data, struct zxdg_toplevel_v6 *xdg_toplevel) { @@ -260,7 +260,7 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {  	wlr_output_init(&output->wlr_output, &backend->backend, &output_impl);  	struct wlr_output *wlr_output = &output->wlr_output; -	wlr_output_update_size(wlr_output, 1280, 720); +	wlr_output_update_custom_mode(wlr_output, 1280, 720, 0);  	strncpy(wlr_output->make, "wayland", sizeof(wlr_output->make));  	strncpy(wlr_output->model, "wayland", sizeof(wlr_output->model));  	snprintf(wlr_output->name, sizeof(wlr_output->name), "WL-%d", diff --git a/backend/x11/backend.c b/backend/x11/backend.c index c116e78e..0d45cfb5 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -117,7 +117,8 @@ static bool handle_x11_event(struct wlr_x11_backend *x11, xcb_generic_event_t *e  	case XCB_CONFIGURE_NOTIFY: {  		xcb_configure_notify_event_t *ev = (xcb_configure_notify_event_t *)event; -		wlr_output_update_size(&output->wlr_output, ev->width, ev->height); +		wlr_output_update_custom_mode(&output->wlr_output, ev->width, +			ev->height, 0);  		// Move the pointer to its new location  		xcb_query_pointer_cookie_t cookie =  | 
