Skip to content

Commit c744ddc

Browse files
committed
drm: Convert settings into CogDrmPlatform properties
Turn the settings for atomic mode setting and the device scale factor into properties of the CogDrmPlatform class. This allows using cog_apply_properties_from_key_file() to automatically apply the settings from the configuration file. In the future it may be possible to also pass properties when creating an object with cog_platform_new(), and/or via the "params" argument of cog_platform_setup(), and always using the same mechanism (object properties) regardless of where the values come from.
1 parent 50ca060 commit c744ddc

File tree

1 file changed

+76
-55
lines changed

1 file changed

+76
-55
lines changed

platform/drm/cog-platform-drm.c

Lines changed: 76 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,16 @@ struct _CogDrmPlatform {
8181
CogGLRendererRotation rotation;
8282
GList *rotatable_input_devices;
8383
bool use_gles;
84+
gboolean atomic_mode_setting;
85+
float device_scale_factor;
8486
};
8587

8688
enum {
8789
PROP_0,
8890
PROP_ROTATION,
8991
PROP_RENDERER,
92+
PROP_ATOMIC_MODE_SETTING,
93+
PROP_DEVICE_SCALE_FACTOR,
9094
N_PROPERTIES,
9195
};
9296

@@ -128,7 +132,6 @@ static struct {
128132
uint32_t width;
129133
uint32_t height;
130134
uint32_t refresh;
131-
double device_scale;
132135

133136
bool atomic_modesetting;
134137
bool addfb2_modifiers;
@@ -158,8 +161,6 @@ static struct {
158161
.width = 0,
159162
.height = 0,
160163
.refresh = 0,
161-
.device_scale = 1.0,
162-
.atomic_modesetting = true,
163164
.mode_set = false,
164165
};
165166

@@ -239,43 +240,11 @@ static struct {
239240
static void
240241
init_config(CogDrmPlatform *self, CogShell *shell, const char *params_string)
241242
{
242-
drm_data.device_scale = cog_shell_get_device_scale_factor (shell);
243-
g_debug ("init_config: overriding device_scale value, using %.2f from shell",
244-
drm_data.device_scale);
245-
246-
GKeyFile *key_file = cog_shell_get_config_file (shell);
247-
243+
GKeyFile *key_file = cog_shell_get_config_file(shell);
248244
if (key_file) {
249-
{
250-
g_autoptr(GError) lookup_error = NULL;
251-
252-
gboolean value = g_key_file_get_boolean(key_file, "drm", "disable-atomic-modesetting", &lookup_error);
253-
if (!lookup_error) {
254-
drm_data.atomic_modesetting = !value;
255-
g_debug("init_config: atomic modesetting reconfigured to value '%s'",
256-
drm_data.atomic_modesetting ? "true" : "false");
257-
}
258-
}
259-
260-
{
261-
g_autoptr(GError) lookup_error = NULL;
262-
263-
gdouble value = g_key_file_get_double(key_file, "drm", "device-scale-factor", &lookup_error);
264-
if (!lookup_error) {
265-
drm_data.device_scale = value;
266-
g_debug("init_config: overriding device_scale value, using %.2f from config", drm_data.device_scale);
267-
}
268-
}
269-
270-
{
271-
g_autofree char *value = g_key_file_get_string(key_file, "drm", "renderer", NULL);
272-
if (g_strcmp0(value, "gles") == 0)
273-
self->use_gles = true;
274-
else if (g_strcmp0(value, "modeset") != 0)
275-
self->use_gles = false;
276-
else if (value)
277-
g_warning("Invalid renderer '%s', using default.", value);
278-
}
245+
g_autoptr(GError) error = NULL;
246+
if (!cog_apply_properties_from_key_file(G_OBJECT(self), key_file, "drm", &error))
247+
g_warning("Reading config file: %s", error->message);
279248
}
280249

281250
if (params_string) {
@@ -310,6 +279,13 @@ init_config(CogDrmPlatform *self, CogShell *shell, const char *params_string)
310279
}
311280
}
312281
}
282+
283+
float device_scale_factor = cog_shell_get_device_scale_factor(shell);
284+
if (device_scale_factor >= 0.2f) {
285+
g_debug("%s: Overriding CogDrmPlatform<%p>.device-scale-factor = <%.2f> from shell", __func__, self,
286+
device_scale_factor);
287+
self->device_scale_factor = device_scale_factor;
288+
}
313289
}
314290

315291
static void
@@ -369,7 +345,7 @@ find_crtc_for_encoder(const drmModeRes *resources, const drmModeEncoder *encoder
369345
}
370346

