diff --git a/alloc.c b/alloc.c index ac1677e..c3adfd0 100644 --- a/alloc.c +++ b/alloc.c @@ -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. */ diff --git a/include/private.h b/include/private.h index 1a1dfdc..b6ad6fc 100644 --- a/include/private.h +++ b/include/private.h @@ -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 diff --git a/output.c b/output.c index d771616..54785e2 100644 --- a/output.c +++ b/output.c @@ -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; @@ -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 "