vulkan: Render whole texture
authorBenjamin Otte <otte@redhat.com>
Fri, 5 May 2023 07:29:47 +0000 (09:29 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 4 Jun 2023 17:42:00 +0000 (19:42 +0200)
When the node bounds were a non-integer size, the texture would get
ceil()ed pixels, but various viewport or scissor computations might
floor() instead, leaving the right/bottom row of pixels untouched.
Make sure those functions ceil(), too.

gsk/vulkan/gskvulkanrenderer.c

index 71ec47b543faa46a1a3c70674a15f1047aef87e4..a14e6bd373f852801d4305af3fef21c7c186ce53 100644 (file)
@@ -228,6 +228,7 @@ gsk_vulkan_renderer_render_texture (GskRenderer           *renderer,
   GskVulkanRender *render;
   GskVulkanImage *image;
   GdkTexture *texture;
+  graphene_rect_t rounded_viewport;
 #ifdef G_ENABLE_DEBUG
   GskProfiler *profiler;
   gint64 cpu_time;
@@ -244,11 +245,15 @@ gsk_vulkan_renderer_render_texture (GskRenderer           *renderer,
 
   render = gsk_vulkan_render_new (renderer, self->vulkan);
 
+  rounded_viewport = GRAPHENE_RECT_INIT (viewport->origin.x,
+                                         viewport->origin.y,
+                                         ceil (viewport->size.width),
+                                         ceil (viewport->size.height));
   image = gsk_vulkan_image_new_for_framebuffer (self->vulkan,
-                                                ceil (viewport->size.width),
-                                                ceil (viewport->size.height));
+                                                rounded_viewport.size.width,
+                                                rounded_viewport.size.height);
 
-  gsk_vulkan_render_reset (render, image, viewport, NULL);
+  gsk_vulkan_render_reset (render, image, &rounded_viewport, NULL);
   gsk_vulkan_render_add_node (render, root);
   gsk_vulkan_render_upload (render);
   gsk_vulkan_render_draw (render);