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