diff --git a/gdk/wayland/gdksubsurface-wayland.c b/gdk/wayland/gdksubsurface-wayland.c index db4dfc0000..045e5e5998 100644 --- a/gdk/wayland/gdksubsurface-wayland.c +++ b/gdk/wayland/gdksubsurface-wayland.c @@ -149,18 +149,6 @@ get_wl_buffer (GdkWaylandSubsurface *self, return buffer; } -static inline gboolean -texture_is_offloadable (GdkTexture *texture) -{ - GdkMemoryFormat format; - - if (!GDK_IS_DMABUF_TEXTURE (texture)) - return FALSE; - - format = gdk_texture_get_format (texture); - return gdk_memory_format_alpha (format) == GDK_MEMORY_ALPHA_OPAQUE; -} - static gboolean gdk_wayland_subsurface_attach (GdkSubsurface *sub, GdkTexture *texture, @@ -176,21 +164,61 @@ gdk_wayland_subsurface_attach (GdkSubsurface *sub, return FALSE; } - self->dest.x = floorf (rect->origin.x); - self->dest.y = floorf (rect->origin.y); - self->dest.width = ceilf (rect->origin.x + rect->size.width) - self->dest.x; - self->dest.height = ceilf (rect->origin.y + rect->size.height) - self->dest.y; + self->dest.x = rect->origin.x; + self->dest.y = rect->origin.y; + self->dest.width = rect->size.width; + self->dest.height = rect->size.height; - wl_subsurface_set_position (self->subsurface, self->dest.x, self->dest.y); - wp_viewport_set_destination (self->viewport, self->dest.width, self->dest.height); - - if (texture_is_offloadable (texture)) - buffer = get_wl_buffer (self, texture); + if (self->dest.x != rect->origin.x || + self->dest.y != rect->origin.y || + self->dest.width != rect->size.width || + self->dest.height != rect->size.height) + { + GDK_DISPLAY_DEBUG (gdk_surface_get_display (sub->parent), OFFLOAD, + "Non-integer coordinates %g %g %g %g for %dx%d texture, hiding subsurface %p", + rect->origin.x, rect->origin.y, + rect->size.width, rect->size.height, + gdk_texture_get_width (texture), + gdk_texture_get_height (texture), + self); + } + else if (!GDK_IS_DMABUF_TEXTURE (texture)) + { + GDK_DISPLAY_DEBUG (gdk_surface_get_display (sub->parent), OFFLOAD, + "%dx%d %s is not a GdkDmabufTexture, hiding subsurface %p", + gdk_texture_get_width (texture), + gdk_texture_get_height (texture), + G_OBJECT_TYPE_NAME (texture), + self); + } + else if (gdk_memory_format_alpha (gdk_texture_get_format (texture)) != GDK_MEMORY_ALPHA_OPAQUE) + { + GDK_DISPLAY_DEBUG (gdk_surface_get_display (sub->parent), OFFLOAD, + "Cannot offload non-opaque %dx%d texture, hiding subsurface %p", + gdk_texture_get_width (texture), + gdk_texture_get_height (texture), + self); + } + else + { + buffer = get_wl_buffer (self, texture); + if (buffer == NULL) + { + GDK_DISPLAY_DEBUG (gdk_surface_get_display (sub->parent), OFFLOAD, + "Compositor failed to create wl_buffer for %dx%d texture, hiding subsurface %p", + gdk_texture_get_width (texture), + gdk_texture_get_height (texture), + self); + } + } if (buffer) { g_set_object (&self->texture, texture); + wl_subsurface_set_position (self->subsurface, self->dest.x, self->dest.y); + wp_viewport_set_destination (self->viewport, self->dest.width, self->dest.height); + wl_surface_attach (self->surface, buffer, 0, 0); wl_surface_damage_buffer (self->surface, 0, 0, @@ -208,12 +236,6 @@ gdk_wayland_subsurface_attach (GdkSubsurface *sub, } else { - GDK_DISPLAY_DEBUG (gdk_surface_get_display (sub->parent), OFFLOAD, - "Failed to create wl_buffer for %dx%d texture, hiding subsurface %p", - gdk_texture_get_width (texture), - gdk_texture_get_height (texture), - self); - g_set_object (&self->texture, NULL); wl_surface_attach (self->surface, NULL, 0, 0); diff --git a/gsk/broadway/gskbroadwayrenderer.c b/gsk/broadway/gskbroadwayrenderer.c index ea9ae84e24..c89f471b02 100644 --- a/gsk/broadway/gskbroadwayrenderer.c +++ b/gsk/broadway/gskbroadwayrenderer.c @@ -919,8 +919,7 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer, static void gsk_broadway_renderer_render (GskRenderer *renderer, GskRenderNode *root, - const cairo_region_t *update_area, - GskOffload *offload) + const cairo_region_t *update_area) { GskBroadwayRenderer *self = GSK_BROADWAY_RENDERER (renderer); diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 717ecb37a2..5780ad3eb3 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -275,8 +275,7 @@ update_area_requires_clear (GdkSurface *surface, static void gsk_gl_renderer_render (GskRenderer *renderer, GskRenderNode *root, - const cairo_region_t *update_area, - GskOffload *offload) + const cairo_region_t *update_area) { GskGLRenderer *self = (GskGLRenderer *)renderer; cairo_region_t *render_region; @@ -314,7 +313,7 @@ gsk_gl_renderer_render (GskRenderer *renderer, clear_framebuffer = update_area_requires_clear (surface, render_region); gsk_gl_driver_begin_frame (self->driver, self->command_queue); - job = gsk_gl_render_job_new (self->driver, &viewport, scale, render_region, 0, clear_framebuffer, offload); + job = gsk_gl_render_job_new (self->driver, &viewport, scale, render_region, 0, clear_framebuffer); if (GSK_RENDERER_DEBUG_CHECK (GSK_RENDERER (self), FALLBACK)) gsk_gl_render_job_set_debug_fallback (job, TRUE); gsk_gl_render_job_render (job, root); @@ -400,7 +399,7 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer, &render_target)) { gsk_gl_driver_begin_frame (self->driver, self->command_queue); - job = gsk_gl_render_job_new (self->driver, viewport, 1, NULL, render_target->framebuffer_id, TRUE, NULL); + job = gsk_gl_render_job_new (self->driver, viewport, 1, NULL, render_target->framebuffer_id, TRUE); if (GSK_RENDERER_DEBUG_CHECK (GSK_RENDERER (self), FALLBACK)) gsk_gl_render_job_set_debug_fallback (job, TRUE); gsk_gl_render_job_render_flipped (job, root); diff --git a/gsk/gl/gskglrenderjob.c b/gsk/gl/gskglrenderjob.c index 5e7910f7c5..9522ad6e6c 100644 --- a/gsk/gl/gskglrenderjob.c +++ b/gsk/gl/gskglrenderjob.c @@ -37,7 +37,6 @@ #include #include #include -#include #include #include @@ -180,8 +179,6 @@ struct _GskGLRenderJob * looking at the format of the framebuffer we are rendering on. */ int target_format; - - GskOffload *offload; }; typedef struct _GskGLRenderOffscreen @@ -4014,20 +4011,24 @@ gsk_gl_render_job_visit_subsurface_node (GskGLRenderJob *job, subsurface = (GdkSubsurface *) gsk_subsurface_node_get_subsurface (node); - if (job->offload && - gsk_offload_subsurface_is_offloaded (job->offload, subsurface)) + if (subsurface && + gdk_subsurface_get_texture (subsurface) && + gdk_subsurface_get_parent (subsurface) == gdk_gl_context_get_surface (job->command_queue->context)) { - /* Clear the area so we can see through */ - if (gsk_gl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color))) + if (!gdk_subsurface_is_above_parent (subsurface)) { - GskGLCommandBatch *batch; - guint16 color[4]; - rgba_to_half (&(GdkRGBA){0,0,0,0}, color); + /* Clear the area so we can see through */ + if (gsk_gl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color))) + { + GskGLCommandBatch *batch; + guint16 color[4]; + rgba_to_half (&(GdkRGBA){0,0,0,0}, color); - batch = gsk_gl_command_queue_get_batch (job->command_queue); - batch->draw.blend = 0; - gsk_gl_render_job_draw_rect_with_color (job, &node->bounds, color); - gsk_gl_render_job_end_draw (job); + batch = gsk_gl_command_queue_get_batch (job->command_queue); + batch->draw.blend = 0; + gsk_gl_render_job_draw_rect_with_color (job, &node->bounds, color); + gsk_gl_render_job_end_draw (job); + } } } else @@ -4618,8 +4619,7 @@ gsk_gl_render_job_new (GskGLDriver *driver, float scale, const cairo_region_t *region, guint framebuffer, - gboolean clear_framebuffer, - GskOffload *offload) + gboolean clear_framebuffer) { const graphene_rect_t *clip_rect = viewport; graphene_rect_t transformed_extents; @@ -4655,7 +4655,6 @@ gsk_gl_render_job_new (GskGLDriver *driver, job->scale_y = scale; job->viewport = *viewport; job->target_format = get_framebuffer_format (job->command_queue->context, framebuffer); - job->offload = offload; gsk_gl_render_job_set_alpha (job, 1.0f); gsk_gl_render_job_set_projection_from_rect (job, viewport, NULL); diff --git a/gsk/gl/gskglrenderjobprivate.h b/gsk/gl/gskglrenderjobprivate.h index 04aee7024d..32edae12a3 100644 --- a/gsk/gl/gskglrenderjobprivate.h +++ b/gsk/gl/gskglrenderjobprivate.h @@ -27,8 +27,7 @@ GskGLRenderJob *gsk_gl_render_job_new (GskGLDriver *dri float scale, const cairo_region_t *region, guint framebuffer, - gboolean clear_framebuffer, - GskOffload *offload); + gboolean clear_framebuffer); void gsk_gl_render_job_free (GskGLRenderJob *job); void gsk_gl_render_job_render (GskGLRenderJob *job, GskRenderNode *root); diff --git a/gsk/gskcairorenderer.c b/gsk/gskcairorenderer.c index 3ea2f08b1b..71725f4b2f 100644 --- a/gsk/gskcairorenderer.c +++ b/gsk/gskcairorenderer.c @@ -152,8 +152,7 @@ gsk_cairo_renderer_render_texture (GskRenderer *renderer, static void gsk_cairo_renderer_render (GskRenderer *renderer, GskRenderNode *root, - const cairo_region_t *region, - GskOffload *offload) + const cairo_region_t *region) { GskCairoRenderer *self = GSK_CAIRO_RENDERER (renderer); cairo_t *cr; diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c index d50a6788e3..e6c703a343 100644 --- a/gsk/gskrenderer.c +++ b/gsk/gskrenderer.c @@ -128,8 +128,7 @@ gsk_renderer_real_render_texture (GskRenderer *self, static void gsk_renderer_real_render (GskRenderer *self, GskRenderNode *root, - const cairo_region_t *region, - GskOffload *offload) + const cairo_region_t *region) { GSK_RENDERER_WARN_NOT_IMPLEMENTED_METHOD (self, render); } @@ -453,7 +452,7 @@ gsk_renderer_render (GskRenderer *renderer, gsk_render_node_diff (priv->prev_node, root, clip, offload); } - renderer_class->render (renderer, root, clip, offload); + renderer_class->render (renderer, root, clip); if (GSK_RENDERER_DEBUG_CHECK (renderer, RENDERER)) { diff --git a/gsk/gskrendererprivate.h b/gsk/gskrendererprivate.h index dc6305caa9..b1742e4bf7 100644 --- a/gsk/gskrendererprivate.h +++ b/gsk/gskrendererprivate.h @@ -50,8 +50,7 @@ struct _GskRendererClass const graphene_rect_t *viewport); void (* render) (GskRenderer *renderer, GskRenderNode *root, - const cairo_region_t *invalid, - GskOffload *offload); + const cairo_region_t *invalid); }; GskProfiler * gsk_renderer_get_profiler (GskRenderer *renderer); diff --git a/gsk/vulkan/gskvulkanrenderer.c b/gsk/vulkan/gskvulkanrenderer.c index d14735c5e1..08fcd3b278 100644 --- a/gsk/vulkan/gskvulkanrenderer.c +++ b/gsk/vulkan/gskvulkanrenderer.c @@ -349,8 +349,7 @@ gsk_vulkan_renderer_render_texture (GskRenderer *renderer, static void gsk_vulkan_renderer_render (GskRenderer *renderer, GskRenderNode *root, - const cairo_region_t *region, - GskOffload *offload) + const cairo_region_t *region) { GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer); GskVulkanRender *render;