onscreen/native: Merge composite and direct scanout posting code paths
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441>
This commit is contained in:
parent
b6841e2e33
commit
4d4bf1244a
@ -1391,6 +1391,14 @@ static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = {
|
|||||||
.feedback = swap_buffer_result_feedback,
|
.feedback = swap_buffer_result_feedback,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
static const MetaKmsResultListenerVtable scanout_result_listener_vtable = {
|
||||||
|
.feedback = scanout_result_feedback,
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||||
const MtkRegion *region,
|
const MtkRegion *region,
|
||||||
@ -1546,6 +1554,9 @@ post_next_frame (CoglOnscreen *onscreen)
|
|||||||
MetaFrameNative *frame_native;
|
MetaFrameNative *frame_native;
|
||||||
MtkRegion *region;
|
MtkRegion *region;
|
||||||
int sync_fd;
|
int sync_fd;
|
||||||
|
const MetaKmsResultListenerVtable *listener;
|
||||||
|
MetaKmsAssignPlaneFlag flip_flags;
|
||||||
|
gboolean is_direct_scanout;
|
||||||
|
|
||||||
COGL_TRACE_SCOPED_ANCHOR (MetaRendererNativePostKmsUpdate);
|
COGL_TRACE_SCOPED_ANCHOR (MetaRendererNativePostKmsUpdate);
|
||||||
|
|
||||||
@ -1565,8 +1576,21 @@ post_next_frame (CoglOnscreen *onscreen)
|
|||||||
kms_device = meta_kms_crtc_get_device (kms_crtc);
|
kms_device = meta_kms_crtc_get_device (kms_crtc);
|
||||||
kms_update = meta_frame_native_ensure_kms_update (frame_native,
|
kms_update = meta_frame_native_ensure_kms_update (frame_native,
|
||||||
kms_device);
|
kms_device);
|
||||||
|
|
||||||
|
is_direct_scanout = meta_frame_native_get_scanout (frame_native) != NULL;
|
||||||
|
if (is_direct_scanout)
|
||||||
|
{
|
||||||
|
listener = &scanout_result_listener_vtable;
|
||||||
|
flip_flags = META_KMS_ASSIGN_PLANE_FLAG_DISABLE_IMPLICIT_SYNC;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
listener = &swap_buffer_result_listener_vtable;
|
||||||
|
flip_flags = META_KMS_ASSIGN_PLANE_FLAG_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
meta_kms_update_add_result_listener (kms_update,
|
meta_kms_update_add_result_listener (kms_update,
|
||||||
&swap_buffer_result_listener_vtable,
|
listener,
|
||||||
NULL,
|
NULL,
|
||||||
onscreen_native,
|
onscreen_native,
|
||||||
NULL);
|
NULL);
|
||||||
@ -1576,7 +1600,7 @@ post_next_frame (CoglOnscreen *onscreen)
|
|||||||
onscreen_native->view,
|
onscreen_native->view,
|
||||||
onscreen_native->crtc,
|
onscreen_native->crtc,
|
||||||
kms_update,
|
kms_update,
|
||||||
META_KMS_ASSIGN_PLANE_FLAG_NONE,
|
flip_flags,
|
||||||
region);
|
region);
|
||||||
|
|
||||||
COGL_TRACE_BEGIN_ANCHORED (MetaRendererNativePostKmsUpdate,
|
COGL_TRACE_BEGIN_ANCHORED (MetaRendererNativePostKmsUpdate,
|
||||||
@ -1630,7 +1654,8 @@ post_next_frame (CoglOnscreen *onscreen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KMS,
|
meta_topic (META_DEBUG_KMS,
|
||||||
"Posting primary plane composite update for CRTC %u (%s)",
|
"Posting primary plane %s update for CRTC %u (%s)",
|
||||||
|
is_direct_scanout ? "direct scanout" : "composite",
|
||||||
meta_kms_crtc_get_id (kms_crtc),
|
meta_kms_crtc_get_id (kms_crtc),
|
||||||
meta_kms_device_get_path (kms_device));
|
meta_kms_device_get_path (kms_device));
|
||||||
|
|
||||||
@ -1732,10 +1757,6 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
|
|||||||
meta_onscreen_native_clear_posted_fb (onscreen);
|
meta_onscreen_native_clear_posted_fb (onscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MetaKmsResultListenerVtable scanout_result_listener_vtable = {
|
|
||||||
.feedback = scanout_result_feedback,
|
|
||||||
};
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
||||||
CoglScanout *scanout,
|
CoglScanout *scanout,
|
||||||
@ -1751,35 +1772,8 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
|||||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||||
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
||||||
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
|
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
|
||||||
MetaRenderer *renderer = META_RENDERER (renderer_native);
|
|
||||||
MetaBackend *backend = meta_renderer_get_backend (renderer);
|
|
||||||
MetaMonitorManager *monitor_manager =
|
|
||||||
meta_backend_get_monitor_manager (backend);
|
|
||||||
MetaPowerSave power_save_mode;
|
|
||||||
ClutterFrame *frame = user_data;
|
ClutterFrame *frame = user_data;
|
||||||
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
|
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
|
||||||
MetaKmsCrtc *kms_crtc;
|
|
||||||
MetaKmsDevice *kms_device;
|
|
||||||
MetaKmsUpdate *kms_update;
|
|
||||||
|
|
||||||
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
|
||||||
if (power_save_mode != META_POWER_SAVE_ON)
|
|
||||||
{
|
|
||||||
g_set_error_literal (error,
|
|
||||||
COGL_SCANOUT_ERROR,
|
|
||||||
COGL_SCANOUT_ERROR_INHIBITED,
|
|
||||||
"Direct scanout is inhibited during power saving mode");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (meta_renderer_native_has_pending_mode_set (renderer_native))
|
|
||||||
{
|
|
||||||
g_set_error_literal (error,
|
|
||||||
COGL_SCANOUT_ERROR,
|
|
||||||
COGL_SCANOUT_ERROR_INHIBITED,
|
|
||||||
"Direct scanout is inhibited when a mode set is pending");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||||
render_gpu);
|
render_gpu);
|
||||||
@ -1798,33 +1792,9 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
|||||||
if (cogl_context_has_feature (cogl_context, COGL_FEATURE_ID_TIMESTAMP_QUERY))
|
if (cogl_context_has_feature (cogl_context, COGL_FEATURE_ID_TIMESTAMP_QUERY))
|
||||||
frame_info->has_valid_gpu_rendering_duration = TRUE;
|
frame_info->has_valid_gpu_rendering_duration = TRUE;
|
||||||
|
|
||||||
kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc));
|
|
||||||
kms_device = meta_kms_crtc_get_device (kms_crtc);
|
|
||||||
kms_update = meta_frame_native_ensure_kms_update (frame_native, kms_device);
|
|
||||||
|
|
||||||
meta_kms_update_add_result_listener (kms_update,
|
|
||||||
&scanout_result_listener_vtable,
|
|
||||||
NULL,
|
|
||||||
onscreen_native,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
meta_onscreen_native_flip_crtc (onscreen,
|
|
||||||
onscreen_native->view,
|
|
||||||
onscreen_native->crtc,
|
|
||||||
kms_update,
|
|
||||||
META_KMS_ASSIGN_PLANE_FLAG_DISABLE_IMPLICIT_SYNC,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KMS,
|
|
||||||
"Posting direct scanout update for CRTC %u (%s)",
|
|
||||||
meta_kms_crtc_get_id (kms_crtc),
|
|
||||||
meta_kms_device_get_path (kms_device));
|
|
||||||
|
|
||||||
kms_update = meta_frame_native_steal_kms_update (frame_native);
|
|
||||||
meta_kms_device_post_update (kms_device, kms_update,
|
|
||||||
META_KMS_UPDATE_FLAG_NONE);
|
|
||||||
clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_PENDING_PRESENTED);
|
clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_PENDING_PRESENTED);
|
||||||
|
|
||||||
|
post_next_frame (onscreen);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user