summarylogtreecommitdiffstats
path: root/labwc-format-check.patch
blob: ce3ffdf9eacf70b631bbed23692ce6900f6caaa8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
diff --git a/src/output.c b/src/output.c
index 2eab8ec3..25b5d824 100644
--- a/src/output.c
+++ b/src/output.c
@@ -85,12 +85,16 @@ uint32_t output_formats_10bit[] = {
 };
 
 static bool
-output_set_render_format(struct output *output, uint32_t candidates[], size_t count)
+output_set_render_format(struct output *output, uint32_t candidates[], size_t count,
+	const struct wlr_drm_format_set *formats)
 {
 	for (size_t i = 0; i < count; i++) {
-		wlr_output_state_set_render_format(&output->pending, candidates[i]);
-		if (wlr_output_test_state(output->wlr_output, &output->pending)) {
-			return true;
+		const uint32_t format = candidates[i];
+		if (wlr_drm_format_set_get(formats, format)) {
+			wlr_output_state_set_render_format(&output->pending, format);
+			if (wlr_output_test_state(output->wlr_output, &output->pending)) {
+				return true;
+			}
 		}
 	}
 	return false;
@@ -149,6 +153,7 @@ output_state_setup_hdr(struct output *output, bool silent)
 {
 	uint32_t render_format = output->wlr_output->render_format;
 	const char *unsupported_reason = NULL;
+	const struct wlr_drm_format_set *formats = NULL;
 	bool hdr_supported = output_supports_hdr(output->wlr_output,
 		&unsupported_reason);
 	bool hdr_succeeded = false;
@@ -173,15 +178,17 @@ output_state_setup_hdr(struct output *output, bool silent)
 		 */
 		hdr_succeeded = true;
 	} else if (render_bit_depth == LAB_RENDER_BIT_DEPTH_10) {
+		formats = wlr_output_get_primary_formats(output->wlr_output,
+			WLR_BUFFER_CAP_DMABUF);
 		hdr_succeeded = output_set_render_format(output, output_formats_10bit,
-			ARRAY_SIZE(output_formats_10bit));
+			ARRAY_SIZE(output_formats_10bit), formats);
 		if (!hdr_succeeded) {
 			if (!silent) {
 				wlr_log(WLR_INFO, "No 10 bit color formats"
 					" supported, HDR disabled.");
 			}
 			if (!output_set_render_format(output, output_formats_8bit,
-					ARRAY_SIZE(output_formats_8bit))) {
+					ARRAY_SIZE(output_formats_8bit), formats)) {
 				if (!silent) {
 					wlr_log(WLR_ERROR, "No 8 bit color formats"
 						" supported either!");
@@ -189,8 +196,10 @@ output_state_setup_hdr(struct output *output, bool silent)
 			}
 		}
 	} else {
+		formats = wlr_output_get_primary_formats(output->wlr_output,
+			WLR_BUFFER_CAP_DMABUF);
 		if (!output_set_render_format(output, output_formats_8bit,
-				ARRAY_SIZE(output_formats_8bit)) && !silent) {
+				ARRAY_SIZE(output_formats_8bit), formats) && !silent) {
 			wlr_log(WLR_ERROR, "No 8 bit color formats supported!");
 		}
 	}