summaryrefslogtreecommitdiff
path: root/gsk
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2016-12-31 22:58:15 +0100
committerBenjamin Otte <otte@redhat.com>2017-01-01 19:53:36 +0100
commit2fe01a5b570972d01d33a405cf603736bbb94b97 (patch)
tree9b116855986e1200f116f709c833ce80e8b1dd1c /gsk
parentd915292db994130cdceab9dab4e432f257e762d4 (diff)
downloadgtk+-2fe01a5b570972d01d33a405cf603736bbb94b97.tar.gz
vulkan: Optimize getting textures
When we already have a texture or know we need to upload, just do that instead of rendering to Cairo.
Diffstat (limited to 'gsk')
-rw-r--r--gsk/gskvulkanrenderpass.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c
index b9136bce4e..68b9e48dc7 100644
--- a/gsk/gskvulkanrenderpass.c
+++ b/gsk/gskvulkanrenderpass.c
@@ -324,6 +324,23 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self,
cairo_surface_t *surface;
cairo_t *cr;
+ if (graphene_rect_equal (bounds, &node->bounds))
+ {
+ switch (gsk_render_node_get_node_type (node))
+ {
+ case GSK_TEXTURE_NODE:
+ return gsk_vulkan_renderer_ref_texture_image (GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
+ gsk_texture_node_get_texture (node),
+ uploader);
+ case GSK_CAIRO_NODE:
+ surface = cairo_surface_reference (gsk_cairo_node_get_surface (node));
+ goto got_surface;
+
+ default:
+ break;
+ }
+ }
+
/* XXX: We could intersect bounds with clip bounds here */
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
ceil (bounds->size.width),
@@ -335,6 +352,7 @@ gsk_vulkan_render_pass_get_node_as_texture (GskVulkanRenderPass *self,
cairo_destroy (cr);
+got_surface:
result = gsk_vulkan_image_new_from_data (uploader,
cairo_image_surface_get_data (surface),
cairo_image_surface_get_width (surface),