backend-drm: Move plane's availability in drm_output_try_view_on_plane()
It makes much more sense to be there. It adds some additional drm_debug() statements to provide reason for failing to place the view in the HW plane. Makes the reason for failing more accurate. Signed-off-by: Marius Vlad <marius.vlad@collabora.com> Suggested-by: Daniel Stone <daniel.stone@collabora.com>
This commit is contained in:
parent
eef694547d
commit
36f11a53e1
@ -187,11 +187,6 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
|
||||
struct drm_backend *b = to_drm_backend(ec);
|
||||
struct drm_plane_state *state = NULL;
|
||||
int ret;
|
||||
enum {
|
||||
NO_PLANES,
|
||||
NO_PLANES_ACCEPTED,
|
||||
PLACED_ON_PLANE,
|
||||
} availability = NO_PLANES;
|
||||
|
||||
assert(!b->sprites_are_broken);
|
||||
assert(b->atomic_modeset);
|
||||
@ -242,7 +237,6 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
|
||||
drm_debug(b, "\t\t\t[overlay] provisionally placing "
|
||||
"view %p on overlay %lu in planes-only mode\n",
|
||||
ev, (unsigned long) plane->plane_id);
|
||||
availability = PLACED_ON_PLANE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -251,7 +245,6 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
|
||||
drm_debug(b, "\t\t\t[overlay] provisionally placing "
|
||||
"view %p on overlay %d in mixed mode\n",
|
||||
ev, plane->plane_id);
|
||||
availability = PLACED_ON_PLANE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -262,16 +255,6 @@ drm_output_prepare_overlay_view(struct drm_plane *plane,
|
||||
drm_plane_state_put_back(state);
|
||||
state = NULL;
|
||||
|
||||
switch (availability) {
|
||||
case NO_PLANES:
|
||||
drm_debug(b, "\t\t\t\t[overlay] not placing view %p on overlay: "
|
||||
"no free overlay planes\n", ev);
|
||||
break;
|
||||
case NO_PLANES_ACCEPTED:
|
||||
case PLACED_ON_PLANE:
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return state;
|
||||
}
|
||||
@ -323,6 +306,7 @@ drm_output_prepare_cursor_view(struct drm_output_state *output_state,
|
||||
struct drm_plane *plane = output->cursor_plane;
|
||||
struct drm_plane_state *plane_state;
|
||||
bool needs_update = false;
|
||||
const char *p_name = drm_output_get_plane_type_name(plane);
|
||||
|
||||
assert(!b->cursors_are_broken);
|
||||
|
||||
@ -348,16 +332,20 @@ drm_output_prepare_cursor_view(struct drm_output_state *output_state,
|
||||
/* We can't scale with the legacy API, and we don't try to account for
|
||||
* simple cropping/translation in cursor_bo_update. */
|
||||
plane_state->output = output;
|
||||
if (!drm_plane_state_coords_for_view(plane_state, ev, zpos))
|
||||
if (!drm_plane_state_coords_for_view(plane_state, ev, zpos)) {
|
||||
drm_debug(b, "\t\t\t\t[%s] not placing view %p on %s: "
|
||||
"unsuitable transform\n", p_name, ev, p_name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (plane_state->src_x != 0 || plane_state->src_y != 0 ||
|
||||
plane_state->src_w > (unsigned) b->cursor_width << 16 ||
|
||||
plane_state->src_h > (unsigned) b->cursor_height << 16 ||
|
||||
plane_state->src_w != plane_state->dest_w << 16 ||
|
||||
plane_state->src_h != plane_state->dest_h << 16) {
|
||||
drm_debug(b, "\t\t\t\t[cursor] not assigning view %p to cursor plane "
|
||||
"(positioning requires cropping or scaling)\n", ev);
|
||||
drm_debug(b, "\t\t\t\t[%s] not assigning view %p to %s plane "
|
||||
"(positioning requires cropping or scaling)\n",
|
||||
p_name, ev, p_name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -383,7 +371,7 @@ drm_output_prepare_cursor_view(struct drm_output_state *output_state,
|
||||
drm_fb_ref(output->gbm_cursor_fb[output->current_cursor]);
|
||||
|
||||
if (needs_update) {
|
||||
drm_debug(b, "\t\t\t\t[cursor] copying new content to cursor BO\n");
|
||||
drm_debug(b, "\t\t\t\t[%s] copying new content to cursor BO\n", p_name);
|
||||
cursor_bo_update(plane_state, ev);
|
||||
}
|
||||
|
||||
@ -396,8 +384,8 @@ drm_output_prepare_cursor_view(struct drm_output_state *output_state,
|
||||
plane_state->dest_w = b->cursor_width;
|
||||
plane_state->dest_h = b->cursor_height;
|
||||
|
||||
drm_debug(b, "\t\t\t\t[cursor] provisionally assigned view %p to cursor\n",
|
||||
ev);
|
||||
drm_debug(b, "\t\t\t\t[%s] provisionally assigned view %p to cursor\n",
|
||||
p_name, ev);
|
||||
|
||||
return plane_state;
|
||||
|
||||
@ -424,6 +412,7 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
|
||||
struct drm_backend *b = to_drm_backend(output->base.compositor);
|
||||
struct drm_plane *scanout_plane = output->scanout_plane;
|
||||
struct drm_plane_state *state;
|
||||
const char *p_name = drm_output_get_plane_type_name(scanout_plane);
|
||||
|
||||
assert(!b->sprites_are_broken);
|
||||
assert(b->atomic_modeset);
|
||||
@ -437,12 +426,15 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
|
||||
/* If the surface buffer has an in-fence fd, but the plane doesn't
|
||||
* support fences, we can't place the buffer on this plane. */
|
||||
if (ev->surface->acquire_fence_fd >= 0 &&
|
||||
scanout_plane->props[WDRM_PLANE_IN_FENCE_FD].prop_id == 0)
|
||||
scanout_plane->props[WDRM_PLANE_IN_FENCE_FD].prop_id == 0) {
|
||||
drm_debug(b, "\t\t\t\t[%s] not placing view %p on %s: "
|
||||
"no in-fence support\n", p_name, ev, p_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!fb) {
|
||||
drm_debug(b, "\t\t\t\t[scanout] not placing view %p on scanout: "
|
||||
" couldn't get fb\n", ev);
|
||||
drm_debug(b, "\t\t\t\t[%s] not placing view %p on %s: "
|
||||
" couldn't get fb\n", p_name, ev, p_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -459,13 +451,19 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state,
|
||||
state->fb = drm_fb_ref(fb);
|
||||
state->ev = ev;
|
||||
state->output = output;
|
||||
if (!drm_plane_state_coords_for_view(state, ev, zpos))
|
||||
if (!drm_plane_state_coords_for_view(state, ev, zpos)) {
|
||||
drm_debug(b, "\t\t\t\t[%s] not placing view %p on %s: "
|
||||
"unsuitable transform\n", p_name, ev, p_name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (state->dest_x != 0 || state->dest_y != 0 ||
|
||||
state->dest_w != (unsigned) output->base.current_mode->width ||
|
||||
state->dest_h != (unsigned) output->base.current_mode->height)
|
||||
state->dest_h != (unsigned) output->base.current_mode->height) {
|
||||
drm_debug(b, "\t\t\t\t[%s] not placing view %p on %s: "
|
||||
" invalid plane state\n", p_name, ev, p_name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
state->in_fence_fd = ev->surface->acquire_fence_fd;
|
||||
|
||||
@ -511,6 +509,13 @@ drm_output_try_view_on_plane(struct drm_plane *plane,
|
||||
struct weston_output *wet_output = &state->output->base;
|
||||
bool view_matches_entire_output, scanout_has_view_assigned;
|
||||
struct drm_plane *scanout_plane = state->output->scanout_plane;
|
||||
struct drm_plane_state *ps = NULL;
|
||||
const char *p_name = drm_output_get_plane_type_name(plane);
|
||||
enum {
|
||||
NO_PLANES, /* generic err-handle */
|
||||
NO_PLANES_ACCEPTED,
|
||||
PLACED_ON_PLANE,
|
||||
} availability = NO_PLANES;
|
||||
|
||||
/* sanity checks in case we over/underflow zpos or pass incorrect
|
||||
* values */
|
||||
@ -520,12 +525,14 @@ drm_output_try_view_on_plane(struct drm_plane *plane,
|
||||
switch (plane->type) {
|
||||
case WDRM_PLANE_TYPE_CURSOR:
|
||||
if (b->cursors_are_broken) {
|
||||
drm_debug(b, "\t\t\t\t[plane] plane %d refusing to "
|
||||
"place view %p in cursor\n",
|
||||
plane->plane_id, ev);
|
||||
return NULL;
|
||||
availability = NO_PLANES_ACCEPTED;
|
||||
goto out;
|
||||
}
|
||||
return drm_output_prepare_cursor_view(state, ev, zpos);
|
||||
|
||||
ps = drm_output_prepare_cursor_view(state, ev, zpos);
|
||||
if (ps)
|
||||
availability = PLACED_ON_PLANE;
|
||||
break;
|
||||
case WDRM_PLANE_TYPE_OVERLAY:
|
||||
/* do not attempt to place it in the overlay if we don't have
|
||||
* anything in the scanout/primary and the view doesn't cover
|
||||
@ -537,26 +544,49 @@ drm_output_try_view_on_plane(struct drm_plane *plane,
|
||||
state);
|
||||
|
||||
if (view_matches_entire_output && !scanout_has_view_assigned) {
|
||||
drm_debug(b, "\t\t\t\t[plane] plane %d refusing to "
|
||||
"place view %p in overlay\n",
|
||||
plane->plane_id, ev);
|
||||
return NULL;
|
||||
availability = NO_PLANES_ACCEPTED;
|
||||
goto out;
|
||||
}
|
||||
return drm_output_prepare_overlay_view(plane, state, ev,
|
||||
mode, fb, zpos);
|
||||
|
||||
ps = drm_output_prepare_overlay_view(plane, state, ev, mode,
|
||||
fb, zpos);
|
||||
if (ps)
|
||||
availability = PLACED_ON_PLANE;
|
||||
break;
|
||||
case WDRM_PLANE_TYPE_PRIMARY:
|
||||
if (mode != DRM_OUTPUT_PROPOSE_STATE_PLANES_ONLY) {
|
||||
drm_debug(b, "\t\t\t\t[plane] plane %d refusing to "
|
||||
"place view %p in scanout\n",
|
||||
plane->plane_id, ev);
|
||||
return NULL;
|
||||
availability = NO_PLANES_ACCEPTED;
|
||||
goto out;
|
||||
}
|
||||
return drm_output_prepare_scanout_view(state, ev, mode,
|
||||
fb, zpos);
|
||||
|
||||
ps = drm_output_prepare_scanout_view(state, ev, mode,
|
||||
fb, zpos);
|
||||
if (ps)
|
||||
availability = PLACED_ON_PLANE;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
switch (availability) {
|
||||
case NO_PLANES:
|
||||
/* set initial to this catch-all case, such that
|
||||
* prepare_cursor/overlay/scanout() should have/contain the
|
||||
* reason for failling */
|
||||
break;
|
||||
case NO_PLANES_ACCEPTED:
|
||||
drm_debug(b, "\t\t\t\t[plane] plane %d refusing to "
|
||||
"place view %p in %s\n",
|
||||
plane->plane_id, ev, p_name);
|
||||
break;
|
||||
case PLACED_ON_PLANE:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return ps;
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
Reference in New Issue
Block a user