backend-drm: add scanout tranche even for views eligible for direct scanout
We log the reasons why the fb of a certain view was not placed in an overlay plane and use that for debug purposes. With these reasons we also decide if the scanout tranche should be included on the dma-buf feedback or not. For instance: 1. If the reason is the incompatibility between the format/modifier pair of the fb and those supported by the KMS device, the scanout tranche is added and feedback is re-sent (so that the client can re-allocate with parameters that makes it eligible for direct scanout). 2. If the reason is because we have no overlay planes available, the scanout tranche is useless. So the scanout tranche is removed and the feedback re-sent (so that clients can re-allocate with parameters optimal for the render device). Also, when we detect that a view is eligible for direct scanout, we don't even consider sending new feedback, as our interpretation of the dma-buf feedback spec was that we should avoid bothering clients with new feedback when they are already hitting direct scanout. After some discussions and clarifications regarding the spec, we've realized that Weston should start to also include the scanout tranche even when the compositor is able to place client's content on overlay planes. Basically, because this gives a chance for clients to re-allocate with the proper parameters (not only format/modifier pair, but also the target_device and the flags) from the scanout tranche. In this patch we start doing this. Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
This commit is contained in:
parent
0251c05212
commit
c9b7c7085a
@ -344,25 +344,27 @@ dmabuf_feedback_maybe_update(struct drm_device *device, struct weston_view *ev,
|
||||
struct drm_backend *b = device->backend;
|
||||
dev_t scanout_dev = device->drm.devnum;
|
||||
uint32_t scanout_flags = ZWP_LINUX_DMABUF_FEEDBACK_V1_TRANCHE_FLAGS_SCANOUT;
|
||||
uint32_t action_needed = ACTION_NEEDED_NONE;
|
||||
enum actions_needed_dmabuf_feedback action_needed = ACTION_NEEDED_NONE;
|
||||
struct timespec current_time, delta_time;
|
||||
const time_t MAX_TIME_SECONDS = 2;
|
||||
|
||||
/* Find out what we need to do with the dma-buf feedback */
|
||||
if (try_view_on_plane_failure_reasons &
|
||||
(FAILURE_REASONS_FORCE_RENDERER |
|
||||
FAILURE_REASONS_NO_PLANES_AVAILABLE))
|
||||
action_needed |= ACTION_NEEDED_REMOVE_SCANOUT_TRANCHE;
|
||||
if (try_view_on_plane_failure_reasons &
|
||||
(FAILURE_REASONS_ADD_FB_FAILED |
|
||||
FAILURE_REASONS_FB_FORMAT_INCOMPATIBLE |
|
||||
FAILURE_REASONS_DMABUF_MODIFIER_INVALID |
|
||||
FAILURE_REASONS_GBM_BO_IMPORT_FAILED |
|
||||
FAILURE_REASONS_GBM_BO_GET_HANDLE_FAILED))
|
||||
action_needed |= ACTION_NEEDED_ADD_SCANOUT_TRANCHE;
|
||||
|
||||
assert(action_needed != (ACTION_NEEDED_REMOVE_SCANOUT_TRANCHE |
|
||||
ACTION_NEEDED_ADD_SCANOUT_TRANCHE));
|
||||
/* Direct scanout won't happen even if client re-allocates using
|
||||
* params from the scanout tranche, so keep only the renderer tranche. */
|
||||
if (try_view_on_plane_failure_reasons & (FAILURE_REASONS_FORCE_RENDERER |
|
||||
FAILURE_REASONS_NO_PLANES_AVAILABLE)) {
|
||||
action_needed = ACTION_NEEDED_REMOVE_SCANOUT_TRANCHE;
|
||||
/* Direct scanout may be possible if client re-allocates using the
|
||||
* params from the scanout tranche. */
|
||||
} else if (try_view_on_plane_failure_reasons & (FAILURE_REASONS_ADD_FB_FAILED |
|
||||
FAILURE_REASONS_FB_FORMAT_INCOMPATIBLE |
|
||||
FAILURE_REASONS_DMABUF_MODIFIER_INVALID |
|
||||
FAILURE_REASONS_GBM_BO_IMPORT_FAILED |
|
||||
FAILURE_REASONS_GBM_BO_GET_HANDLE_FAILED)) {
|
||||
action_needed = ACTION_NEEDED_ADD_SCANOUT_TRANCHE;
|
||||
/* Direct scanout is already possible, so include the scanout tranche. */
|
||||
} else if (try_view_on_plane_failure_reasons == FAILURE_REASONS_NONE) {
|
||||
action_needed = ACTION_NEEDED_ADD_SCANOUT_TRANCHE;
|
||||
}
|
||||
|
||||
/* Look for scanout tranche. If not found, add it but in disabled mode
|
||||
* (we still don't know if we'll have to send it to clients). This
|
||||
|
Loading…
Reference in New Issue
Block a user