[gtk+/wip/otte/rendernode: 27/100] gsk: Remove world matrix support
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/otte/rendernode: 27/100] gsk: Remove world matrix support
- Date: Sun, 18 Dec 2016 06:30:57 +0000 (UTC)
commit 3783652dab71d31eabfd5d7cb1519c5776901de9
Author: Benjamin Otte <otte redhat com>
Date: Mon Dec 12 16:52:55 2016 +0100
gsk: Remove world matrix support
Use the real transform and compute it manually.
gsk/gskcairorenderer.c | 9 ++---
gsk/gskglrenderer.c | 14 +++++--
gsk/gskrendernode.c | 83 --------------------------------------------
gsk/gskrendernodeprivate.h | 11 ------
gsk/gskvulkanrenderpass.c | 8 ++--
5 files changed, 17 insertions(+), 108 deletions(-)
---
diff --git a/gsk/gskcairorenderer.c b/gsk/gskcairorenderer.c
index 3aebb41..185d976 100644
--- a/gsk/gskcairorenderer.c
+++ b/gsk/gskcairorenderer.c
@@ -53,14 +53,14 @@ gsk_cairo_renderer_render_node (GskCairoRenderer *self,
{
GskRenderNode *child;
gboolean pop_group = FALSE;
- graphene_matrix_t mvp;
+ graphene_matrix_t mat;
cairo_matrix_t ctm;
graphene_rect_t frame;
cairo_save (cr);
- gsk_render_node_get_world_matrix (node, &mvp);
- if (graphene_matrix_to_2d (&mvp, &ctm.xx, &ctm.yx, &ctm.xy, &ctm.yy, &ctm.x0, &ctm.y0))
+ gsk_render_node_get_transform (node, &mat);
+ if (graphene_matrix_to_2d (&mat, &ctm.xx, &ctm.yx, &ctm.xy, &ctm.yy, &ctm.x0, &ctm.y0))
{
GSK_NOTE (CAIRO, g_print ("CTM = { .xx = %g, .yx = %g, .xy = %g, .yy = %g, .x0 = %g, .y0 = %g }\n",
ctm.xx, ctm.yx,
@@ -105,9 +105,6 @@ gsk_cairo_renderer_render_node (GskCairoRenderer *self,
case GSK_CONTAINER_NODE:
if (gsk_render_node_get_n_children (node) != 0)
{
- cairo_matrix_invert (&ctm);
- cairo_transform (cr, &ctm);
-
GSK_NOTE (CAIRO, g_print ("Drawing %d children of node [%p]\n",
gsk_render_node_get_n_children (node),
node));
diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c
index f7d9eb9..654e5d1 100644
--- a/gsk/gskglrenderer.c
+++ b/gsk/gskglrenderer.c
@@ -617,12 +617,13 @@ render_node_needs_render_target (GskRenderNode *node)
static void
gsk_gl_renderer_add_render_item (GskGLRenderer *self,
const graphene_matrix_t *projection,
+ const graphene_matrix_t *parent_modelview,
GArray *render_items,
GskRenderNode *node,
RenderItem *parent)
{
graphene_rect_t viewport;
- graphene_matrix_t mv;
+ graphene_matrix_t mv, transform;
graphene_rect_t bounds;
GskRenderNode *child;
RenderItem item;
@@ -659,7 +660,8 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
item.max.z = 0.f;
/* The location of the item, in normalized world coordinates */
- gsk_render_node_get_world_matrix (node, &mv);
+ gsk_render_node_get_transform (node, &transform);
+ graphene_matrix_multiply (&transform, parent_modelview, &mv);
graphene_matrix_multiply (&mv, &self->mvp, &item.mvp);
item.z = project_item (projection, &mv);
@@ -791,7 +793,7 @@ out:
child != NULL;
child = gsk_render_node_get_next_sibling (child))
{
- gsk_gl_renderer_add_render_item (self, projection, render_items, child, ritem);
+ gsk_gl_renderer_add_render_item (self, projection, &mv, render_items, child, ritem);
}
}
@@ -800,12 +802,16 @@ gsk_gl_renderer_validate_tree (GskGLRenderer *self,
GskRenderNode *root,
const graphene_matrix_t *projection)
{
+ graphene_matrix_t identity;
+
if (self->gl_context == NULL)
{
GSK_NOTE (OPENGL, g_print ("No valid GL context associated to the renderer"));
return FALSE;
}
+ graphene_matrix_init_identity (&identity);
+
gdk_gl_context_make_current (self->gl_context);
self->render_items = g_array_new (FALSE, FALSE, sizeof (RenderItem));
@@ -813,7 +819,7 @@ gsk_gl_renderer_validate_tree (GskGLRenderer *self,
gsk_gl_driver_begin_frame (self->gl_driver);
GSK_NOTE (OPENGL, g_print ("RenderNode -> RenderItem\n"));
- gsk_gl_renderer_add_render_item (self, projection, self->render_items, root, NULL);
+ gsk_gl_renderer_add_render_item (self, projection, &identity, self->render_items, root, NULL);
GSK_NOTE (OPENGL, g_print ("Total render items: %d\n",
self->render_items->len));
diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c
index 888fca6..e5d6c2d 100644
--- a/gsk/gskrendernode.c
+++ b/gsk/gskrendernode.c
@@ -112,7 +112,6 @@ gsk_render_node_new (const GskRenderNodeClass *node_class)
self->mag_filter = GSK_SCALING_FILTER_NEAREST;
self->is_mutable = TRUE;
- self->needs_world_matrix_update = TRUE;
return self;
}
@@ -304,11 +303,9 @@ gsk_render_node_insert_child_internal (GskRenderNode *node,
child->parent = node;
child->age = 0;
- child->needs_world_matrix_update = TRUE;
node->n_children += 1;
node->age += 1;
- node->needs_world_matrix_update = TRUE;
if (child->prev_sibling == NULL)
node->first_child = child;
@@ -517,8 +514,6 @@ gsk_render_node_set_transform (GskRenderNode *node,
graphene_matrix_init_identity (&node->transform);
else
graphene_matrix_init_from_matrix (&node->transform, transform);
-
- node->transform_set = !graphene_matrix_is_identity (&node->transform);
}
/**
@@ -634,57 +629,6 @@ gsk_render_node_get_toplevel (GskRenderNode *node)
return NULL;
}
-/*< private >
- * gsk_render_node_update_world_matrix:
- * @node: a #GskRenderNode
- * @force: %TRUE if the update should be forced
- *
- * Updates the cached world matrix of @node and its children, if needed.
- */
-void
-gsk_render_node_update_world_matrix (GskRenderNode *node,
- gboolean force)
-{
- GskRenderNode *child;
-
- if (force || node->needs_world_matrix_update)
- {
- GSK_NOTE (RENDER_NODE, g_print ("Updating cached world matrix on node %p [parent=%p, t_set=%s]\n",
- node,
- node->parent != NULL ? node->parent : 0,
- node->transform_set ? "y" : "n"));
-
- if (node->parent == NULL)
- {
- if (node->transform_set)
- graphene_matrix_init_from_matrix (&node->world_matrix, &node->transform);
- else
- graphene_matrix_init_identity (&node->world_matrix);
- }
- else
- {
- GskRenderNode *parent = node->parent;
- graphene_matrix_t tmp;
-
- graphene_matrix_init_identity (&tmp);
-
- if (node->transform_set)
- graphene_matrix_multiply (&tmp, &node->transform, &tmp);
-
- graphene_matrix_multiply (&tmp, &parent->world_matrix, &node->world_matrix);
- }
-
- node->needs_world_matrix_update = FALSE;
- }
-
- for (child = gsk_render_node_get_first_child (node);
- child != NULL;
- child = gsk_render_node_get_next_sibling (child))
- {
- gsk_render_node_update_world_matrix (child, TRUE);
- }
-}
-
void
gsk_render_node_set_scaling_filters (GskRenderNode *node,
GskScalingFilter min_filter,
@@ -698,33 +642,6 @@ gsk_render_node_set_scaling_filters (GskRenderNode *node,
node->mag_filter = mag_filter;
}
-/*< private >
- * gsk_render_node_get_world_matrix:
- * @node: a #GskRenderNode
- * @mv: (out caller-allocates): return location for the modelview matrix
- * in world-relative coordinates
- *
- * Retrieves the modelview matrix in world-relative coordinates.
- */
-void
-gsk_render_node_get_world_matrix (GskRenderNode *node,
- graphene_matrix_t *mv)
-{
- g_return_if_fail (GSK_IS_RENDER_NODE (node));
- g_return_if_fail (mv != NULL);
-
- if (node->needs_world_matrix_update)
- {
- GskRenderNode *tmp = gsk_render_node_get_toplevel (node);
-
- gsk_render_node_update_world_matrix (tmp, TRUE);
-
- g_assert (!node->needs_world_matrix_update);
- }
-
- *mv = node->world_matrix;
-}
-
/**
* gsk_render_node_set_name:
* @node: a #GskRenderNode
diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h
index 2576771..db8d16f 100644
--- a/gsk/gskrendernodeprivate.h
+++ b/gsk/gskrendernodeprivate.h
@@ -41,16 +41,11 @@ struct _GskRenderNode
GskScalingFilter min_filter;
GskScalingFilter mag_filter;
- /* Transformations relative to the root of the scene */
- graphene_matrix_t world_matrix;
-
/* Transformations applied to the node */
graphene_matrix_t transform;
/* Bit fields; leave at the end */
gboolean is_mutable : 1;
- gboolean transform_set : 1;
- gboolean needs_world_matrix_update : 1;
};
struct _GskRenderNodeClass
@@ -82,12 +77,6 @@ GskBlendMode gsk_render_node_get_blend_mode (GskRenderNode *node);
GskRenderNode *gsk_render_node_get_toplevel (GskRenderNode *node);
-void gsk_render_node_update_world_matrix (GskRenderNode *node,
- gboolean force);
-
-void gsk_render_node_get_world_matrix (GskRenderNode *node,
- graphene_matrix_t *mv);
-
G_END_DECLS
#endif /* __GSK_RENDER_NODE_PRIVATE_H__ */
diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c
index 22709c2..3dc3700 100644
--- a/gsk/gskvulkanrenderpass.c
+++ b/gsk/gskvulkanrenderpass.c
@@ -274,12 +274,12 @@ gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
void
gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
GskVulkanRender *render,
- const graphene_matrix_t *root_mvp,
+ const graphene_matrix_t *parent_mvp,
GskVulkanPipeline *pipeline,
VkCommandBuffer command_buffer)
{
GskVulkanRenderOp *op;
- graphene_matrix_t world, mvp;
+ graphene_matrix_t transform, mvp;
float float_matrix[16];
guint i;
@@ -298,8 +298,8 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
0,
NULL);
- gsk_render_node_get_world_matrix (op->node, &world);
- graphene_matrix_multiply (&world, root_mvp, &mvp);
+ gsk_render_node_get_transform (op->node, &transform);
+ graphene_matrix_multiply (&transform, parent_mvp, &mvp);
graphene_matrix_to_float (&mvp, float_matrix);
vkCmdPushConstants (command_buffer,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]