mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	output: fallback to XRGB in output_pick_format
This will be necessary for the primary buffer.
This commit is contained in:
		
							parent
							
								
									e5063ef3a3
								
							
						
					
					
						commit
						d1c931cbe8
					
				
					 1 changed files with 31 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -1178,32 +1178,41 @@ static struct wlr_drm_format *output_pick_format(struct wlr_output *output,
 | 
			
		|||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	uint32_t fmt = DRM_FORMAT_ARGB8888;
 | 
			
		||||
	struct wlr_drm_format *format = NULL;
 | 
			
		||||
	const uint32_t candidates[] = { DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888 };
 | 
			
		||||
	for (size_t i = 0; i < sizeof(candidates) / sizeof(candidates[0]); i++) {
 | 
			
		||||
		uint32_t fmt = candidates[i];
 | 
			
		||||
 | 
			
		||||
	const struct wlr_drm_format *render_format =
 | 
			
		||||
		wlr_drm_format_set_get(render_formats, fmt);
 | 
			
		||||
	if (render_format == NULL) {
 | 
			
		||||
		wlr_log(WLR_DEBUG, "Renderer doesn't support format 0x%"PRIX32, fmt);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const struct wlr_drm_format *display_format;
 | 
			
		||||
	if (display_formats != NULL) {
 | 
			
		||||
		display_format = wlr_drm_format_set_get(display_formats, fmt);
 | 
			
		||||
		if (display_format == NULL) {
 | 
			
		||||
			wlr_log(WLR_DEBUG, "Output doesn't support format 0x%"PRIX32, fmt);
 | 
			
		||||
			return NULL;
 | 
			
		||||
		const struct wlr_drm_format *render_format =
 | 
			
		||||
			wlr_drm_format_set_get(render_formats, fmt);
 | 
			
		||||
		if (render_format == NULL) {
 | 
			
		||||
			wlr_log(WLR_DEBUG, "Renderer doesn't support format 0x%"PRIX32, fmt);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		// The output can display any format
 | 
			
		||||
		display_format = render_format;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	struct wlr_drm_format *format =
 | 
			
		||||
		wlr_drm_format_intersect(display_format, render_format);
 | 
			
		||||
		if (display_formats != NULL) {
 | 
			
		||||
			const struct wlr_drm_format *display_format =
 | 
			
		||||
				wlr_drm_format_set_get(display_formats, fmt);
 | 
			
		||||
			if (display_format == NULL) {
 | 
			
		||||
				wlr_log(WLR_DEBUG, "Output doesn't support format 0x%"PRIX32, fmt);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			format = wlr_drm_format_intersect(display_format, render_format);
 | 
			
		||||
		} else {
 | 
			
		||||
			// The output can display any format
 | 
			
		||||
			format = wlr_drm_format_dup(render_format);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (format == NULL) {
 | 
			
		||||
			wlr_log(WLR_DEBUG, "Failed to intersect display and render "
 | 
			
		||||
				"modifiers for format 0x%"PRIX32, fmt);
 | 
			
		||||
		} else {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (format == NULL) {
 | 
			
		||||
		wlr_log(WLR_DEBUG, "Failed to intersect display and render "
 | 
			
		||||
			"modifiers for format 0x%"PRIX32, fmt);
 | 
			
		||||
		wlr_log(WLR_ERROR, "Failed to choose a format for output '%s'",
 | 
			
		||||
			output->name);
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue