mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									80d3561d32
								
							
						
					
					
						commit
						c63d94483b
					
				
					 24 changed files with 577 additions and 647 deletions
				
			
		| 
						 | 
				
			
			@ -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);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -178,47 +178,33 @@ static void free_eglimage(struct gbm_bo *bo, void *data) {
 | 
			
		|||
static struct wlr_texture *get_tex_for_bo(struct wlr_drm_renderer *renderer,
 | 
			
		||||
		struct gbm_bo *bo) {
 | 
			
		||||
	struct tex *tex = gbm_bo_get_user_data(bo);
 | 
			
		||||
	if (tex) {
 | 
			
		||||
	if (tex != NULL) {
 | 
			
		||||
		return tex->tex;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: use wlr_texture_upload_dmabuf instead
 | 
			
		||||
 | 
			
		||||
	tex = malloc(sizeof(*tex));
 | 
			
		||||
	if (!tex) {
 | 
			
		||||
		wlr_log_errno(L_ERROR, "Allocation failed");
 | 
			
		||||
	tex = calloc(1, sizeof(struct tex));
 | 
			
		||||
	if (tex == NULL) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tex->egl = &renderer->egl;
 | 
			
		||||
 | 
			
		||||
	int dmabuf_fd = gbm_bo_get_fd(bo);
 | 
			
		||||
	uint32_t width = gbm_bo_get_width(bo);
 | 
			
		||||
	uint32_t height = gbm_bo_get_height(bo);
 | 
			
		||||
 | 
			
		||||
	EGLint attribs[] = {
 | 
			
		||||
		EGL_WIDTH, width,
 | 
			
		||||
		EGL_HEIGHT, height,
 | 
			
		||||
		EGL_LINUX_DRM_FOURCC_EXT, gbm_bo_get_format(bo),
 | 
			
		||||
		EGL_DMA_BUF_PLANE0_FD_EXT, dmabuf_fd,
 | 
			
		||||
		EGL_DMA_BUF_PLANE0_OFFSET_EXT, gbm_bo_get_offset(bo, 0),
 | 
			
		||||
		EGL_DMA_BUF_PLANE0_PITCH_EXT, gbm_bo_get_stride_for_plane(bo, 0),
 | 
			
		||||
		EGL_IMAGE_PRESERVED_KHR, EGL_FALSE,
 | 
			
		||||
		EGL_NONE,
 | 
			
		||||
	struct wlr_dmabuf_buffer_attribs attribs = {
 | 
			
		||||
		.n_planes = 1,
 | 
			
		||||
		.width = gbm_bo_get_width(bo),
 | 
			
		||||
		.height = gbm_bo_get_height(bo),
 | 
			
		||||
		.format = gbm_bo_get_format(bo),
 | 
			
		||||
	};
 | 
			
		||||
	attribs.offset[0] = 0;
 | 
			
		||||
	attribs.stride[0] = gbm_bo_get_stride_for_plane(bo, 0);
 | 
			
		||||
	attribs.modifier[0] = 0;
 | 
			
		||||
	attribs.fd[0] = gbm_bo_get_fd(bo);
 | 
			
		||||
 | 
			
		||||
	tex->img = eglCreateImageKHR(renderer->egl.display, EGL_NO_CONTEXT,
 | 
			
		||||
		EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
 | 
			
		||||
	if (!tex->img) {
 | 
			
		||||
		wlr_log(L_ERROR, "Failed to create EGL image");
 | 
			
		||||
		abort();
 | 
			
		||||
	tex->tex = wlr_texture_from_dmabuf(renderer->wlr_rend, &attribs);
 | 
			
		||||
	if (tex->tex == NULL) {
 | 
			
		||||
		free(tex);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tex->tex = wlr_render_texture_create(renderer->wlr_rend);
 | 
			
		||||
	wlr_texture_upload_eglimage(tex->tex, tex->img, width, height);
 | 
			
		||||
 | 
			
		||||
	gbm_bo_set_user_data(bo, tex, free_eglimage);
 | 
			
		||||
 | 
			
		||||
	return tex->tex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue