From 1e75fc35c89cc7ecd4a0572ef7fae7773fbd9528 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 22 Jul 2023 05:21:30 +0200 Subject: [PATCH 1/4] tools: No need for --force when specifying filename If people specify the filename, they should know what they're doing. If they don't, abort if the guessed filename already exists and insist on the user explicitly giving it. --- tools/gtk-rendernode-tool-render.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/tools/gtk-rendernode-tool-render.c b/tools/gtk-rendernode-tool-render.c index 420a323aba..c8fb133c2a 100644 --- a/tools/gtk-rendernode-tool-render.c +++ b/tools/gtk-rendernode-tool-render.c @@ -51,8 +51,7 @@ get_save_filename (const char *filename) static void render_file (const char *filename, const char *renderer_name, - const char *save_file, - gboolean force) + const char *save_file) { GskRenderNode *node; GBytes *bytes; @@ -76,15 +75,17 @@ render_file (const char *filename, save_to = (char *)save_file; if (save_to == NULL) - save_to = get_save_filename (filename); - - if (g_file_test (save_to, G_FILE_TEST_EXISTS) && !force) { - g_printerr (_("File %s exists.\n" - "Use --force to overwrite.\n"), save_to); - exit (1); + save_to = get_save_filename (filename); + if (g_file_test (save_to, G_FILE_TEST_EXISTS)) + { + g_printerr (_("File %s exists.\n" + "If you want to overwrite, specify the filename.\n"), save_to); + exit (1); + } } + bytes = gdk_texture_save_to_png_bytes (texture); if (g_file_set_contents (save_to, @@ -116,11 +117,9 @@ do_render (int *argc, { GOptionContext *context; char **filenames = NULL; - gboolean force = FALSE; char *renderer = NULL; const GOptionEntry entries[] = { { "renderer", 0, 0, G_OPTION_ARG_STRING, &renderer, N_("Renderer to use"), N_("RENDERER") }, - { "force", 0, 0, G_OPTION_ARG_NONE, &force, N_("Overwrite existing file"), NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL, N_("FILE…") }, { NULL, } }; @@ -159,7 +158,7 @@ do_render (int *argc, exit (1); } - render_file (filenames[0], renderer, filenames[1], force); + render_file (filenames[0], renderer, filenames[1]); g_strfreev (filenames); } From 00b5df6b0603c6d3e7a113cc66651dc91f2b9f2c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 22 Jul 2023 23:25:33 +0200 Subject: [PATCH 2/4] vulkan: Plug a memleak This one was introduced in cd84f5a56ef. --- gsk/vulkan/gskvulkanrenderpassop.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gsk/vulkan/gskvulkanrenderpassop.c b/gsk/vulkan/gskvulkanrenderpassop.c index 0a785984d2..c63eda0d68 100644 --- a/gsk/vulkan/gskvulkanrenderpassop.c +++ b/gsk/vulkan/gskvulkanrenderpassop.c @@ -325,5 +325,7 @@ gsk_vulkan_render_pass_op_offscreen (GskVulkanRender *render, image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + g_object_unref (image); + return image; } From a4247f1358407d866353f99e60f81f5eb92f92a0 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 22 Jul 2023 23:26:44 +0200 Subject: [PATCH 3/4] vulkan: Plug a memleak This one was introduced in 4d9e7d30b00. --- gsk/vulkan/gskvulkanrenderpass.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index b680b8c9b0..7725f3beeb 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -184,6 +184,8 @@ gsk_vulkan_render_pass_upload_texture (GskVulkanRender *render, gsk_vulkan_render_pass_end_op (render, better_image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + g_object_unref (better_image); + return better_image; } From 1bd820fc60e3ce6dce20ac20613537ed4950719c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 22 Jul 2023 00:54:03 +0200 Subject: [PATCH 4/4] vulkan: Clean up renderpass/offscreen creation Instead of scale and whatnot, pass: 1. The image size 2. The viewport to map to that image size and compute everything else from there. In particular, we set the Vulkan viewport to the image dimensions instead of the viewport size. All of this makes things a lot simpler while keeping the required functionality. --- gsk/vulkan/gskvulkanrender.c | 27 +++------------- gsk/vulkan/gskvulkanrenderer.c | 8 ++++- gsk/vulkan/gskvulkanrenderpass.c | 27 +++++++--------- gsk/vulkan/gskvulkanrenderpassop.c | 39 +++++++---------------- gsk/vulkan/gskvulkanrenderpassopprivate.h | 1 - gsk/vulkan/gskvulkanrenderpassprivate.h | 7 ++-- 6 files changed, 38 insertions(+), 71 deletions(-) diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index b84810cab2..9e3c0cbca9 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -50,7 +50,6 @@ struct _GskVulkanRender GskRenderer *renderer; GdkVulkanContext *vulkan; - double scale; graphene_rect_t viewport; cairo_region_t *clip; @@ -175,22 +174,9 @@ gsk_vulkan_render_setup (GskVulkanRender *self, const graphene_rect_t *rect, const cairo_region_t *clip) { - GdkSurface *surface = gsk_renderer_get_surface (self->renderer); - self->target = g_object_ref (target); + self->viewport = *rect; - if (rect) - { - self->viewport = *rect; - self->scale = 1.0; - } - else - { - self->scale = gdk_surface_get_scale (surface); - self->viewport = GRAPHENE_RECT_INIT (0, 0, - (int) ceil (gdk_surface_get_width (surface) * self->scale), - (int) ceil (gdk_surface_get_height (surface) * self->scale)); - } if (clip) { self->clip = cairo_region_reference ((cairo_region_t *) clip); @@ -492,27 +478,24 @@ gsk_vulkan_render_add_node (GskVulkanRender *self, gpointer download_data) { GskVulkanRenderPass *render_pass; - graphene_vec2_t scale; cairo_rectangle_int_t extents; - graphene_vec2_init (&scale, self->scale, self->scale); cairo_region_get_extents (self->clip, &extents); gsk_vulkan_render_pass_begin_op (self, g_object_ref (self->target), &extents, - &self->viewport.size, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - render_pass = gsk_vulkan_render_pass_new (); gsk_vulkan_render_pass_add (render_pass, self, - &scale, - &self->viewport, + gsk_vulkan_image_get_width (self->target), + gsk_vulkan_image_get_height (self->target), &extents, - node); + node, + &self->viewport); gsk_vulkan_render_pass_free (render_pass); gsk_vulkan_render_pass_end_op (self, diff --git a/gsk/vulkan/gskvulkanrenderer.c b/gsk/vulkan/gskvulkanrenderer.c index c10588436c..08fcd3b278 100644 --- a/gsk/vulkan/gskvulkanrenderer.c +++ b/gsk/vulkan/gskvulkanrenderer.c @@ -353,6 +353,7 @@ gsk_vulkan_renderer_render (GskRenderer *renderer, { GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer); GskVulkanRender *render; + GdkSurface *surface; cairo_region_t *render_region; #ifdef G_ENABLE_DEBUG GskProfiler *profiler; @@ -372,13 +373,18 @@ gsk_vulkan_renderer_render (GskRenderer *renderer, gsk_render_node_get_preferred_depth (root), region); render = gsk_vulkan_renderer_get_render (self); + surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self->vulkan)); render_region = get_render_region (self); draw_index = gdk_vulkan_context_get_draw_index (self->vulkan); gsk_vulkan_render_render (render, self->targets[draw_index], - NULL, + &GRAPHENE_RECT_INIT( + 0, 0, + gdk_surface_get_width (surface), + gdk_surface_get_height (surface) + ), render_region, root, NULL, NULL); diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 7725f3beeb..56f190580c 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -164,7 +164,6 @@ gsk_vulkan_render_pass_upload_texture (GskVulkanRender *render, gsk_vulkan_render_pass_begin_op (render, g_object_ref (better_image), &(cairo_rectangle_int_t) { 0, 0, width, height }, - &GRAPHENE_SIZE_INIT(width, height), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); gsk_vulkan_scissor_op (render, &(cairo_rectangle_int_t) { 0, 0, width, height }); @@ -1304,31 +1303,27 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self, void gsk_vulkan_render_pass_add (GskVulkanRenderPass *self, GskVulkanRender *render, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport, + int width, + int height, cairo_rectangle_int_t *clip, - GskRenderNode *node) + GskRenderNode *node, + const graphene_rect_t *viewport) { GskVulkanParseState state; - graphene_rect_t scaled_clip; - float scale_x, scale_y; - scale_x = 1 / graphene_vec2_get_x (scale); - scale_y = 1 / graphene_vec2_get_y (scale); state.scissor = *clip; - scaled_clip = GRAPHENE_RECT_INIT(clip->x, clip->y, clip->width, clip->height); - graphene_rect_scale (&scaled_clip, scale_x, scale_y, &scaled_clip); - gsk_vulkan_clip_init_empty (&state.clip, &scaled_clip); + gsk_vulkan_clip_init_empty (&state.clip, &GRAPHENE_RECT_INIT (0, 0, viewport->size.width, viewport->size.height)); state.modelview = NULL; graphene_matrix_init_ortho (&state.projection, - 0, viewport->size.width, - 0, viewport->size.height, + 0, width, + 0, height, 2 * ORTHO_NEAR_PLANE - ORTHO_FAR_PLANE, ORTHO_FAR_PLANE); - graphene_vec2_init_from_vec2 (&state.scale, scale); - state.offset = GRAPHENE_POINT_INIT (-viewport->origin.x * scale_x, - -viewport->origin.y * scale_y); + graphene_vec2_init (&state.scale, width / viewport->size.width, + height / viewport->size.height); + state.offset = GRAPHENE_POINT_INIT (-viewport->origin.x, + -viewport->origin.y); gsk_vulkan_render_pass_append_scissor (render, node, &state); gsk_vulkan_render_pass_append_push_constants (render, node, &state); diff --git a/gsk/vulkan/gskvulkanrenderpassop.c b/gsk/vulkan/gskvulkanrenderpassop.c index c63eda0d68..dcfa1fa7f3 100644 --- a/gsk/vulkan/gskvulkanrenderpassop.c +++ b/gsk/vulkan/gskvulkanrenderpassop.c @@ -16,7 +16,6 @@ struct _GskVulkanRenderPassOp GskVulkanImage *image; cairo_rectangle_int_t area; - graphene_size_t viewport_size; VkImageLayout initial_layout; VkImageLayout final_layout; @@ -117,8 +116,8 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp *op, &(VkViewport) { .x = 0, .y = 0, - .width = self->viewport_size.width, - .height = self->viewport_size.height, + .width = gsk_vulkan_image_get_width (self->image), + .height = gsk_vulkan_image_get_height (self->image), .minDepth = 0, .maxDepth = 1 }); @@ -244,7 +243,6 @@ void gsk_vulkan_render_pass_begin_op (GskVulkanRender *render, GskVulkanImage *image, const cairo_rectangle_int_t *area, - const graphene_size_t *viewport_size, VkImageLayout initial_layout, VkImageLayout final_layout) { @@ -256,7 +254,6 @@ gsk_vulkan_render_pass_begin_op (GskVulkanRender *render, self->initial_layout = initial_layout; self->final_layout = final_layout; self->area = *area; - self->viewport_size = *viewport_size; } void @@ -280,45 +277,31 @@ gsk_vulkan_render_pass_op_offscreen (GskVulkanRender *render, { GskVulkanRenderPass *render_pass; GdkVulkanContext *context; - graphene_rect_t view; GskVulkanImage *image; - float scale_x, scale_y; + int width, height; - scale_x = graphene_vec2_get_x (scale); - scale_y = graphene_vec2_get_y (scale); - view = GRAPHENE_RECT_INIT (scale_x * viewport->origin.x, - scale_y * viewport->origin.y, - ceil (scale_x * viewport->size.width), - ceil (scale_y * viewport->size.height)); + width = ceil (graphene_vec2_get_x (scale) * viewport->size.width); + height = ceil (graphene_vec2_get_y (scale) * viewport->size.height); context = gsk_vulkan_render_get_context (render); image = gsk_vulkan_image_new_for_offscreen (context, gdk_vulkan_context_get_offscreen_format (context, gsk_render_node_get_preferred_depth (node)), - view.size.width, view.size.height); + width, height); gsk_vulkan_render_pass_begin_op (render, image, - &(cairo_rectangle_int_t) { - 0, 0, - gsk_vulkan_image_get_width (image), - gsk_vulkan_image_get_height (image) - }, - &viewport->size, + &(cairo_rectangle_int_t) { 0, 0, width, height }, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); render_pass = gsk_vulkan_render_pass_new (); gsk_vulkan_render_pass_add (render_pass, render, - scale, - viewport, - &(cairo_rectangle_int_t) { - 0, 0, - gsk_vulkan_image_get_width (image), - gsk_vulkan_image_get_height (image) - }, - node); + width, height, + &(cairo_rectangle_int_t) { 0, 0, width, height }, + node, + viewport); gsk_vulkan_render_pass_free (render_pass); gsk_vulkan_render_pass_end_op (render, diff --git a/gsk/vulkan/gskvulkanrenderpassopprivate.h b/gsk/vulkan/gskvulkanrenderpassopprivate.h index ad7b90ddc2..e8a6b0b4a7 100644 --- a/gsk/vulkan/gskvulkanrenderpassopprivate.h +++ b/gsk/vulkan/gskvulkanrenderpassopprivate.h @@ -8,7 +8,6 @@ G_BEGIN_DECLS void gsk_vulkan_render_pass_begin_op (GskVulkanRender *render, GskVulkanImage *image, const cairo_rectangle_int_t *area, - const graphene_size_t *viewport_size, VkImageLayout initial_layout, VkImageLayout final_layout); void gsk_vulkan_render_pass_end_op (GskVulkanRender *render, diff --git a/gsk/vulkan/gskvulkanrenderpassprivate.h b/gsk/vulkan/gskvulkanrenderpassprivate.h index 62b31ee143..ae505af5f7 100644 --- a/gsk/vulkan/gskvulkanrenderpassprivate.h +++ b/gsk/vulkan/gskvulkanrenderpassprivate.h @@ -16,10 +16,11 @@ void gsk_vulkan_render_pass_free (GskVulk void gsk_vulkan_render_pass_add (GskVulkanRenderPass *self, GskVulkanRender *render, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport, + int width, + int height, cairo_rectangle_int_t *clip, - GskRenderNode *node); + GskRenderNode *node, + const graphene_rect_t *viewport); G_END_DECLS