371347
static gboolean
372-
init_drm(void)
348+
init_drm(CogDrmPlatform *self)
373349
{
374350
drmDevice *devices[64];
375351
memset(devices, 0, sizeof(*devices) * 64);
@@ -416,10 +392,10 @@ init_drm(void)
416392
if (!drm_data.base_resources)
417393
return FALSE;
418394

419-
if (drm_data.atomic_modesetting) {
395+
if (self->atomic_mode_setting) {
420396
int ret = drmSetClientCap (drm_data.fd, DRM_CLIENT_CAP_ATOMIC, 1);
421397
if (ret) {
422-
drm_data.atomic_modesetting = false;
398+
self->atomic_mode_setting = false;
423399
g_debug ("init_drm: atomic mode not usable, falling back to non-atomic mode");
424400
}
425401
}
@@ -964,7 +940,7 @@ input_handle_pointer_smooth_scroll_event(struct libinput_event_pointer *pointer_
964940
}
965941
#else
966942
static void
967-
input_handle_pointer_axis_event(struct libinput_event_pointer *pointer_event)
943+
input_handle_pointer_axis_event(CogDrmPlatform *self, struct libinput_event_pointer *pointer_event)
968944
{
969945
struct wpe_input_axis_2d_event event = {
970946
.base.type = wpe_input_axis_event_type_mask_2d,
@@ -992,8 +968,8 @@ input_handle_pointer_axis_event(struct libinput_event_pointer *pointer_event)
992968
libinput_event_pointer_get_axis_value(pointer_event, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
993969
}
994970

995-
event.x_axis *= drm_data.device_scale;
996-
event.y_axis *= drm_data.device_scale;
971+
event.x_axis *= self->device_scale_factor;
972+
event.y_axis *= self->device_scale_factor;
997973

998974
wpe_view_backend_dispatch_axis_event(wpe_view_data.backend, &event.base);
999975
}
@@ -1073,7 +1049,7 @@ input_handle_device_removed(struct libinput_device *device)
10731049
}
10741050

10751051
static void
1076-
input_process_events (void)
1052+
input_process_events(CogDrmPlatform *self)
10771053
{
10781054
g_assert(input_data.libinput);
10791055

@@ -1190,7 +1166,7 @@ input_process_events (void)
11901166
break;
11911167
#else
11921168
case LIBINPUT_EVENT_POINTER_AXIS:
1193-
input_handle_pointer_axis_event(libinput_event_get_pointer_event(event));
1169+
input_handle_pointer_axis_event(self, libinput_event_get_pointer_event(event));
11941170
break;
11951171
#endif /* LIBINPUT_CHECK_VERSION(1, 19, 0) */
11961172
default:
@@ -1283,6 +1259,7 @@ struct drm_source {
12831259
struct input_source {
12841260
GSource source;
12851261
GPollFD pfd;
1262+
CogDrmPlatform *platform;
12861263
};
12871264

12881265
static gboolean
@@ -1299,7 +1276,7 @@ input_source_dispatch (GSource *base, GSourceFunc callback, gpointer user_data)
12991276
if (source->pfd.revents & (G_IO_ERR | G_IO_HUP))
13001277
return FALSE;
13011278

1302-
input_process_events ();
1279+
input_process_events(source->platform);
13031280
source->pfd.revents = 0;
13041281
return TRUE;
13051282
}
@@ -1356,6 +1333,7 @@ init_glib(CogDrmPlatform *self)
13561333
source->pfd.fd = libinput_get_fd (input_data.libinput);
13571334
source->pfd.events = G_IO_IN | G_IO_ERR | G_IO_HUP;
13581335
source->pfd.revents = 0;
1336+
source->platform = self;
13591337
g_source_add_poll (glib_data.input_source, &source->pfd);
13601338

13611339
g_source_set_name (glib_data.input_source, "cog: input");
@@ -1416,7 +1394,7 @@ cog_drm_platform_setup(CogPlatform *platform, CogShell *shell, const char *param
14161394
return FALSE;
14171395
}
14181396

1419-
if (!init_drm ()) {
1397+
if (!init_drm(self)) {
14201398
g_set_error_literal (error,
14211399
COG_PLATFORM_WPE_ERROR,
14221400
COG_PLATFORM_WPE_ERROR_INIT,
@@ -1453,14 +1431,14 @@ cog_drm_platform_setup(CogPlatform *platform, CogShell *shell, const char *param
14531431
drm_data.crtc.obj_id,
14541432
drm_data.connector.obj_id,
14551433
drm_data.mode,
1456-
drm_data.atomic_modesetting);
1434+
self->atomic_mode_setting);
14571435
} else {
14581436
self->renderer = cog_drm_modeset_renderer_new(gbm_data.device,
14591437
drm_data.plane.obj_id,
14601438
drm_data.crtc.obj_id,
14611439
drm_data.connector.obj_id,
14621440
drm_data.mode,
1463-
drm_data.atomic_modesetting);
1441+
self->atomic_mode_setting);
14641442
}
14651443
if (cog_drm_renderer_supports_rotation(self->renderer, self->rotation)) {
14661444
cog_drm_renderer_set_rotation(self->renderer, self->rotation);
@@ -1523,8 +1501,8 @@ cog_drm_platform_get_view_backend(CogPlatform *platform, WebKitWebView *related_
15231501
{
15241502
CogDrmPlatform *self = COG_DRM_PLATFORM(platform);
15251503
wpe_host_data.exportable = self->renderer->create_exportable(self->renderer,
1526-
drm_data.width / drm_data.device_scale,
1527-
drm_data.height / drm_data.device_scale);
1504+
drm_data.width / self->device_scale_factor,
1505+
drm_data.height / self->device_scale_factor);
15281506
g_assert (wpe_host_data.exportable);
15291507

15301508
wpe_view_data.backend = wpe_view_backend_exportable_fdo_get_view_backend (wpe_host_data.exportable);
@@ -1551,9 +1529,11 @@ set_target_refresh_rate(gpointer user_data)
15511529
static void
15521530
cog_drm_platform_init_web_view(CogPlatform *platform, WebKitWebView *view)
15531531
{
1554-
COG_DRM_PLATFORM(platform)->web_view = COG_VIEW(view);
1532+
CogDrmPlatform *self = COG_DRM_PLATFORM(platform);
15551533

1556-
wpe_view_backend_dispatch_set_device_scale_factor(wpe_view_data.backend, drm_data.device_scale);
1534+
self->web_view = COG_VIEW(view);
1535+
1536+
wpe_view_backend_dispatch_set_device_scale_factor(wpe_view_data.backend, self->device_scale_factor);
15571537

15581538
#if HAVE_REFRESH_RATE_HANDLING
15591539
g_idle_add(G_SOURCE_FUNC(set_target_refresh_rate), &wpe_view_data);
@@ -1592,6 +1572,12 @@ cog_drm_platform_set_property(GObject *object, unsigned prop_id, const GValue *v
15921572
}
15931573
break;
15941574
}
1575+
case PROP_ATOMIC_MODE_SETTING:
1576+
self->atomic_mode_setting = g_value_get_boolean(value);
1577+
break;
1578+
case PROP_DEVICE_SCALE_FACTOR:
1579+
self->device_scale_factor = g_value_get_float(value);
1580+
break;
15951581
default:
15961582
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
15971583
}
@@ -1608,6 +1594,12 @@ cog_drm_platform_get_property(GObject *object, unsigned prop_id, GValue *value,
16081594
case PROP_RENDERER:
16091595
g_value_set_string(value, self->use_gles ? "gles" : "modeset");
16101596
break;
1597+
case PROP_ATOMIC_MODE_SETTING:
1598+
g_value_set_boolean(value, self->atomic_mode_setting);
1599+
break;
1600+
case PROP_DEVICE_SCALE_FACTOR:
1601+
g_value_set_float(value, self->device_scale_factor);
1602+
break;
16111603
default:
16121604
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
16131605
}
@@ -1660,6 +1652,35 @@ cog_drm_platform_class_init(CogDrmPlatformClass *klass)
16601652
"modeset",
16611653
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
16621654

1655+
/**
1656+
* CogDrmPlatform:atomic-mode-setting:
1657+
*
1658+
* Whether to use DRM/KMS atomic mode setting.
1659+
*
1660+
* Even if initially enabled, if the driver reports the feature as not
1661+
* supported the setting will be disabled automatically. Explicitly
1662+
* disabling atomic mode setting is rarely needed, but might fix issues
1663+
* with certain drivers.
1664+
*
1665+
* Since: 0.18
1666+
*/
1667+
s_properties[PROP_ATOMIC_MODE_SETTING] = g_param_spec_boolean("atomic-mode-setting",
1668+
"Atomic mode setting",
1669+
"Use DRM/KMS atomic mode setting",
1670+
TRUE,
1671+
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
1672+
1673+
/**
1674+
* CogDrmPlatform:device-scale-factor:
1675+
*
1676+
* Scaling factor applied to the output device.
1677+
*
1678+
* Since: 0.18
1679+
*/
1680+
s_properties[PROP_DEVICE_SCALE_FACTOR] =
1681+
g_param_spec_float("device-scale-factor", "Device scale factor", "Output device scaling factor", 0.25f, 5.0f,
1682+
1.0f, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
1683+
16631684
g_object_class_install_properties(object_class, N_PROPERTIES, s_properties);
16641685
}
16651686

0 commit comments

Comments
 (0)