Skip to content

Commit b0d09f5

Browse files
committed
improvements, fixes
- fix DRM prop id initialization again - enhance documentation for `drm_plane->supported_modified_formats` - `drmdev_new_from_fd ==> drmdev_new_from_interface_fd` and add `void *fd_metadata` arg - open drmdev using interface in `drmdev_new_from_path` - change `render_surface.size` to `struct vec2i` from `struct vec2f` - allow specifying allowed drm modifiers when creating `egl_gbm_render_surface` - whitespace fixes
1 parent 526799b commit b0d09f5

13 files changed

+143
-59
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ cmake_policy(SET CMP0069 NEW)
404404
include(CheckIPOSupported)
405405
check_ipo_supported(RESULT ipo_support_result OUTPUT ipo_support_output)
406406
if (ipo_support_result)
407-
set_property(TARGET flutterpi_module PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
407+
set_property(TARGET flutterpi_module PROPERTY INTERPROCEDURAL_OPTIMIZATION $<IF:$<CONFIG:Debug>,FALSE,TRUE>)
408408
else()
409409
message(WARNING "IPO/LTO is not supported: ${ipo_support_output}")
410410
endif()

include/egl_gbm_render_surface.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,20 @@ ATTR_PURE struct egl_gbm_render_surface *__checked_cast_egl_gbm_render_surface(v
2727
# define CAST_EGL_GBM_RENDER_SURFACE(ptr) CAST_EGL_GBM_RENDER_SURFACE_UNCHECKED(ptr)
2828
#endif
2929

30-
ATTR_MALLOC struct egl_gbm_render_surface *egl_gbm_render_surface_new_with_egl_config(
30+
struct egl_gbm_render_surface *egl_gbm_render_surface_new_with_egl_config(
3131
struct tracer *tracer,
32-
struct vec2f size,
32+
struct vec2i size,
3333
struct gbm_device *device,
3434
struct gl_renderer *renderer,
3535
enum pixfmt pixel_format,
36-
EGLConfig egl_config
36+
EGLConfig egl_config,
37+
const uint64_t *allowed_modifiers,
38+
size_t n_allowed_modifiers
3739
);
3840

39-
ATTR_MALLOC struct egl_gbm_render_surface *egl_gbm_render_surface_new(
41+
struct egl_gbm_render_surface *egl_gbm_render_surface_new(
4042
struct tracer *tracer,
41-
struct vec2f size,
43+
struct vec2i size,
4244
struct gbm_device *device,
4345
struct gl_renderer *renderer,
4446
enum pixfmt pixel_format

include/modesetting.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ struct drm_plane {
388388
/// A pair of pixel format / modifier that is definitely supported.
389389
/// DRM_FORMAT_MOD_LINEAR is supported for most (but not all pixel formats).
390390
/// There are some format & modifier pairs that may be faster to scanout by the GPU.
391+
/// Might be NULL if the plane didn't specify an IN_FORMATS property.
391392
struct modified_format *supported_modified_formats;
392393

393394
/// Whether this plane has a mutable alpha property we can set.
@@ -419,7 +420,7 @@ struct drmdev_interface {
419420
void (*close)(int fd, void *fd_metadata, void *userdata);
420421
};
421422

422-
struct drmdev *drmdev_new_from_fd(int fd, const struct drmdev_interface *interface, void *userdata);
423+
struct drmdev *drmdev_new_from_interface_fd(int fd, void *fd_metadata, const struct drmdev_interface *interface, void *userdata);
423424

424425
struct drmdev *drmdev_new_from_path(const char *path, const struct drmdev_interface *interface, void *userdata);
425426

include/render_surface_private.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ struct render_surface {
2121
struct surface surface;
2222

2323
uuid_t uuid;
24-
struct vec2f size;
24+
struct vec2i size;
2525
int (*fill)(struct render_surface *surface, FlutterBackingStore *fl_store);
2626
int (*queue_present)(struct render_surface *surface, const FlutterBackingStore *fl_store);
2727
};
2828

29-
int render_surface_init(struct render_surface *surface, struct tracer *tracer, struct vec2f size);
29+
int render_surface_init(struct render_surface *surface, struct tracer *tracer, struct vec2i size);
3030

3131
void render_surface_deinit(struct surface *s);
3232

include/vk_gbm_render_surface.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ ATTR_PURE struct vk_gbm_render_surface *__checked_cast_vk_gbm_render_surface(voi
2828
# define CAST_VK_GBM_RENDER_SURFACE(ptr) CAST_VK_GBM_RENDER_SURFACE_UNCHECKED(ptr)
2929
#endif
3030

31-
ATTR_MALLOC struct vk_gbm_render_surface *vk_gbm_render_surface_new(
31+
struct vk_gbm_render_surface *vk_gbm_render_surface_new(
3232
struct tracer *tracer,
33-
struct vec2f size,
33+
struct vec2i size,
3434
struct gbm_device *device,
3535
struct vk_renderer *renderer,
3636
enum pixfmt pixel_format

include/window.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,6 @@ EGLSurface window_get_egl_surface(struct window *window);
114114
* This only makes sense if there's a single UI (engine) layer. If there's multiple ones, lifetimes become weird.
115115
*
116116
*/
117-
struct render_surface *window_get_render_surface(struct window *window, struct vec2f size);
117+
struct render_surface *window_get_render_surface(struct window *window, struct vec2i size);
118118

119119
#endif // _FLUTTERPI_INCLUDE_WINDOW_H

src/compositor_ng.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ static bool on_flutter_create_backing_store(
487487
compositor = userdata;
488488

489489
// this will not increase the refcount on the surface.
490-
s = window_get_render_surface(compositor->main_window, VEC2F(config->size.width, config->size.height));
490+
s = window_get_render_surface(compositor->main_window, VEC2I((int) config->size.width, (int) config->size.height));
491491
if (s == NULL) {
492492
LOG_ERROR("Couldn't create render surface for flutter to render into.\n");
493493
return false;

src/egl_gbm_render_surface.c

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,16 @@ static int egl_gbm_render_surface_present_fbdev(struct surface *s, const struct
102102
static int egl_gbm_render_surface_fill(struct render_surface *s, FlutterBackingStore *fl_store);
103103
static int egl_gbm_render_surface_queue_present(struct render_surface *s, const FlutterBackingStore *fl_store);
104104

105-
int egl_gbm_render_surface_init(
105+
static int egl_gbm_render_surface_init(
106106
struct egl_gbm_render_surface *s,
107107
struct tracer *tracer,
108-
struct vec2f size,
108+
struct vec2i size,
109109
struct gbm_device *gbm_device,
110110
struct gl_renderer *renderer,
111111
enum pixfmt pixel_format,
112-
EGLConfig egl_config
112+
EGLConfig egl_config,
113+
const uint64_t *allowed_modifiers,
114+
size_t n_allowed_modifiers
113115
) {
114116
struct gbm_surface *gbm_surface;
115117
EGLDisplay egl_display;
@@ -135,19 +137,35 @@ int egl_gbm_render_surface_init(
135137
DEBUG_ASSERT_EQUALS_MSG(value, get_pixfmt_info(pixel_format)->gbm_format, "EGL framebuffer config pixel format doesn't match the argument pixel format.");
136138
}
137139
#endif
138-
/// TODO: Think about allowing different tilings / modifiers here
139-
gbm_surface = gbm_surface_create(
140-
gbm_device,
141-
(uint32_t) size.x, (uint32_t) size.y,
142-
get_pixfmt_info(pixel_format)->gbm_format,
143-
GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT
144-
);
145-
if (gbm_surface == NULL) {
146-
ok = errno;
147-
LOG_ERROR("Couldn't create GBM surface for rendering. gbm_surface_create_with_modifiers: %s\n", strerror(ok));
148-
return ok;
140+
141+
if (allowed_modifiers != NULL) {
142+
gbm_surface = gbm_surface_create_with_modifiers(
143+
gbm_device,
144+
size.x, size.y,
145+
get_pixfmt_info(pixel_format)->gbm_format,
146+
allowed_modifiers,
147+
n_allowed_modifiers
148+
);
149+
if (gbm_surface == NULL) {
150+
ok = errno;
151+
LOG_ERROR("Couldn't create GBM surface for rendering. gbm_surface_create_with_modifiers: %s\n", strerror(ok));
152+
return ok;
153+
}
154+
} else {
155+
gbm_surface = gbm_surface_create(
156+
gbm_device,
157+
size.x, size.y,
158+
get_pixfmt_info(pixel_format)->gbm_format,
159+
GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT
160+
);
161+
if (gbm_surface == NULL) {
162+
ok = errno;
163+
LOG_ERROR("Couldn't create GBM surface for rendering. gbm_surface_create_with_modifiers: %s\n", strerror(ok));
164+
return ok;
165+
}
149166
}
150167

168+
/// TODO: Think about allowing different tilings / modifiers here
151169
if (egl_config == EGL_NO_CONFIG_KHR) {
152170
// choose a config
153171
egl_config = gl_renderer_choose_config_direct(renderer, pixel_format);
@@ -234,13 +252,15 @@ int egl_gbm_render_surface_init(
234252
* @param egl_config The EGLConfig used for creating the EGLSurface.
235253
* @return struct egl_gbm_render_surface*
236254
*/
237-
ATTR_MALLOC struct egl_gbm_render_surface *egl_gbm_render_surface_new_with_egl_config(
255+
struct egl_gbm_render_surface *egl_gbm_render_surface_new_with_egl_config(
238256
struct tracer *tracer,
239-
struct vec2f size,
257+
struct vec2i size,
240258
struct gbm_device *device,
241259
struct gl_renderer *renderer,
242260
enum pixfmt pixel_format,
243-
EGLConfig egl_config
261+
EGLConfig egl_config,
262+
const uint64_t *allowed_modifiers,
263+
size_t n_allowed_modifiers
244264
) {
245265
struct egl_gbm_render_surface *surface;
246266
int ok;
@@ -250,7 +270,7 @@ ATTR_MALLOC struct egl_gbm_render_surface *egl_gbm_render_surface_new_with_egl_c
250270
goto fail_return_null;
251271
}
252272

253-
ok = egl_gbm_render_surface_init(surface, tracer, size, device, renderer, pixel_format, egl_config);
273+
ok = egl_gbm_render_surface_init(surface, tracer, size, device, renderer, pixel_format, egl_config, allowed_modifiers, n_allowed_modifiers);
254274
if (ok != 0) {
255275
goto fail_free_surface;
256276
}
@@ -275,9 +295,9 @@ ATTR_MALLOC struct egl_gbm_render_surface *egl_gbm_render_surface_new_with_egl_c
275295
* @param pixel_format The pixel format to be used by the framebuffers of the surface.
276296
* @return struct egl_gbm_render_surface*
277297
*/
278-
ATTR_MALLOC struct egl_gbm_render_surface *egl_gbm_render_surface_new(
298+
struct egl_gbm_render_surface *egl_gbm_render_surface_new(
279299
struct tracer *tracer,
280-
struct vec2f size,
300+
struct vec2i size,
281301
struct gbm_device *device,
282302
struct gl_renderer *renderer,
283303
enum pixfmt pixel_format
@@ -288,7 +308,9 @@ ATTR_MALLOC struct egl_gbm_render_surface *egl_gbm_render_surface_new(
288308
device,
289309
renderer,
290310
pixel_format,
291-
EGL_NO_CONFIG_KHR
311+
EGL_NO_CONFIG_KHR,
312+
NULL,
313+
0
292314
);
293315
}
294316

src/frame_scheduler.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ void frame_scheduler_destroy(struct frame_scheduler *scheduler) {
5656
free(scheduler);
5757
}
5858

59-
6059
void frame_scheduler_on_fl_vsync_request(struct frame_scheduler *scheduler, intptr_t vsync_baton) {
6160
DEBUG_ASSERT_NOT_NULL(scheduler);
6261
DEBUG_ASSERT(vsync_baton != 0);
@@ -140,4 +139,4 @@ void frame_scheduler_on_scanout(struct frame_scheduler *scheduler, bool has_time
140139

141140
/// TODO: Implement
142141
UNIMPLEMENTED();
143-
}
142+
}

src/modesetting.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -711,11 +711,14 @@ static int fetch_plane(int drm_fd, uint32_t plane_id, struct drm_plane *plane_ou
711711
}
712712

713713
#define CHECK_ASSIGN_PROPERTY_ID(_name_str, _name) \
714-
else if (strncmp(info->name, _name_str, ARRAY_SIZE(info->name)) == 0) { \
714+
if (strncmp(info->name, _name_str, ARRAY_SIZE(info->name)) == 0) { \
715715
ids._name = info->prop_id; \
716-
}
716+
} else
717717

718718
DRM_PLANE_PROPERTIES(CHECK_ASSIGN_PROPERTY_ID)
719+
{
720+
// do nothing
721+
}
719722

720723
#undef CHECK_ASSIGN_PROPERTY_ID
721724

@@ -916,7 +919,7 @@ static int set_drm_client_caps(int fd, bool *supports_atomic_modesetting) {
916919
return 0;
917920
}
918921

919-
struct drmdev *drmdev_new_from_fd(int fd, const struct drmdev_interface *interface, void *userdata) {
922+
struct drmdev *drmdev_new_from_interface_fd(int fd, void *fd_metadata, const struct drmdev_interface *interface, void *userdata) {
920923
struct gbm_device *gbm_device;
921924
struct drmdev *drmdev;
922925
uint64_t cap;
@@ -1010,6 +1013,7 @@ struct drmdev *drmdev_new_from_fd(int fd, const struct drmdev_interface *interfa
10101013
drmdev->event_fd = event_fd;
10111014
memset(drmdev->per_crtc_state, 0, sizeof(drmdev->per_crtc_state));
10121015
drmdev->master_fd = master_fd;
1016+
drmdev->master_fd_metadata = fd_metadata;
10131017
drmdev->interface = *interface;
10141018
drmdev->userdata = userdata;
10151019
return drmdev;
@@ -1049,18 +1053,19 @@ struct drmdev *drmdev_new_from_fd(int fd, const struct drmdev_interface *interfa
10491053

10501054
struct drmdev *drmdev_new_from_path(const char *path, const struct drmdev_interface *interface, void *userdata) {
10511055
struct drmdev *drmdev;
1056+
void *fd_metadata;
10521057
int fd;
10531058

10541059
DEBUG_ASSERT_NOT_NULL(path);
10551060
DEBUG_ASSERT_NOT_NULL(interface);
10561061

1057-
fd = open(path, O_RDWR);
1062+
fd = interface->open(path, O_RDWR, &fd_metadata, userdata);
10581063
if (fd < 0) {
1059-
LOG_ERROR("Could not open DRM device. open: %s\n", strerror(errno));
1064+
LOG_ERROR("Could not open DRM device. interface->open: %s\n", strerror(errno));
10601065
return NULL;
10611066
}
10621067

1063-
drmdev = drmdev_new_from_fd(fd, interface, userdata);
1068+
drmdev = drmdev_new_from_interface_fd(fd, fd_metadata, interface, userdata);
10641069
if (drmdev == NULL) {
10651070
close(fd);
10661071
return NULL;
@@ -1071,7 +1076,8 @@ struct drmdev *drmdev_new_from_path(const char *path, const struct drmdev_interf
10711076

10721077
void drmdev_destroy(struct drmdev *drmdev) {
10731078
DEBUG_ASSERT(refcount_is_zero(&drmdev->n_refs));
1074-
1079+
1080+
drmdev->interface.close(drmdev->master_fd, drmdev->master_fd_metadata, drmdev->userdata);
10751081
close(drmdev->event_fd);
10761082
gbm_device_destroy(drmdev->gbm_device);
10771083
free_planes(drmdev->planes, drmdev->n_planes);

src/render_surface.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static const uuid_t uuid = CONST_UUID(0x78, 0x70, 0x45, 0x13, 0xa8, 0xf3, 0x43,
2828

2929
void render_surface_deinit(struct surface *s);
3030

31-
int render_surface_init(struct render_surface *surface, struct tracer *tracer, struct vec2f size) {
31+
int render_surface_init(struct render_surface *surface, struct tracer *tracer, struct vec2i size) {
3232
int ok;
3333

3434
ok = surface_init(&surface->surface, tracer);

src/vk_gbm_render_surface.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ static void fb_deinit(struct fb *fb, VkDevice device) {
444444
int vk_gbm_render_surface_init(
445445
struct vk_gbm_render_surface *surface,
446446
struct tracer *tracer,
447-
struct vec2f size,
447+
struct vec2i size,
448448
struct gbm_device *gbm_device,
449449
struct vk_renderer *renderer,
450450
enum pixfmt pixel_format
@@ -503,9 +503,9 @@ int vk_gbm_render_surface_init(
503503
return EIO;
504504
}
505505

506-
ATTR_MALLOC struct vk_gbm_render_surface *vk_gbm_render_surface_new(
506+
struct vk_gbm_render_surface *vk_gbm_render_surface_new(
507507
struct tracer *tracer,
508-
struct vec2f size,
508+
struct vec2i size,
509509
struct gbm_device *device,
510510
struct vk_renderer *renderer,
511511
enum pixfmt pixel_format

0 commit comments

Comments
 (0)