diff --git a/gdk/gdkdrawcontext.c b/gdk/gdkdrawcontext.c index 344582dd4b..9a15f6947c 100644 --- a/gdk/gdkdrawcontext.c +++ b/gdk/gdkdrawcontext.c @@ -330,11 +330,12 @@ gdk_draw_context_begin_frame (GdkDrawContext *context, g_return_if_fail (priv->surface != NULL); g_return_if_fail (region != NULL); - gdk_draw_context_begin_frame_full (context, GDK_MEMORY_U8, region); + gdk_draw_context_begin_frame_full (context, GDK_MEMORY_U8, region, NULL); } /* * @depth: best depth to render in + * @opaque: (nullable): opaque region of the rendering * * If the given depth is not `GDK_MEMORY_U8`, GDK will see about providing a * rendering target that supports a higher bit depth than 8 bits per channel. @@ -357,9 +358,10 @@ gdk_draw_context_begin_frame (GdkDrawContext *context, * to choose. */ void -gdk_draw_context_begin_frame_full (GdkDrawContext *context, - GdkMemoryDepth depth, - const cairo_region_t *region) +gdk_draw_context_begin_frame_full (GdkDrawContext *context, + GdkMemoryDepth depth, + const cairo_region_t *region, + const graphene_rect_t *opaque) { GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (context); @@ -384,6 +386,8 @@ gdk_draw_context_begin_frame_full (GdkDrawContext *context, return; } + gdk_surface_set_opaque_rect (priv->surface, opaque); + if (gdk_display_get_debug_flags (priv->display) & GDK_DEBUG_HIGH_DEPTH) depth = GDK_MEMORY_FLOAT32; @@ -427,13 +431,10 @@ region_get_pixels (cairo_region_t *region) #endif void -gdk_draw_context_end_frame_full (GdkDrawContext *context, - const graphene_rect_t *opaque) +gdk_draw_context_end_frame_full (GdkDrawContext *context) { GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (context); - gdk_surface_set_opaque_rect (priv->surface, opaque); - GDK_DRAW_CONTEXT_GET_CLASS (context)->end_frame (context, priv->frame_region); gdk_profiler_set_int_counter (pixels_counter, region_get_pixels (priv->frame_region)); @@ -486,7 +487,7 @@ gdk_draw_context_end_frame (GdkDrawContext *context) return; } - gdk_draw_context_end_frame_full (context, NULL); + gdk_draw_context_end_frame_full (context); } /** diff --git a/gdk/gdkdrawcontextprivate.h b/gdk/gdkdrawcontextprivate.h index aeb52ae9e7..e795a42476 100644 --- a/gdk/gdkdrawcontextprivate.h +++ b/gdk/gdkdrawcontextprivate.h @@ -59,9 +59,9 @@ void gdk_draw_context_surface_resized (GdkDrawContext void gdk_draw_context_begin_frame_full (GdkDrawContext *context, GdkMemoryDepth depth, - const cairo_region_t *region); -void gdk_draw_context_end_frame_full (GdkDrawContext *context, + const cairo_region_t *region, const graphene_rect_t *opaque); +void gdk_draw_context_end_frame_full (GdkDrawContext *context); void gdk_draw_context_empty_frame (GdkDrawContext *context); diff --git a/gsk/broadway/gskbroadwayrenderer.c b/gsk/broadway/gskbroadwayrenderer.c index d9f1806d87..c24dc66e84 100644 --- a/gsk/broadway/gskbroadwayrenderer.c +++ b/gsk/broadway/gskbroadwayrenderer.c @@ -934,7 +934,7 @@ gsk_broadway_renderer_render (GskRenderer *renderer, self->node_lookup = g_hash_table_new (g_direct_hash, g_direct_equal); - gdk_draw_context_begin_frame_full (GDK_DRAW_CONTEXT (self->draw_context), GDK_MEMORY_U8, update_area); + gdk_draw_context_begin_frame_full (GDK_DRAW_CONTEXT (self->draw_context), GDK_MEMORY_U8, update_area, NULL); /* These are owned by the draw context between begin and end, but cache them here for easier access during the render */ @@ -946,7 +946,7 @@ gsk_broadway_renderer_render (GskRenderer *renderer, self->nodes = NULL; self->node_textures = NULL; - gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->draw_context), NULL); + gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->draw_context)); if (self->last_node_lookup) g_hash_table_unref (self->last_node_lookup); diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 500aaa53ab..d60073dc70 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -305,7 +305,8 @@ gsk_gl_renderer_render (GskRenderer *renderer, graphene_rect_t viewport; GskGLRenderJob *job; GdkSurface *surface; - graphene_rect_t opaque; + graphene_rect_t opaque_tmp; + const graphene_rect_t *opaque; float scale; g_assert (GSK_IS_GL_RENDERER (renderer)); @@ -325,9 +326,14 @@ gsk_gl_renderer_render (GskRenderer *renderer, viewport.size.width = gdk_surface_get_width (surface) * scale; viewport.size.height = gdk_surface_get_height (surface) * scale; + if (gsk_render_node_get_opaque_rect (root, &opaque_tmp)) + opaque = &opaque_tmp; + else + opaque = NULL; gdk_draw_context_begin_frame_full (GDK_DRAW_CONTEXT (self->context), gsk_render_node_get_preferred_depth (root), - update_area); + update_area, + opaque); gdk_gl_context_make_current (self->context); @@ -340,10 +346,7 @@ gsk_gl_renderer_render (GskRenderer *renderer, gsk_gl_driver_end_frame (self->driver); gsk_gl_render_job_free (job); - if (gsk_render_node_get_opaque_rect (root, &opaque)) - gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->context), &opaque); - else - gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->context), NULL); + gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->context)); gsk_gl_driver_after_frame (self->driver); diff --git a/gsk/gpu/gskgpuframe.c b/gsk/gpu/gskgpuframe.c index 8d057fe08d..6659063797 100644 --- a/gsk/gpu/gskgpuframe.c +++ b/gsk/gpu/gskgpuframe.c @@ -78,20 +78,20 @@ gsk_gpu_frame_default_cleanup (GskGpuFrame *self) } static void -gsk_gpu_frame_default_begin (GskGpuFrame *self, - GdkDrawContext *context, - GdkMemoryDepth depth, - const cairo_region_t *region) +gsk_gpu_frame_default_begin (GskGpuFrame *self, + GdkDrawContext *context, + GdkMemoryDepth depth, + const cairo_region_t *region, + const graphene_rect_t *opaque) { - gdk_draw_context_begin_frame_full (context, depth, region); + gdk_draw_context_begin_frame_full (context, depth, region, opaque); } static void -gsk_gpu_frame_default_end (GskGpuFrame *self, - GdkDrawContext *context, - const graphene_rect_t *opaque) +gsk_gpu_frame_default_end (GskGpuFrame *self, + GdkDrawContext *context) { - gdk_draw_context_end_frame_full (context, opaque); + gdk_draw_context_end_frame_full (context); } static void @@ -203,17 +203,17 @@ void gsk_gpu_frame_begin (GskGpuFrame *self, GdkDrawContext *context, GdkMemoryDepth depth, - const cairo_region_t *region) + const cairo_region_t *region, + const graphene_rect_t *opaque) { - GSK_GPU_FRAME_GET_CLASS (self)->begin (self, context, depth, region); + GSK_GPU_FRAME_GET_CLASS (self)->begin (self, context, depth, region, opaque); } void -gsk_gpu_frame_end (GskGpuFrame *self, - GdkDrawContext *context, - const graphene_rect_t *opaque) +gsk_gpu_frame_end (GskGpuFrame *self, + GdkDrawContext *context) { - GSK_GPU_FRAME_GET_CLASS (self)->end (self, context, opaque); + GSK_GPU_FRAME_GET_CLASS (self)->end (self, context); } GskGpuDevice * diff --git a/gsk/gpu/gskgpuframeprivate.h b/gsk/gpu/gskgpuframeprivate.h index b416e7d75b..c142bafd27 100644 --- a/gsk/gpu/gskgpuframeprivate.h +++ b/gsk/gpu/gskgpuframeprivate.h @@ -30,10 +30,10 @@ struct _GskGpuFrameClass void (* begin) (GskGpuFrame *self, GdkDrawContext *context, GdkMemoryDepth depth, - const cairo_region_t *region); - void (* end) (GskGpuFrame *self, - GdkDrawContext *context, + const cairo_region_t *region, const graphene_rect_t *opaque); + void (* end) (GskGpuFrame *self, + GdkDrawContext *context); GskGpuImage * (* upload_texture) (GskGpuFrame *self, gboolean with_mipmap, GdkTexture *texture); @@ -67,10 +67,10 @@ gsize gsk_gpu_frame_get_texture_vertex_size (GskGpuF void gsk_gpu_frame_begin (GskGpuFrame *self, GdkDrawContext *context, GdkMemoryDepth depth, - const cairo_region_t *region); -void gsk_gpu_frame_end (GskGpuFrame *self, - GdkDrawContext *context, + const cairo_region_t *region, const graphene_rect_t *opaque); +void gsk_gpu_frame_end (GskGpuFrame *self, + GdkDrawContext *context); GdkDrawContext * gsk_gpu_frame_get_context (GskGpuFrame *self) G_GNUC_PURE; GskGpuDevice * gsk_gpu_frame_get_device (GskGpuFrame *self) G_GNUC_PURE; diff --git a/gsk/gpu/gskgpurenderer.c b/gsk/gpu/gskgpurenderer.c index 5339e009b7..8c86e1888e 100644 --- a/gsk/gpu/gskgpurenderer.c +++ b/gsk/gpu/gskgpurenderer.c @@ -420,7 +420,8 @@ gsk_gpu_renderer_render (GskRenderer *renderer, GskGpuFrame *frame; GskGpuImage *backbuffer; cairo_region_t *render_region; - graphene_rect_t opaque; + graphene_rect_t opaque_tmp; + const graphene_rect_t *opaque; double scale; GdkMemoryDepth depth; @@ -438,7 +439,11 @@ gsk_gpu_renderer_render (GskRenderer *renderer, frame = gsk_gpu_renderer_get_frame (self); scale = gsk_gpu_renderer_get_scale (self); - gsk_gpu_frame_begin (frame, priv->context, depth, region); + if (gsk_render_node_get_opaque_rect (root, &opaque_tmp)) + opaque = &opaque_tmp; + else + opaque = NULL; + gsk_gpu_frame_begin (frame, priv->context, depth, region, opaque); backbuffer = GSK_GPU_RENDERER_GET_CLASS (self)->get_backbuffer (self); @@ -457,10 +462,7 @@ gsk_gpu_renderer_render (GskRenderer *renderer, ), NULL); - if (gsk_render_node_get_opaque_rect (root, &opaque)) - gsk_gpu_frame_end (frame, priv->context, &opaque); - else - gsk_gpu_frame_end (frame, priv->context, NULL); + gsk_gpu_frame_end (frame, priv->context); gsk_gpu_device_queue_gc (priv->device); } diff --git a/gsk/gpu/gskvulkanframe.c b/gsk/gpu/gskvulkanframe.c index 733696c6bb..f15abb8e7e 100644 --- a/gsk/gpu/gskvulkanframe.c +++ b/gsk/gpu/gskvulkanframe.c @@ -148,15 +148,16 @@ gsk_vulkan_frame_cleanup (GskGpuFrame *frame) } static void -gsk_vulkan_frame_begin (GskGpuFrame *frame, - GdkDrawContext *context, - GdkMemoryDepth depth, - const cairo_region_t *region) +gsk_vulkan_frame_begin (GskGpuFrame *frame, + GdkDrawContext *context, + GdkMemoryDepth depth, + const cairo_region_t *region, + const graphene_rect_t *opaque) { GskVulkanFrame *self = GSK_VULKAN_FRAME (frame); gdk_vulkan_context_set_draw_semaphore (GDK_VULKAN_CONTEXT (context), self->vk_acquire_semaphore); - GSK_GPU_FRAME_CLASS (gsk_vulkan_frame_parent_class)->begin (frame, context, depth, region); + GSK_GPU_FRAME_CLASS (gsk_vulkan_frame_parent_class)->begin (frame, context, depth, region, opaque); } static GskGpuImage * diff --git a/gsk/gskcairorenderer.c b/gsk/gskcairorenderer.c index 1ed8cab895..65363a563f 100644 --- a/gsk/gskcairorenderer.c +++ b/gsk/gskcairorenderer.c @@ -159,12 +159,18 @@ gsk_cairo_renderer_render (GskRenderer *renderer, const cairo_region_t *region) { GskCairoRenderer *self = GSK_CAIRO_RENDERER (renderer); - graphene_rect_t opaque; + graphene_rect_t opaque_tmp; + const graphene_rect_t *opaque; cairo_t *cr; + if (gsk_render_node_get_opaque_rect (root, &opaque_tmp)) + opaque = &opaque_tmp; + else + opaque = NULL; gdk_draw_context_begin_frame_full (GDK_DRAW_CONTEXT (self->cairo_context), GDK_MEMORY_U8, - region); + region, + opaque); cr = gdk_cairo_context_cairo_create (self->cairo_context); g_return_if_fail (cr != NULL); @@ -190,10 +196,7 @@ gsk_cairo_renderer_render (GskRenderer *renderer, cairo_destroy (cr); - if (gsk_render_node_get_opaque_rect (root, &opaque)) - gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->cairo_context), &opaque); - else - gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->cairo_context), NULL); + gdk_draw_context_end_frame_full (GDK_DRAW_CONTEXT (self->cairo_context)); } static void