diff options
author | Benjamin Otte <otte@redhat.com> | 2016-12-13 04:20:04 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2016-12-20 18:01:10 +0100 |
commit | ee9aca882d098a08a6e82a5f4d12dc437a2aff79 (patch) | |
tree | 82ea60fc0bcc4066636b4b88e0841782714e81de /gsk | |
parent | 6129daf29b2ca72187ca33cbe88311756545b494 (diff) | |
download | gtk+-ee9aca882d098a08a6e82a5f4d12dc437a2aff79.tar.gz |
gsk: Add fallback code to renderers
This code makes renderers fall back to Cairo rendering if they don't
know how to handle a render node's type.
This allows adding new render nodes with impunity.
Diffstat (limited to 'gsk')
-rw-r--r-- | gsk/gskglrenderer.c | 34 | ||||
-rw-r--r-- | gsk/gskvulkanrenderpass.c | 8 |
2 files changed, 39 insertions, 3 deletions
diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c index 5cbb0a0029..bb98e2ff42 100644 --- a/gsk/gskglrenderer.c +++ b/gsk/gskglrenderer.c @@ -760,8 +760,40 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self, return; case GSK_NOT_A_RENDER_NODE: - default: + g_assert_not_reached (); return; + + default: + { + graphene_rect_t bounds; + cairo_surface_t *surface; + cairo_t *cr; + + gsk_render_node_get_bounds (node, &bounds); + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + ceil (bounds.size.width), + ceil (bounds.size.height)); + cr = cairo_create (surface); + cairo_translate (cr, -bounds.origin.x, -bounds.origin.y); + + gsk_render_node_draw (node, cr); + + cairo_destroy (cr); + + /* Upload the Cairo surface to a GL texture */ + item.render_data.texture_id = gsk_gl_driver_create_texture (self->gl_driver, + item.size.width, + item.size.height); + gsk_gl_driver_bind_source_texture (self->gl_driver, item.render_data.texture_id); + gsk_gl_driver_init_texture_with_surface (self->gl_driver, + item.render_data.texture_id, + surface, + GL_NEAREST, GL_NEAREST); + + cairo_surface_destroy (surface); + } + break; } /* Create the vertex buffers holding the geometry of the quad */ diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c index 62af7e324c..86ac1a198b 100644 --- a/gsk/gskvulkanrenderpass.c +++ b/gsk/gskvulkanrenderpass.c @@ -72,10 +72,14 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self, switch (gsk_render_node_get_node_type (node)) { case GSK_NOT_A_RENDER_NODE: - default: g_assert_not_reached (); break; + default: + op.type = GSK_VULKAN_OP_FALLBACK; + g_array_append_val (self->render_ops, op); + break; + case GSK_CAIRO_NODE: op.type = GSK_VULKAN_OP_SURFACE; g_array_append_val (self->render_ops, op); @@ -150,7 +154,7 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self, ceil (bounds.size.width), ceil (bounds.size.height)); cr = cairo_create (surface); - cairo_translate (cr, bounds.origin.x, bounds.origin.y); + cairo_translate (cr, -bounds.origin.x, -bounds.origin.y); gsk_render_node_draw (op->node, cr); |