Compare commits

...

1 Commits

Author SHA1 Message Date
Matthias Clasen
dd06452b0f gsk: Add some inline vec2 apis
The gpu renderers are using a vec2 for their scale, and frequently
need to access the components. Avoid PLT overhead for this.
2024-03-12 22:08:28 -04:00
3 changed files with 76 additions and 31 deletions

View File

@@ -36,6 +36,7 @@
#include "gskdebugprivate.h" #include "gskdebugprivate.h"
#include "gskpath.h" #include "gskpath.h"
#include "gskrectprivate.h" #include "gskrectprivate.h"
#include "gskvec2private.h"
#include "gskrendernodeprivate.h" #include "gskrendernodeprivate.h"
#include "gskroundedrectprivate.h" #include "gskroundedrectprivate.h"
#include "gskstrokeprivate.h" #include "gskstrokeprivate.h"
@@ -195,7 +196,7 @@ gsk_gpu_node_processor_init (GskGpuNodeProcessor *self,
self->modelview = NULL; self->modelview = NULL;
gsk_gpu_image_get_projection_matrix (target, &self->projection); gsk_gpu_image_get_projection_matrix (target, &self->projection);
graphene_vec2_init (&self->scale, gsk_vec2_init (&self->scale,
width / viewport->size.width, width / viewport->size.width,
height / viewport->size.height); height / viewport->size.height);
self->offset = GRAPHENE_POINT_INIT (-viewport->origin.x, self->offset = GRAPHENE_POINT_INIT (-viewport->origin.x,
@@ -319,8 +320,8 @@ rect_round_to_pixels (const graphene_rect_t *src,
{ {
float x, y, xscale, yscale, inv_xscale, inv_yscale; float x, y, xscale, yscale, inv_xscale, inv_yscale;
xscale = graphene_vec2_get_x (pixel_scale); xscale = gsk_vec2_get_x (pixel_scale);
yscale = graphene_vec2_get_y (pixel_scale); yscale = gsk_vec2_get_y (pixel_scale);
inv_xscale = 1.0f / xscale; inv_xscale = 1.0f / xscale;
inv_yscale = 1.0f / yscale; inv_yscale = 1.0f / yscale;
@@ -345,8 +346,8 @@ gsk_gpu_node_processor_init_draw (GskGpuNodeProcessor *self,
area.x = 0; area.x = 0;
area.y = 0; area.y = 0;
area.width = ceilf (graphene_vec2_get_x (scale) * viewport->size.width - EPSILON); area.width = ceilf (gsk_vec2_get_x (scale) * viewport->size.width - EPSILON);
area.height = ceilf (graphene_vec2_get_y (scale) * viewport->size.height - EPSILON); area.height = ceilf (gsk_vec2_get_y (scale) * viewport->size.height - EPSILON);
image = gsk_gpu_device_create_offscreen_image (gsk_gpu_frame_get_device (frame), image = gsk_gpu_device_create_offscreen_image (gsk_gpu_frame_get_device (frame),
FALSE, FALSE,
@@ -629,8 +630,8 @@ gsk_gpu_node_processor_rect_is_integer (GskGpuNodeProcessor *self,
cairo_rectangle_int_t *int_rect) cairo_rectangle_int_t *int_rect)
{ {
graphene_rect_t transformed_rect; graphene_rect_t transformed_rect;
float scale_x = graphene_vec2_get_x (&self->scale); float scale_x = gsk_vec2_get_x (&self->scale);
float scale_y = graphene_vec2_get_y (&self->scale); float scale_y = gsk_vec2_get_y (&self->scale);
switch (gsk_transform_get_category (self->modelview)) switch (gsk_transform_get_category (self->modelview))
{ {
@@ -1030,7 +1031,7 @@ gsk_gpu_node_processor_blur_op (GskGpuNodeProcessor *self,
gsk_gpu_node_processor_sync_globals (&other, 0); gsk_gpu_node_processor_sync_globals (&other, 0);
graphene_vec2_init (&direction, blur_radius, 0.0f); gsk_vec2_init (&direction, blur_radius, 0.0f);
gsk_gpu_blur_op (other.frame, gsk_gpu_blur_op (other.frame,
gsk_gpu_clip_get_shader_clip (&other.clip, &other.offset, &intermediate_rect), gsk_gpu_clip_get_shader_clip (&other.clip, &other.offset, &intermediate_rect),
source_desc, source_desc,
@@ -1044,7 +1045,7 @@ gsk_gpu_node_processor_blur_op (GskGpuNodeProcessor *self,
real_offset = GRAPHENE_POINT_INIT (self->offset.x + shadow_offset->x, real_offset = GRAPHENE_POINT_INIT (self->offset.x + shadow_offset->x,
self->offset.y + shadow_offset->y); self->offset.y + shadow_offset->y);
graphene_vec2_init (&direction, 0.0f, blur_radius); gsk_vec2_init (&direction, 0.0f, blur_radius);
intermediate_descriptor = gsk_gpu_node_processor_add_image (self, intermediate, GSK_GPU_SAMPLER_TRANSPARENT); intermediate_descriptor = gsk_gpu_node_processor_add_image (self, intermediate, GSK_GPU_SAMPLER_TRANSPARENT);
if (shadow_color) if (shadow_color)
{ {
@@ -1581,8 +1582,8 @@ gsk_gpu_node_processor_add_transform_node (GskGpuNodeProcessor *self,
gsk_gpu_clip_scale (&self->clip, &old_clip, scale_x, scale_y); gsk_gpu_clip_scale (&self->clip, &old_clip, scale_x, scale_y);
self->offset.x = (self->offset.x + dx) / scale_x; self->offset.x = (self->offset.x + dx) / scale_x;
self->offset.y = (self->offset.y + dy) / scale_y; self->offset.y = (self->offset.y + dy) / scale_y;
graphene_vec2_init (&self->scale, fabs (scale_x), fabs (scale_y)); gsk_vec2_init (&self->scale, fabs (scale_x), fabs (scale_y));
graphene_vec2_multiply (&self->scale, &old_scale, &self->scale); gsk_vec2_multiply (&self->scale, &old_scale, &self->scale);
self->modelview = gsk_transform_scale (self->modelview, self->modelview = gsk_transform_scale (self->modelview,
scale_x / fabs (scale_x), scale_x / fabs (scale_x),
scale_y / fabs (scale_y)); scale_y / fabs (scale_y));
@@ -1642,15 +1643,15 @@ gsk_gpu_node_processor_add_transform_node (GskGpuNodeProcessor *self,
old_modelview = gsk_transform_ref (self->modelview); old_modelview = gsk_transform_ref (self->modelview);
self->modelview = gsk_transform_scale (self->modelview, self->modelview = gsk_transform_scale (self->modelview,
graphene_vec2_get_x (&self->scale), gsk_vec2_get_x (&self->scale),
graphene_vec2_get_y (&self->scale)); gsk_vec2_get_y (&self->scale));
self->modelview = gsk_transform_transform (self->modelview, clip_transform); self->modelview = gsk_transform_transform (self->modelview, clip_transform);
gsk_transform_unref (clip_transform); gsk_transform_unref (clip_transform);
extract_scale_from_transform (self->modelview, &scale_x, &scale_y); extract_scale_from_transform (self->modelview, &scale_x, &scale_y);
old_pixels = MAX (graphene_vec2_get_x (&old_scale) * old_clip.rect.bounds.size.width, old_pixels = MAX (gsk_vec2_get_x (&old_scale) * old_clip.rect.bounds.size.width,
graphene_vec2_get_y (&old_scale) * old_clip.rect.bounds.size.height); gsk_vec2_get_y (&old_scale) * old_clip.rect.bounds.size.height);
new_pixels = MAX (scale_x * self->clip.rect.bounds.size.width, new_pixels = MAX (scale_x * self->clip.rect.bounds.size.width,
scale_y * self->clip.rect.bounds.size.height); scale_y * self->clip.rect.bounds.size.height);
@@ -1663,7 +1664,7 @@ gsk_gpu_node_processor_add_transform_node (GskGpuNodeProcessor *self,
} }
self->modelview = gsk_transform_scale (self->modelview, 1 / scale_x, 1 / scale_y); self->modelview = gsk_transform_scale (self->modelview, 1 / scale_x, 1 / scale_y);
graphene_vec2_init (&self->scale, scale_x, scale_y); gsk_vec2_init (&self->scale, scale_x, scale_y);
self->offset = *graphene_point_zero (); self->offset = *graphene_point_zero ();
} }
break; break;
@@ -1735,8 +1736,8 @@ gsk_gpu_node_processor_create_transform_pattern (GskGpuPatternWriter *self,
self->bounds.size.width *= inv_sx; self->bounds.size.width *= inv_sx;
self->bounds.size.height *= inv_sy; self->bounds.size.height *= inv_sy;
self->offset = GRAPHENE_POINT_INIT (0, 0); self->offset = GRAPHENE_POINT_INIT (0, 0);
graphene_vec2_init (&self->scale, fabs (sx), fabs (sy)); gsk_vec2_init (&self->scale, fabs (sx), fabs (sy));
graphene_vec2_multiply (&self->scale, &old_scale, &self->scale); gsk_vec2_multiply (&self->scale, &old_scale, &self->scale);
} }
break; break;
@@ -1820,8 +1821,8 @@ gsk_gpu_node_processor_add_color_node (GskGpuNodeProcessor *self,
return; return;
} }
scale_x = graphene_vec2_get_x (&self->scale); scale_x = gsk_vec2_get_x (&self->scale);
scale_y = graphene_vec2_get_y (&self->scale); scale_y = gsk_vec2_get_y (&self->scale);
clipped = GRAPHENE_RECT_INIT (int_clipped.x / scale_x, int_clipped.y / scale_y, clipped = GRAPHENE_RECT_INIT (int_clipped.x / scale_x, int_clipped.y / scale_y,
int_clipped.width / scale_x, int_clipped.height / scale_y); int_clipped.width / scale_x, int_clipped.height / scale_y);
shader_clip = gsk_gpu_clip_get_shader_clip (&self->clip, graphene_point_zero(), &clipped); shader_clip = gsk_gpu_clip_get_shader_clip (&self->clip, graphene_point_zero(), &clipped);
@@ -1948,8 +1949,8 @@ gsk_gpu_node_processor_add_texture_node (GskGpuNodeProcessor *self,
} }
if (gsk_gpu_frame_should_optimize (self->frame, GSK_GPU_OPTIMIZE_MIPMAP) && if (gsk_gpu_frame_should_optimize (self->frame, GSK_GPU_OPTIMIZE_MIPMAP) &&
(gdk_texture_get_width (texture) > 2 * node->bounds.size.width * graphene_vec2_get_x (&self->scale) || (gdk_texture_get_width (texture) > 2 * node->bounds.size.width * gsk_vec2_get_x (&self->scale) ||
gdk_texture_get_height (texture) > 2 * node->bounds.size.height * graphene_vec2_get_y (&self->scale))) gdk_texture_get_height (texture) > 2 * node->bounds.size.height * gsk_vec2_get_y (&self->scale)))
{ {
guint32 descriptor; guint32 descriptor;
@@ -2015,8 +2016,8 @@ gsk_gpu_node_processor_create_texture_pattern (GskGpuPatternWriter *self,
} }
if (gsk_gpu_frame_should_optimize (self->frame, GSK_GPU_OPTIMIZE_MIPMAP) && if (gsk_gpu_frame_should_optimize (self->frame, GSK_GPU_OPTIMIZE_MIPMAP) &&
(gdk_texture_get_width (texture) > 2 * node->bounds.size.width * graphene_vec2_get_x (&self->scale) || (gdk_texture_get_width (texture) > 2 * node->bounds.size.width * gsk_vec2_get_x (&self->scale) ||
gdk_texture_get_height (texture) > 2 * node->bounds.size.height * graphene_vec2_get_y (&self->scale))) gdk_texture_get_height (texture) > 2 * node->bounds.size.height * gsk_vec2_get_y (&self->scale)))
{ {
image = gsk_gpu_node_processor_ensure_image (self->frame, image = gsk_gpu_node_processor_ensure_image (self->frame,
image, image,
@@ -2060,7 +2061,7 @@ gsk_gpu_node_processor_add_texture_scale_node (GskGpuNodeProcessor *self,
gboolean need_mipmap, need_offscreen; gboolean need_mipmap, need_offscreen;
need_offscreen = self->modelview != NULL || need_offscreen = self->modelview != NULL ||
!graphene_vec2_equal (&self->scale, graphene_vec2_one ()); gsk_vec2_equal (&self->scale, graphene_vec2_one ());
if (need_offscreen) if (need_offscreen)
{ {
GskGpuImage *offscreen; GskGpuImage *offscreen;
@@ -3021,7 +3022,7 @@ gsk_gpu_node_processor_add_glyph_node (GskGpuNodeProcessor *self,
offset.x += self->offset.x; offset.x += self->offset.x;
offset.y += self->offset.y; offset.y += self->offset.y;
scale = MAX (graphene_vec2_get_x (&self->scale), graphene_vec2_get_y (&self->scale)); scale = MAX (gsk_vec2_get_x (&self->scale), gsk_vec2_get_y (&self->scale));
inv_scale = 1.f / scale; inv_scale = 1.f / scale;
glyph_align = gsk_gpu_frame_should_optimize (self->frame, GSK_GPU_OPTIMIZE_GLYPH_ALIGN); glyph_align = gsk_gpu_frame_should_optimize (self->frame, GSK_GPU_OPTIMIZE_GLYPH_ALIGN);
@@ -3135,7 +3136,7 @@ gsk_gpu_node_processor_create_glyph_pattern (GskGpuPatternWriter *self,
offset.x += self->offset.x; offset.x += self->offset.x;
offset.y += self->offset.y; offset.y += self->offset.y;
scale = MAX (graphene_vec2_get_x (&self->scale), graphene_vec2_get_y (&self->scale)); scale = MAX (gsk_vec2_get_x (&self->scale), gsk_vec2_get_y (&self->scale));
inv_scale = 1.f / scale; inv_scale = 1.f / scale;
gsk_gpu_pattern_writer_append_uint (self, GSK_GPU_PATTERN_GLYPHS); gsk_gpu_pattern_writer_append_uint (self, GSK_GPU_PATTERN_GLYPHS);

View File

@@ -14,6 +14,7 @@
#include "gdk/gdkglcontextprivate.h" #include "gdk/gdkglcontextprivate.h"
#include "gsk/gskdebugprivate.h" #include "gsk/gskdebugprivate.h"
#include "gskvec2private.h"
static GskGpuOp * static GskGpuOp *
gsk_gpu_upload_op_gl_command_with_area (GskGpuOp *op, gsk_gpu_upload_op_gl_command_with_area (GskGpuOp *op,
@@ -465,8 +466,8 @@ gsk_gpu_upload_cairo_op (GskGpuFrame *frame,
self->image = gsk_gpu_device_create_upload_image (gsk_gpu_frame_get_device (frame), self->image = gsk_gpu_device_create_upload_image (gsk_gpu_frame_get_device (frame),
FALSE, FALSE,
GDK_MEMORY_DEFAULT, GDK_MEMORY_DEFAULT,
ceil (graphene_vec2_get_x (scale) * viewport->size.width), ceil (gsk_vec2_get_x (scale) * viewport->size.width),
ceil (graphene_vec2_get_y (scale) * viewport->size.height)); ceil (gsk_vec2_get_y (scale) * viewport->size.height));
self->viewport = *viewport; self->viewport = *viewport;
self->func = func; self->func = func;
self->user_data = user_data; self->user_data = user_data;

43
gsk/gskvec2private.h Normal file
View File

@@ -0,0 +1,43 @@
#pragma once
#include <graphene.h>
#include <math.h>
static inline float
gsk_vec2_get_x (const graphene_vec2_t *v)
{
return graphene_simd4f_get_x (v->__graphene_private_value);
}
static inline float
gsk_vec2_get_y (const graphene_vec2_t *v)
{
return graphene_simd4f_get_y (v->__graphene_private_value);
}
static inline graphene_vec2_t *
gsk_vec2_init (graphene_vec2_t *v,
float x,
float y)
{
v->__graphene_private_value = graphene_simd4f_init (x, y, 0.f, 0.f);
return v;
}
static inline void
gsk_vec2_multiply (const graphene_vec2_t *a,
const graphene_vec2_t *b,
graphene_vec2_t *res)
{
res->__graphene_private_value = graphene_simd4f_mul (a->__graphene_private_value,
b->__graphene_private_value);
}
static inline bool
gsk_vec2_equal (const graphene_vec2_t *v1,
const graphene_vec2_t *v2)
{
return graphene_simd4f_cmp_eq (v1->__graphene_private_value, v2->__graphene_private_value);
}