From 340c98c6cd4e7124b0a81933a593d2ca6f810820 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 12 Jul 2024 14:20:12 +0200 Subject: [PATCH] gpu: Split a function Split drawing the tiles from setting up the offscreen for drawing the tiles. --- gsk/gpu/gskgpunodeprocessor.c | 73 +++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index ef6482999b..01c53ef4b9 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -1727,28 +1727,27 @@ gsk_gpu_lookup_texture (GskGpuFrame *frame, return image; } -static GskGpuImage * -gsk_gpu_get_texture_tiles_as_image (GskGpuFrame *frame, - GdkColorState *ccs, - const graphene_rect_t *clip_bounds, - const graphene_vec2_t *scale, - const graphene_rect_t *texture_bounds, - GdkTexture *texture) +/* must be set up with BLEND_ADD to avoid seams */ +static void +gsk_gpu_node_processor_draw_texture_tiles (GskGpuNodeProcessor *self, + const graphene_rect_t *texture_bounds, + GdkTexture *texture) { - GskGpuNodeProcessor self; GskGpuCache *cache; GskGpuDevice *device; gint64 timestamp; - GskGpuImage *image, *tile; + GskGpuImage *tile; GdkColorState *tile_cs; GdkMemoryTexture *memtex; GdkTexture *subtex; float scaled_tile_width, scaled_tile_height; gsize tile_size, width, height, n_width, n_height, x, y; + graphene_rect_t clip_bounds; - device = gsk_gpu_frame_get_device (frame); + device = gsk_gpu_frame_get_device (self->frame); cache = gsk_gpu_device_get_cache (device); - timestamp = gsk_gpu_frame_get_timestamp (frame); + timestamp = gsk_gpu_frame_get_timestamp (self->frame); + gsk_gpu_node_processor_get_clip_bounds (self, &clip_bounds); tile_size = gsk_gpu_device_get_tile_size (device); width = gdk_texture_get_width (texture); height = gdk_texture_get_height (texture); @@ -1757,19 +1756,6 @@ gsk_gpu_get_texture_tiles_as_image (GskGpuFrame *frame, scaled_tile_width = texture_bounds->size.width * tile_size / width; scaled_tile_height = texture_bounds->size.height * tile_size / height; - image = gsk_gpu_node_processor_init_draw (&self, - frame, - ccs, - gdk_texture_get_depth (texture), - scale, - clip_bounds); - if (image == NULL) - return NULL; - - self.blend = GSK_GPU_BLEND_ADD; - self.pending_globals |= GSK_GPU_GLOBAL_BLEND; - gsk_gpu_node_processor_sync_globals (&self, 0); - memtex = NULL; for (y = 0; y < n_height; y++) { @@ -1780,7 +1766,7 @@ gsk_gpu_get_texture_tiles_as_image (GskGpuFrame *frame, scaled_tile_width, scaled_tile_height); if (!gsk_rect_intersection (&tile_rect, texture_bounds, &tile_rect) || - !gsk_rect_intersects (clip_bounds, &tile_rect)) + !gsk_rect_intersects (&clip_bounds, &tile_rect)) continue; tile = gsk_gpu_cache_lookup_tile (cache, texture, y * n_width + x, timestamp); @@ -1793,7 +1779,7 @@ gsk_gpu_get_texture_tiles_as_image (GskGpuFrame *frame, y * tile_size, MIN (tile_size, width - x * tile_size), MIN (tile_size, height - y * tile_size)); - tile = gsk_gpu_upload_texture_op_try (self.frame, FALSE, subtex); + tile = gsk_gpu_upload_texture_op_try (self->frame, FALSE, subtex); g_object_unref (subtex); if (tile == NULL) { @@ -1812,7 +1798,7 @@ gsk_gpu_get_texture_tiles_as_image (GskGpuFrame *frame, g_assert (tile_cs); } - gsk_gpu_node_processor_image_op (&self, + gsk_gpu_node_processor_image_op (self, tile, tile_cs, GSK_GPU_SAMPLER_DEFAULT, @@ -1824,9 +1810,38 @@ gsk_gpu_get_texture_tiles_as_image (GskGpuFrame *frame, } out: - gsk_gpu_node_processor_finish_draw (&self, image); - g_clear_object (&memtex); +} + +static GskGpuImage * +gsk_gpu_get_texture_tiles_as_image (GskGpuFrame *frame, + GdkColorState *ccs, + const graphene_rect_t *clip_bounds, + const graphene_vec2_t *scale, + const graphene_rect_t *texture_bounds, + GdkTexture *texture) +{ + GskGpuNodeProcessor self; + GskGpuImage *image; + + image = gsk_gpu_node_processor_init_draw (&self, + frame, + ccs, + gdk_texture_get_depth (texture), + scale, + clip_bounds); + if (image == NULL) + return NULL; + + self.blend = GSK_GPU_BLEND_ADD; + self.pending_globals |= GSK_GPU_GLOBAL_BLEND; + gsk_gpu_node_processor_sync_globals (&self, 0); + + gsk_gpu_node_processor_draw_texture_tiles (&self, + texture_bounds, + texture); + + gsk_gpu_node_processor_finish_draw (&self, image); return image; }