Skip to content
This repository has been archived by the owner on Oct 25, 2021. It is now read-only.

Commit

Permalink
Log current planes on apply
Browse files Browse the repository at this point in the history
It is helpful for debugging to know in which state the available planes on an
output are when a layout is applied that leads to a change.

For that log all planes that are compatible with the output. Currently disabled
planes have multiple properties logged per line to keep the log short.
  • Loading branch information
romangg committed Mar 18, 2020
1 parent 82153bf commit bb24849
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 1 deletion.
1 change: 1 addition & 0 deletions alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,7 @@ bool liftoff_output_apply(struct liftoff_output *output, drmModeAtomicReq *req)
}
log_no_reuse(output);

output_log_planes(output);
output_log_layers(output);

/* Unset all existing plane and layer mappings. */
Expand Down
1 change: 1 addition & 0 deletions include/private.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ struct liftoff_plane_property *plane_get_property(struct liftoff_plane *plane,
bool plane_apply(struct liftoff_plane *plane, struct liftoff_layer *layer,
drmModeAtomicReq *req, bool *compatible);

void output_log_planes(struct liftoff_output *output);
void output_log_layers(struct liftoff_output *output);

#endif
95 changes: 94 additions & 1 deletion output.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,99 @@ void liftoff_output_set_composition_layer(struct liftoff_output *output,
output->composition_layer = layer;
}

void output_log_planes(struct liftoff_output *output)
{
struct liftoff_device *device;
struct liftoff_plane *plane;
drmModeObjectProperties *drm_props;
drmModePropertyRes *drm_prop;
size_t i;
int per_line, max_per_line;

device = output->device;

if (!log_has(LIFTOFF_DEBUG)) {
return;
}

liftoff_log(LIFTOFF_DEBUG, "Planes on CRTC %"PRIu32":", output->crtc_id);

liftoff_list_for_each(plane, &device->planes, link) {
bool active = false;

if ((plane->possible_crtcs & (1 << output->crtc_index)) == 0) {
continue;
}


drm_props = drmModeObjectGetProperties(device->drm_fd,
plane->id, DRM_MODE_OBJECT_PLANE);
if (drm_props == NULL) {
liftoff_log_errno(LIFTOFF_ERROR, "drmModeObjectGetProperties");
continue;
}

for (i = 0; i < drm_props->count_props; i++) {
drm_prop = drmModeGetProperty(device->drm_fd, drm_props->props[i]);
if (drm_prop == NULL) {
liftoff_log_errno(LIFTOFF_ERROR, "drmModeObjectGetProperties");
continue;
}

if (strcmp(drm_prop->name, "CRTC_ID") == 0
&& drm_props->prop_values[i] != 0) {
active = true;
break;
}
}

struct liftoff_log_buffer log_buf = {0};
liftoff_log_buffer_append(&log_buf, " Plane %"PRIu32 "%s", plane->id,
active ? ":" : " (inactive):");

max_per_line = active ? 1 : 4;
per_line = max_per_line - 1;
for (i = 0; i < drm_props->count_props; i++) {
uint64_t value = drm_props->prop_values[i];
char *name;

if (++per_line == max_per_line) {
liftoff_log_buffer_append(&log_buf, "\n ");
per_line = 0;
}

drm_prop = drmModeGetProperty(device->drm_fd,
drm_props->props[i]);
if (drm_prop == NULL) {
liftoff_log_buffer_append(&log_buf, "ERR!");
continue;
}

name = drm_prop->name;

if (strcmp(name, "type") == 0) {
liftoff_log_buffer_append(&log_buf, " %s: %s", name,
value == DRM_PLANE_TYPE_PRIMARY ? "primary" :
value == DRM_PLANE_TYPE_CURSOR ? "cursor" : "overlay");
continue;
}

if (strcmp(name, "CRTC_X") == 0 || strcmp(name, "CRTC_Y") == 0
|| strcmp(name, "IN_FENCE_FD") == 0) {
liftoff_log_buffer_append(&log_buf, " %s: %"PRIi32, name,
(int32_t)value);
continue;
}

if (strcmp(name, "SRC_W") == 0 || strcmp(name, "SRC_H") == 0) {
value = value >> 16;
}
liftoff_log_buffer_append(&log_buf, " %s: %"PRIu64, name, value);
}
liftoff_log_buffer_flush(&log_buf, LIFTOFF_DEBUG);
}
}

void output_log_layers(struct liftoff_output *output) {
struct liftoff_layer *layer;
size_t i;
Expand All @@ -63,7 +156,7 @@ void output_log_layers(struct liftoff_output *output) {
return;
}

liftoff_log(LIFTOFF_DEBUG, "Layers on CRTC %"PRIu32":", output->crtc_id);
liftoff_log(LIFTOFF_DEBUG, "Available layers:");
liftoff_list_for_each(layer, &output->layers, link) {
if (layer->force_composition) {
liftoff_log(LIFTOFF_DEBUG, " Layer %p "
Expand Down

0 comments on commit bb24849

Please sign in to comment.