diff options
| author | emersion <contact@emersion.fr> | 2018-03-24 18:30:28 -0400 | 
|---|---|---|
| committer | emersion <contact@emersion.fr> | 2018-03-24 23:48:32 -0400 | 
| commit | c63d94483b1e52817ca01ca82a867a78ebd39fa6 (patch) | |
| tree | 46ec0a24a43aeff6513ca7a8a8ec25eb0c70e8e7 /backend/drm/drm.c | |
| parent | 80d3561d325335e92b196f7cb5797eea9d71d17d (diff) | |
| download | wlroots-c63d94483b1e52817ca01ca82a867a78ebd39fa6.tar.xz | |
Redesign wlr_texture
- Textures are now immutable (apart from those created from raw
  pixels), no more invalid textures
- Move all wl_drm stuff in wlr_renderer
- Most of wlr_texture fields are now private
- Remove some duplicated DMA-BUF code in the DRM backend
- Add more assertions
- Stride is now always given as bytes rather than pixels
- Drop wl_shm functions
Fun fact: this patch has been written 10,000 meters up in the air.
Diffstat (limited to 'backend/drm/drm.c')
| -rw-r--r-- | backend/drm/drm.c | 23 | 
1 files changed, 10 insertions, 13 deletions
| diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 524e80bb..94bfbc96 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -181,9 +181,6 @@ void wlr_drm_resources_free(struct wlr_drm_backend *drm) {  		if (plane->cursor_bo) {  			gbm_bo_destroy(plane->cursor_bo);  		} -		if (plane->wlr_tex) { -			wlr_texture_destroy(plane->wlr_tex); -		}  	}  	free(drm->crtcs); @@ -586,12 +583,6 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,  			wlr_output_transform_invert(output->transform);  		wlr_matrix_projection(plane->matrix, plane->surf.width,  			plane->surf.height, transform); - -		plane->wlr_tex = -			wlr_render_texture_create(plane->surf.renderer->wlr_rend); -		if (!plane->wlr_tex) { -			return false; -		}  	}  	struct wlr_box hotspot = { .x = hotspot_x, .y = hotspot_y }; @@ -637,13 +628,18 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,  		wlr_drm_surface_make_current(&plane->surf, NULL); -		wlr_texture_upload_pixels(plane->wlr_tex, WL_SHM_FORMAT_ARGB8888, -			stride, width, height, buf); -  		struct wlr_renderer *rend = plane->surf.renderer->wlr_rend; + +		struct wlr_texture *texture = wlr_texture_from_pixels(rend, +			WL_SHM_FORMAT_ARGB8888, stride, width, height, buf); +		if (texture == NULL) { +			wlr_log(L_ERROR, "Unable to create texture"); +			return false; +		} +  		wlr_renderer_begin(rend, plane->surf.width, plane->surf.height);  		wlr_renderer_clear(rend, (float[]){ 0.0, 0.0, 0.0, 0.0 }); -		wlr_render_texture(rend, plane->wlr_tex, plane->matrix, 0, 0, 1.0f); +		wlr_render_texture(rend, texture, plane->matrix, 0, 0, 1.0f);  		wlr_renderer_end(rend);  		wlr_renderer_read_pixels(rend, WL_SHM_FORMAT_ARGB8888, bo_stride, @@ -651,6 +647,7 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,  		wlr_drm_surface_swap_buffers(&plane->surf, NULL); +		wlr_texture_destroy(texture);  		gbm_bo_unmap(plane->cursor_bo, bo_data);  	} | 
