vulkan: Clean up renderpass/offscreen creation
authorBenjamin Otte <otte@redhat.com>
Fri, 21 Jul 2023 22:54:03 +0000 (00:54 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 22 Jul 2023 21:30:15 +0000 (23:30 +0200)
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
gsk/vulkan/gskvulkanrenderer.c
gsk/vulkan/gskvulkanrenderpass.c
gsk/vulkan/gskvulkanrenderpassop.c
gsk/vulkan/gskvulkanrenderpassopprivate.h
gsk/vulkan/gskvulkanrenderpassprivate.h

index b84810cab297f06b55c6187f4dc220f14061475b..9e3c0cbca9cf7523a3786b7c8983ac54410ab3b1 100644 (file)
@@ -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,
index c10588436c4462960e998ccdef01739746d94c14..08fcd3b278d0b1cd6eae17adff4574a1966c3600 100644 (file)
@@ -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);
index 7725f3beebb19460dc929f4fca9779e8257b24f0..56f190580c8a91bb689378811cc48e02d30d93a1 100644 (file)
@@ -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);
index c63eda0d6822496e4d9e25c84a01ee29a129abe0..dcfa1fa7f307dddd808c5096d72e3da8e1371840 100644 (file)
@@ -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,
index ad7b90ddc2e005e7bf352094013aeb81942ef8af..e8a6b0b4a7213135de2cf8dd7c9e1e8dab2aed40 100644 (file)
@@ -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,
index 62b31ee143e26d8b86a66639cf54839de609f2af..ae505af5f75b58f241a8758fc29579b2a40602e7 100644 (file)
@@ -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