commit 1c43452

shrub  ·  2026-08-05 14:14:52 +0000 UTC
parent 58f3b44
make decor work under intel
1 files changed,  +22, -7
+22, -7
 1@@ -1,8 +1,8 @@
 2 #include "decor.h"
 3 
 4 #include "compositor.h"
 5+#include "drm.h"
 6 #include "internal.h"
 7-#include "shm.h"
 8 #include "swc.h"
 9 #include "util.h"
10 #include "window.h"
11@@ -187,14 +187,18 @@ decor_parts_equal(struct compositor_view *view, const struct swc_decor_parts *pa
12 static bool
13 copy_decor_part(struct decor_part_buffer *dst, const struct swc_decor_part *src)
14 {
15-	union wld_object object;
16-	size_t size;
17+	size_t row_size, size;
18 
19 	if (decor_part_is_empty(src)) {
20 		memset(dst, 0, sizeof(*dst));
21 		return true;
22 	}
23 
24+	row_size = (size_t)src->width * 4;
25+	if (src->stride < row_size ||
26+	    (src->height && src->stride > SIZE_MAX / src->height)) {
27+		return false;
28+	}
29 	size = (size_t)src->stride * src->height;
30 	dst->data = malloc(size);
31 	if (!dst->data) {
32@@ -205,16 +209,27 @@ copy_decor_part(struct decor_part_buffer *dst, const struct swc_decor_part *src)
33 	dst->width = src->width;
34 	dst->height = src->height;
35 	dst->stride = src->stride;
36-	object.ptr = dst->data;
37-	dst->buffer = wld_import_buffer(swc.shm->context, WLD_OBJECT_DATA, object,
38-	                                src->width, src->height,
39-	                                WLD_FORMAT_ARGB8888, src->stride);
40+	/* DRM renderers only allow read support for their native buffers not pixman/shmbuffers */
41+	dst->buffer = wld_create_buffer(swc.drm->context, src->width, src->height,
42+	                                WLD_FORMAT_ARGB8888, WLD_FLAG_MAP);
43 	if (!dst->buffer) {
44 		free(dst->data);
45 		memset(dst, 0, sizeof(*dst));
46 		return false;
47 	}
48 
49+	if (dst->buffer->pitch < row_size || !wld_map(dst->buffer)) {
50+		wld_buffer_unreference(dst->buffer);
51+		free(dst->data);
52+		memset(dst, 0, sizeof(*dst));
53+		return false;
54+	}
55+	for (uint32_t y = 0; y < src->height; ++y) {
56+		memcpy((uint8_t *)dst->buffer->map + (size_t)y * dst->buffer->pitch,
57+		       (uint8_t *)dst->data + (size_t)y * src->stride, row_size);
58+	}
59+	wld_unmap(dst->buffer);
60+
61 	return true;
62 }
63