diff options
| author | Simon Ser <contact@emersion.fr> | 2019-04-23 19:26:21 +0300 | 
|---|---|---|
| committer | Drew DeVault <sir@cmpwn.com> | 2019-04-23 14:34:30 -0600 | 
| commit | 9a0f8a194caa35173a7f590208a64a5526290935 (patch) | |
| tree | 2acebd17a1de27d3d616b2bd13a65301cff9fca5 /backend/rdp | |
| parent | 23e37e7b1d8004fb5361c147239d2e628efbd5e8 (diff) | |
| download | wlroots-9a0f8a194caa35173a7f590208a64a5526290935.tar.xz | |
output: refactor backend API
This updates the backend part of the output API. This is mostly renaming:
make_current becomes attach_render and swap_buffers becomes commit.
This also fixes the RDP backend to support NULL damage.
Diffstat (limited to 'backend/rdp')
| -rw-r--r-- | backend/rdp/output.c | 51 | 
1 files changed, 34 insertions, 17 deletions
| diff --git a/backend/rdp/output.c b/backend/rdp/output.c index 4d5d259d..5e20dda4 100644 --- a/backend/rdp/output.c +++ b/backend/rdp/output.c @@ -69,7 +69,8 @@ static void output_transform(struct wlr_output *wlr_output,  	output->wlr_output.transform = transform;  } -static bool output_make_current(struct wlr_output *wlr_output, int *buffer_age) { +static bool output_attach_render(struct wlr_output *wlr_output, +		int *buffer_age) {  	struct wlr_rdp_output *output =  		rdp_output_from_output(wlr_output);  	return wlr_egl_make_current(&output->backend->egl, output->egl_surface, @@ -169,31 +170,39 @@ static bool nsc_swap_buffers(  	return true;  } -static bool output_swap_buffers( -		struct wlr_output *wlr_output, pixman_region32_t *damage) { -	if (!pixman_region32_not_empty(damage)) { -		return true; -	} - +static bool output_commit(struct wlr_output *wlr_output) {  	struct wlr_rdp_output *output =  		rdp_output_from_output(wlr_output); +	bool ret = false; -	// Update shadow buffer +	pixman_region32_t output_region; +	pixman_region32_init(&output_region); +	pixman_region32_union_rect(&output_region, &output_region, +		0, 0, wlr_output->width, wlr_output->height); + +	pixman_region32_t *damage = &output_region; +	if (wlr_output->pending.committed & WLR_OUTPUT_STATE_DAMAGE) { +		damage = &wlr_output->pending.damage; +	} + +	int x = damage->extents.x1; +	int y = damage->extents.y1;  	int width = damage->extents.x2 - damage->extents.x1;  	int height = damage->extents.y2 - damage->extents.y1; + +	// Update shadow buffer  	struct wlr_renderer *renderer =  		wlr_backend_get_renderer(&output->backend->backend);  	// TODO performance: add support for flags -	if (!wlr_renderer_read_pixels(renderer, WL_SHM_FORMAT_XRGB8888, -				NULL, pixman_image_get_stride(output->shadow_surface), -				width, height, damage->extents.x1, damage->extents.y1, -				damage->extents.x1, damage->extents.y1, -				pixman_image_get_data(output->shadow_surface))) { -		return false; +	ret = wlr_renderer_read_pixels(renderer, WL_SHM_FORMAT_XRGB8888, +		NULL, pixman_image_get_stride(output->shadow_surface), +		width, height, x, y, x, y, +		pixman_image_get_data(output->shadow_surface)); +	if (!ret) { +		goto out;  	}  	// Send along to clients -	bool ret = false;  	rdpSettings *settings = output->context->peer->settings;  	if (settings->RemoteFxCodec) {  		ret = rfx_swap_buffers(output, damage); @@ -202,8 +211,16 @@ static bool output_swap_buffers(  	} else {  		// This would perform like ass so why bother  		wlr_log(WLR_ERROR, "Raw updates are not supported; use rfx or nsc"); +		ret = false;  	} +	if (!ret) { +		goto out; +	} +  	wlr_output_send_present(wlr_output, NULL); + +out: +	pixman_region32_fini(&output_region);  	return ret;  } @@ -224,8 +241,8 @@ static const struct wlr_output_impl output_impl = {  	.set_custom_mode = output_set_custom_mode,  	.transform = output_transform,  	.destroy = output_destroy, -	.make_current = output_make_current, -	.swap_buffers = output_swap_buffers, +	.attach_render = output_attach_render, +	.commit = output_commit,  };  bool wlr_output_is_rdp(struct wlr_output *wlr_output) { | 
