cogl/onscreen: Pass regions instead
Go one step further and pass regions. Sometimes the rectangles were already a region, e.g. the swap-buffer case, and sometimes it still potentially needs to pass through a rectangle array, e.g. damage with a view transform. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4103>
This commit is contained in:
@ -194,13 +194,9 @@ queue_damage_region (ClutterStageWindow *stage_window,
|
||||
ClutterStageView *stage_view,
|
||||
MtkRegion *damage_region)
|
||||
{
|
||||
MtkRectangle *damage;
|
||||
int n_rects, i;
|
||||
g_autofree MtkRectangle *freeme = NULL;
|
||||
CoglFramebuffer *framebuffer;
|
||||
CoglOnscreen *onscreen;
|
||||
int fb_width;
|
||||
int fb_height;
|
||||
MtkMonitorTransform view_transform;
|
||||
|
||||
if (mtk_region_is_empty (damage_region))
|
||||
return;
|
||||
@ -210,30 +206,47 @@ queue_damage_region (ClutterStageWindow *stage_window,
|
||||
return;
|
||||
|
||||
onscreen = COGL_ONSCREEN (framebuffer);
|
||||
fb_width = cogl_framebuffer_get_width (framebuffer);
|
||||
fb_height = cogl_framebuffer_get_height (framebuffer);
|
||||
|
||||
n_rects = mtk_region_num_rectangles (damage_region);
|
||||
|
||||
if (n_rects < MAX_STACK_RECTS)
|
||||
damage = g_newa (MtkRectangle, n_rects);
|
||||
else
|
||||
damage = freeme = g_new0 (MtkRectangle, n_rects);
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
view_transform = clutter_stage_view_get_transform (stage_view);
|
||||
if (view_transform != MTK_MONITOR_TRANSFORM_NORMAL)
|
||||
{
|
||||
MtkRectangle rect;
|
||||
g_autoptr (MtkRegion) region = NULL;
|
||||
int fb_width;
|
||||
int fb_height;
|
||||
int n_rects, i;
|
||||
g_autofree MtkRectangle *freeme = NULL;
|
||||
MtkRectangle *damage;
|
||||
|
||||
rect = mtk_region_get_rectangle (damage_region, i);
|
||||
fb_width = cogl_framebuffer_get_width (framebuffer);
|
||||
fb_height = cogl_framebuffer_get_height (framebuffer);
|
||||
|
||||
mtk_rectangle_transform (&rect,
|
||||
clutter_stage_view_get_transform (stage_view),
|
||||
fb_width,
|
||||
fb_height,
|
||||
&damage[i]);
|
||||
n_rects = mtk_region_num_rectangles (damage_region);
|
||||
|
||||
if (n_rects < MAX_STACK_RECTS)
|
||||
damage = g_newa (MtkRectangle, n_rects);
|
||||
else
|
||||
damage = freeme = g_new0 (MtkRectangle, n_rects);
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
MtkRectangle rect;
|
||||
|
||||
rect = mtk_region_get_rectangle (damage_region, i);
|
||||
|
||||
mtk_rectangle_transform (&rect,
|
||||
clutter_stage_view_get_transform (stage_view),
|
||||
fb_width,
|
||||
fb_height,
|
||||
&damage[i]);
|
||||
}
|
||||
|
||||
region = mtk_region_create_rectangles (damage, n_rects);
|
||||
cogl_onscreen_queue_damage_region (onscreen, region);
|
||||
}
|
||||
else
|
||||
{
|
||||
cogl_onscreen_queue_damage_region (onscreen, damage_region);
|
||||
}
|
||||
|
||||
cogl_onscreen_queue_damage_region (onscreen, damage, n_rects);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -257,14 +270,9 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
||||
{
|
||||
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
|
||||
int64_t target_presentation_time_us;
|
||||
MtkRectangle *damage;
|
||||
int n_rects, i;
|
||||
int n_rects;
|
||||
CoglFrameInfo *frame_info;
|
||||
|
||||
n_rects = mtk_region_num_rectangles (swap_region);
|
||||
damage = g_newa (MtkRectangle, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
damage[i] = mtk_region_get_rectangle (swap_region, i);
|
||||
|
||||
frame_info =
|
||||
cogl_frame_info_new (cogl_context, priv->global_frame_counter);
|
||||
@ -277,7 +285,7 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
||||
target_presentation_time_us);
|
||||
}
|
||||
|
||||
/* push on the screen */
|
||||
n_rects = mtk_region_num_rectangles (swap_region);
|
||||
if (n_rects > 0 && !swap_with_damage)
|
||||
{
|
||||
meta_topic (META_DEBUG_BACKEND,
|
||||
@ -285,7 +293,7 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
||||
onscreen);
|
||||
|
||||
cogl_onscreen_swap_region (onscreen,
|
||||
damage, n_rects,
|
||||
swap_region,
|
||||
frame_info,
|
||||
frame);
|
||||
}
|
||||
@ -296,7 +304,7 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
||||
onscreen);
|
||||
|
||||
cogl_onscreen_swap_buffers_with_damage (onscreen,
|
||||
damage, n_rects,
|
||||
swap_region,
|
||||
frame_info,
|
||||
frame);
|
||||
}
|
||||
|
@ -624,20 +624,23 @@ meta_kms_update_set_custom_page_flip (MetaKmsUpdate *update,
|
||||
|
||||
void
|
||||
meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignment,
|
||||
const MtkRectangle *rectangles,
|
||||
int n_rectangles)
|
||||
const MtkRegion *region)
|
||||
{
|
||||
MetaKmsFbDamage *fb_damage;
|
||||
struct drm_mode_rect *mode_rects;
|
||||
int n_rectangles;
|
||||
int i;
|
||||
|
||||
n_rectangles = mtk_region_num_rectangles (region);
|
||||
mode_rects = g_new0 (struct drm_mode_rect, n_rectangles);
|
||||
for (i = 0; i < n_rectangles; ++i)
|
||||
{
|
||||
mode_rects[i].x1 = rectangles[i].x;
|
||||
mode_rects[i].y1 = rectangles[i].y;
|
||||
mode_rects[i].x2 = rectangles[i].x + rectangles[i].width;
|
||||
mode_rects[i].y2 = rectangles[i].y + rectangles[i].height;
|
||||
MtkRectangle rectangle = mtk_region_get_rectangle (region, i);
|
||||
|
||||
mode_rects[i].x1 = rectangle.x;
|
||||
mode_rects[i].y1 = rectangle.y;
|
||||
mode_rects[i].x2 = rectangle.x + rectangle.width;
|
||||
mode_rects[i].y2 = rectangle.y + rectangle.height;
|
||||
}
|
||||
|
||||
fb_damage = g_new0 (MetaKmsFbDamage, 1);
|
||||
|
@ -165,8 +165,7 @@ meta_kms_update_set_sync_fd (MetaKmsUpdate *update,
|
||||
int sync_fd);
|
||||
|
||||
void meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignment,
|
||||
const MtkRectangle *rectangles,
|
||||
int n_rectangles);
|
||||
const MtkRegion *region);
|
||||
|
||||
META_EXPORT_TEST
|
||||
MetaKmsPlaneAssignment * meta_kms_update_assign_plane (MetaKmsUpdate *update,
|
||||
|
@ -513,8 +513,7 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
MetaCrtc *crtc,
|
||||
MetaKmsUpdate *kms_update,
|
||||
MetaKmsAssignPlaneFlag flags,
|
||||
const MtkRectangle *rectangles,
|
||||
int n_rectangles)
|
||||
const MtkRegion *region)
|
||||
{
|
||||
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
@ -577,11 +576,8 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
&src_rect,
|
||||
&dst_rect);
|
||||
|
||||
if (rectangles != NULL && n_rectangles != 0)
|
||||
{
|
||||
meta_kms_plane_assignment_set_fb_damage (plane_assignment,
|
||||
rectangles, n_rectangles);
|
||||
}
|
||||
if (region && !mtk_region_is_empty (region))
|
||||
meta_kms_plane_assignment_set_fb_damage (plane_assignment, region);
|
||||
break;
|
||||
case META_RENDERER_NATIVE_MODE_SURFACELESS:
|
||||
g_assert_not_reached ();
|
||||
@ -983,8 +979,7 @@ secondary_gpu_get_next_dumb_buffer (MetaOnscreenNativeSecondaryGpuState *seconda
|
||||
static MetaDrmBuffer *
|
||||
copy_shared_framebuffer_primary_gpu (CoglOnscreen *onscreen,
|
||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state,
|
||||
const MtkRectangle *rectangles,
|
||||
int n_rectangles)
|
||||
const MtkRegion *region)
|
||||
{
|
||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||
@ -1000,6 +995,7 @@ copy_shared_framebuffer_primary_gpu (CoglOnscreen *onscre
|
||||
g_autoptr (GError) error = NULL;
|
||||
const MetaFormatInfo *format_info;
|
||||
uint64_t modifier;
|
||||
int n_rectangles;
|
||||
|
||||
COGL_TRACE_BEGIN_SCOPED (CopySharedFramebufferPrimaryGpu,
|
||||
"copy_shared_framebuffer_primary_gpu()");
|
||||
@ -1056,6 +1052,7 @@ copy_shared_framebuffer_primary_gpu (CoglOnscreen *onscre
|
||||
/* Limit the number of individual copies to 16 */
|
||||
#define MAX_RECTS 16
|
||||
|
||||
n_rectangles = mtk_region_num_rectangles (region);
|
||||
if (n_rectangles == 0 || n_rectangles > MAX_RECTS)
|
||||
{
|
||||
if (!cogl_blit_framebuffer (framebuffer, COGL_FRAMEBUFFER (dmabuf_fb),
|
||||
@ -1073,10 +1070,12 @@ copy_shared_framebuffer_primary_gpu (CoglOnscreen *onscre
|
||||
|
||||
for (i = 0; i < n_rectangles; ++i)
|
||||
{
|
||||
MtkRectangle rectangle = mtk_region_get_rectangle (region, i);
|
||||
|
||||
if (!cogl_blit_framebuffer (framebuffer, COGL_FRAMEBUFFER (dmabuf_fb),
|
||||
rectangles[i].x, rectangles[i].y,
|
||||
rectangles[i].x, rectangles[i].y,
|
||||
rectangles[i].width, rectangles[i].height,
|
||||
rectangle.x, rectangle.y,
|
||||
rectangle.x, rectangle.y,
|
||||
rectangle.width, rectangle.height,
|
||||
&error))
|
||||
{
|
||||
g_object_unref (dmabuf_fb);
|
||||
@ -1152,9 +1151,8 @@ copy_shared_framebuffer_cpu (CoglOnscreen *onscreen,
|
||||
}
|
||||
|
||||
static MetaDrmBuffer *
|
||||
update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen,
|
||||
const MtkRectangle *rectangles,
|
||||
int n_rectangles)
|
||||
update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen,
|
||||
const MtkRegion *region)
|
||||
{
|
||||
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
|
||||
@ -1186,8 +1184,7 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen,
|
||||
case META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY:
|
||||
copy = copy_shared_framebuffer_primary_gpu (onscreen,
|
||||
secondary_gpu_state,
|
||||
rectangles,
|
||||
n_rectangles);
|
||||
region);
|
||||
if (!copy)
|
||||
{
|
||||
if (!secondary_gpu_state->noted_primary_gpu_copy_failed)
|
||||
@ -1323,11 +1320,10 @@ static const MetaKmsResultListenerVtable swap_buffer_result_listener_vtable = {
|
||||
};
|
||||
|
||||
static void
|
||||
meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
const MtkRectangle *rectangles,
|
||||
int n_rectangles,
|
||||
CoglFrameInfo *frame_info,
|
||||
gpointer user_data)
|
||||
meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
const MtkRegion *region,
|
||||
CoglFrameInfo *frame_info,
|
||||
gpointer user_data)
|
||||
{
|
||||
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
|
||||
@ -1364,9 +1360,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
"Meta::OnscreenNative::swap_buffers_with_damage()");
|
||||
|
||||
secondary_gpu_fb =
|
||||
update_secondary_gpu_state_pre_swap_buffers (onscreen,
|
||||
rectangles,
|
||||
n_rectangles);
|
||||
update_secondary_gpu_state_pre_swap_buffers (onscreen, region);
|
||||
|
||||
secondary_gpu_state = onscreen_native->secondary_gpu_state;
|
||||
if (secondary_gpu_state)
|
||||
@ -1386,8 +1380,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
|
||||
parent_class = COGL_ONSCREEN_CLASS (meta_onscreen_native_parent_class);
|
||||
parent_class->swap_buffers_with_damage (onscreen,
|
||||
rectangles,
|
||||
n_rectangles,
|
||||
region,
|
||||
frame_info,
|
||||
user_data);
|
||||
|
||||
@ -1467,8 +1460,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
onscreen_native->crtc,
|
||||
kms_update,
|
||||
META_KMS_ASSIGN_PLANE_FLAG_NONE,
|
||||
rectangles,
|
||||
n_rectangles);
|
||||
region);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1727,8 +1719,7 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
||||
onscreen_native->crtc,
|
||||
kms_update,
|
||||
META_KMS_ASSIGN_PLANE_FLAG_DISABLE_IMPLICIT_SYNC,
|
||||
NULL,
|
||||
0);
|
||||
NULL);
|
||||
|
||||
meta_topic (META_DEBUG_KMS,
|
||||
"Posting direct scanout update for CRTC %u (%s)",
|
||||
|
Reference in New Issue
Block a user