mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 15:40:41 -05:00
kms: Allow passing framebuffer damage metadata
This commit adds support to atomic KMS backend for optional plane property prop_fb_damage_clips. Some drivers (e.g. EVDI) take advantage of this property and process only updated regions of the screen instead of processing the full frame. This can save system resources. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1879>
This commit is contained in:
parent
7555688d8d
commit
af0460d0ce
@ -416,6 +416,8 @@ process_plane_assignment (MetaKmsImplDevice *impl_device,
|
|||||||
MetaKmsPlaneAssignment *plane_assignment = update_entry;
|
MetaKmsPlaneAssignment *plane_assignment = update_entry;
|
||||||
MetaKmsPlane *plane = plane_assignment->plane;
|
MetaKmsPlane *plane = plane_assignment->plane;
|
||||||
MetaDrmBuffer *buffer;
|
MetaDrmBuffer *buffer;
|
||||||
|
MetaKmsFbDamage *fb_damage;
|
||||||
|
uint32_t prop_id;
|
||||||
|
|
||||||
buffer = plane_assignment->buffer;
|
buffer = plane_assignment->buffer;
|
||||||
|
|
||||||
@ -539,6 +541,32 @@ process_plane_assignment (MetaKmsImplDevice *impl_device,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fb_damage = plane_assignment->fb_damage;
|
||||||
|
if (fb_damage &&
|
||||||
|
meta_kms_plane_get_prop_id (plane,
|
||||||
|
META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID))
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_KMS,
|
||||||
|
"[atomic] Setting %d damage clips on %u",
|
||||||
|
fb_damage->n_rects,
|
||||||
|
meta_kms_plane_get_id (plane));
|
||||||
|
|
||||||
|
prop_id = store_new_blob (impl_device,
|
||||||
|
blob_ids,
|
||||||
|
fb_damage->rects,
|
||||||
|
fb_damage->n_rects *
|
||||||
|
sizeof (struct drm_mode_rect),
|
||||||
|
error);
|
||||||
|
if (!prop_id)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!add_plane_property (impl_device,
|
||||||
|
plane, req,
|
||||||
|
META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID,
|
||||||
|
prop_id,
|
||||||
|
error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ typedef enum _MetaKmsPlaneProp
|
|||||||
META_KMS_PLANE_PROP_CRTC_H,
|
META_KMS_PLANE_PROP_CRTC_H,
|
||||||
META_KMS_PLANE_PROP_FB_ID,
|
META_KMS_PLANE_PROP_FB_ID,
|
||||||
META_KMS_PLANE_PROP_CRTC_ID,
|
META_KMS_PLANE_PROP_CRTC_ID,
|
||||||
|
META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID,
|
||||||
META_KMS_PLANE_N_PROPS
|
META_KMS_PLANE_N_PROPS
|
||||||
} MetaKmsPlaneProp;
|
} MetaKmsPlaneProp;
|
||||||
|
|
||||||
|
@ -446,6 +446,11 @@ init_properties (MetaKmsPlane *plane,
|
|||||||
.name = "CRTC_ID",
|
.name = "CRTC_ID",
|
||||||
.type = DRM_MODE_PROP_OBJECT,
|
.type = DRM_MODE_PROP_OBJECT,
|
||||||
},
|
},
|
||||||
|
[META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID] =
|
||||||
|
{
|
||||||
|
.name = "FB_DAMAGE_CLIPS",
|
||||||
|
.type = DRM_MODE_PROP_BLOB,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,6 +34,12 @@ typedef struct _MetaKmsFeedback
|
|||||||
GError *error;
|
GError *error;
|
||||||
} MetaKmsFeedback;
|
} MetaKmsFeedback;
|
||||||
|
|
||||||
|
typedef struct _MetaKmsFbDamage
|
||||||
|
{
|
||||||
|
struct drm_mode_rect *rects;
|
||||||
|
int n_rects;
|
||||||
|
} MetaKmsFbDamage;
|
||||||
|
|
||||||
typedef struct _MetaKmsPlaneAssignment
|
typedef struct _MetaKmsPlaneAssignment
|
||||||
{
|
{
|
||||||
MetaKmsUpdate *update;
|
MetaKmsUpdate *update;
|
||||||
@ -43,6 +49,7 @@ typedef struct _MetaKmsPlaneAssignment
|
|||||||
MetaFixed16Rectangle src_rect;
|
MetaFixed16Rectangle src_rect;
|
||||||
MetaRectangle dst_rect;
|
MetaRectangle dst_rect;
|
||||||
MetaKmsAssignPlaneFlag flags;
|
MetaKmsAssignPlaneFlag flags;
|
||||||
|
MetaKmsFbDamage *fb_damage;
|
||||||
|
|
||||||
uint64_t rotation;
|
uint64_t rotation;
|
||||||
|
|
||||||
|
@ -129,9 +129,17 @@ meta_kms_feedback_get_error (const MetaKmsFeedback *feedback)
|
|||||||
return feedback->error;
|
return feedback->error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_kms_fb_damage_free (MetaKmsFbDamage *fb_damage)
|
||||||
|
{
|
||||||
|
g_free (fb_damage->rects);
|
||||||
|
g_free (fb_damage);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_kms_plane_assignment_free (MetaKmsPlaneAssignment *plane_assignment)
|
meta_kms_plane_assignment_free (MetaKmsPlaneAssignment *plane_assignment)
|
||||||
{
|
{
|
||||||
|
g_clear_pointer (&plane_assignment->fb_damage, meta_kms_fb_damage_free);
|
||||||
g_free (plane_assignment);
|
g_free (plane_assignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,6 +464,33 @@ meta_kms_update_set_custom_page_flip (MetaKmsUpdate *update,
|
|||||||
update->custom_page_flip = custom_page_flip;
|
update->custom_page_flip = custom_page_flip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignment,
|
||||||
|
const int *rectangles,
|
||||||
|
int n_rectangles)
|
||||||
|
{
|
||||||
|
MetaKmsFbDamage *fb_damage;
|
||||||
|
struct drm_mode_rect *mode_rects;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
mode_rects = g_new0 (struct drm_mode_rect, n_rectangles);
|
||||||
|
for (i = 0; i < n_rectangles; ++i)
|
||||||
|
{
|
||||||
|
mode_rects[i].x1 = rectangles[i * 4];
|
||||||
|
mode_rects[i].y1 = rectangles[i * 4 + 1];
|
||||||
|
mode_rects[i].x2 = mode_rects[i].x1 + rectangles[i * 4 + 2];
|
||||||
|
mode_rects[i].y2 = mode_rects[i].y1 + rectangles[i * 4 + 3];
|
||||||
|
}
|
||||||
|
|
||||||
|
fb_damage = g_new0 (MetaKmsFbDamage, 1);
|
||||||
|
*fb_damage = (MetaKmsFbDamage) {
|
||||||
|
.rects = mode_rects,
|
||||||
|
.n_rects = n_rectangles,
|
||||||
|
};
|
||||||
|
|
||||||
|
plane_assignment->fb_damage = fb_damage;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment,
|
meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment,
|
||||||
uint64_t rotation)
|
uint64_t rotation)
|
||||||
|
@ -115,6 +115,10 @@ void meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update,
|
|||||||
const uint16_t *green,
|
const uint16_t *green,
|
||||||
const uint16_t *blue);
|
const uint16_t *blue);
|
||||||
|
|
||||||
|
void meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignment,
|
||||||
|
const int *rectangles,
|
||||||
|
int n_rectangles);
|
||||||
|
|
||||||
MetaKmsPlaneAssignment * meta_kms_update_assign_plane (MetaKmsUpdate *update,
|
MetaKmsPlaneAssignment * meta_kms_update_assign_plane (MetaKmsUpdate *update,
|
||||||
MetaKmsCrtc *crtc,
|
MetaKmsCrtc *crtc,
|
||||||
MetaKmsPlane *plane,
|
MetaKmsPlane *plane,
|
||||||
|
Loading…
Reference in New Issue
Block a user