onscreen/native: Split swap_buffers_with_damage into two functions
1. The EGL part: meta_onscreen_native_swap_buffers_with_damage 2. The KMS part: post_next_frame Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441>
This commit is contained in:
parent
f3688190bf
commit
54b393c2b3
@ -138,6 +138,9 @@ G_DEFINE_TYPE (MetaOnscreenNative, meta_onscreen_native,
|
|||||||
|
|
||||||
static GQuark blit_source_quark = 0;
|
static GQuark blit_source_quark = 0;
|
||||||
|
|
||||||
|
static void
|
||||||
|
post_next_frame (CoglOnscreen *onscreen);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
init_secondary_gpu_state (MetaRendererNative *renderer_native,
|
init_secondary_gpu_state (MetaRendererNative *renderer_native,
|
||||||
CoglOnscreen *onscreen,
|
CoglOnscreen *onscreen,
|
||||||
@ -1394,30 +1397,20 @@ meta_onscreen_native_swap_buffers_with_damage (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);
|
|
||||||
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
|
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
|
||||||
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
||||||
MetaDeviceFile *render_device_file;
|
MetaDeviceFile *render_device_file;
|
||||||
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);
|
||||||
MetaKmsUpdate *kms_update;
|
|
||||||
CoglOnscreenClass *parent_class;
|
CoglOnscreenClass *parent_class;
|
||||||
gboolean secondary_gpu_used = FALSE;
|
gboolean secondary_gpu_used = FALSE;
|
||||||
MetaPowerSave power_save_mode;
|
|
||||||
g_autoptr (GError) error = NULL;
|
g_autoptr (GError) error = NULL;
|
||||||
MetaDrmBufferFlags buffer_flags;
|
MetaDrmBufferFlags buffer_flags;
|
||||||
MetaDrmBufferGbm *buffer_gbm;
|
MetaDrmBufferGbm *buffer_gbm;
|
||||||
g_autoptr (MetaDrmBuffer) primary_gpu_fb = NULL;
|
g_autoptr (MetaDrmBuffer) primary_gpu_fb = NULL;
|
||||||
g_autoptr (MetaDrmBuffer) secondary_gpu_fb = NULL;
|
g_autoptr (MetaDrmBuffer) secondary_gpu_fb = NULL;
|
||||||
g_autoptr (MetaDrmBuffer) buffer = NULL;
|
g_autoptr (MetaDrmBuffer) buffer = NULL;
|
||||||
MetaKmsCrtc *kms_crtc;
|
|
||||||
MetaKmsDevice *kms_device;
|
|
||||||
|
|
||||||
COGL_TRACE_SCOPED_ANCHOR (MetaRendererNativePostKmsUpdate);
|
|
||||||
|
|
||||||
COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeSwapBuffers,
|
COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeSwapBuffers,
|
||||||
"Meta::OnscreenNative::swap_buffers_with_damage()");
|
"Meta::OnscreenNative::swap_buffers_with_damage()");
|
||||||
@ -1506,6 +1499,50 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
|||||||
clutter_frame_set_result (frame,
|
clutter_frame_set_result (frame,
|
||||||
CLUTTER_FRAME_RESULT_PENDING_PRESENTED);
|
CLUTTER_FRAME_RESULT_PENDING_PRESENTED);
|
||||||
|
|
||||||
|
meta_frame_native_set_damage (frame_native, region);
|
||||||
|
|
||||||
|
if (!secondary_gpu_used)
|
||||||
|
{
|
||||||
|
int sync_fd = cogl_context_get_latest_sync_fd (cogl_context);
|
||||||
|
|
||||||
|
meta_frame_native_set_sync_fd (frame_native, g_steal_fd (&sync_fd));
|
||||||
|
}
|
||||||
|
|
||||||
|
post_next_frame (onscreen);
|
||||||
|
return;
|
||||||
|
|
||||||
|
swap_failed:
|
||||||
|
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
|
||||||
|
meta_onscreen_native_notify_frame_complete (onscreen);
|
||||||
|
clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_IDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
post_next_frame (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
|
||||||
|
CoglRenderer *cogl_renderer = cogl_context->display->renderer;
|
||||||
|
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||||
|
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
||||||
|
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);
|
||||||
|
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||||
|
MetaPowerSave power_save_mode;
|
||||||
|
MetaKmsCrtc *kms_crtc;
|
||||||
|
MetaKmsDevice *kms_device;
|
||||||
|
MetaKmsUpdate *kms_update;
|
||||||
|
g_autoptr (MetaKmsFeedback) kms_feedback = NULL;
|
||||||
|
ClutterFrame *frame = onscreen_native->next_frame;
|
||||||
|
MetaFrameNative *frame_native;
|
||||||
|
MtkRegion *region;
|
||||||
|
int sync_fd;
|
||||||
|
|
||||||
|
COGL_TRACE_SCOPED_ANCHOR (MetaRendererNativePostKmsUpdate);
|
||||||
|
|
||||||
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
||||||
if (power_save_mode != META_POWER_SAVE_ON)
|
if (power_save_mode != META_POWER_SAVE_ON)
|
||||||
{
|
{
|
||||||
@ -1514,6 +1551,9 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frame_native = meta_frame_native_from_frame (frame);
|
||||||
|
region = meta_frame_native_get_damage (frame_native);
|
||||||
|
|
||||||
kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc));
|
kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc));
|
||||||
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,
|
||||||
@ -1533,7 +1573,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
|||||||
region);
|
region);
|
||||||
|
|
||||||
COGL_TRACE_BEGIN_ANCHORED (MetaRendererNativePostKmsUpdate,
|
COGL_TRACE_BEGIN_ANCHORED (MetaRendererNativePostKmsUpdate,
|
||||||
"Meta::OnscreenNative::swap_buffers_with_damage#post_pending_update()");
|
"Meta::OnscreenNative::post_next_frame#post_pending_update()");
|
||||||
|
|
||||||
switch (renderer_gpu_data->mode)
|
switch (renderer_gpu_data->mode)
|
||||||
{
|
{
|
||||||
@ -1589,22 +1629,12 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
|||||||
|
|
||||||
kms_update = meta_frame_native_steal_kms_update (frame_native);
|
kms_update = meta_frame_native_steal_kms_update (frame_native);
|
||||||
|
|
||||||
if (!secondary_gpu_used)
|
sync_fd = meta_frame_native_steal_sync_fd (frame_native);
|
||||||
{
|
if (sync_fd >= 0)
|
||||||
int sync_fd;
|
meta_kms_update_set_sync_fd (kms_update, g_steal_fd (&sync_fd));
|
||||||
|
|
||||||
sync_fd = cogl_context_get_latest_sync_fd (cogl_context);
|
|
||||||
meta_kms_update_set_sync_fd (kms_update, g_steal_fd (&sync_fd));
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_kms_device_post_update (kms_device, kms_update,
|
meta_kms_device_post_update (kms_device, kms_update,
|
||||||
META_KMS_UPDATE_FLAG_NONE);
|
META_KMS_UPDATE_FLAG_NONE);
|
||||||
return;
|
|
||||||
|
|
||||||
swap_failed:
|
|
||||||
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
|
|
||||||
meta_onscreen_native_notify_frame_complete (onscreen);
|
|
||||||
clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_IDLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
Loading…
x
Reference in New Issue
Block a user