From 1bd820fc60e3ce6dce20ac20613537ed4950719c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 22 Jul 2023 00:54:03 +0200 Subject: [PATCH] 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 -- 2.30.2