summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-05-12 05:15:28 +0200
committerBenjamin Otte <otte@redhat.com>2023-05-17 02:25:32 +0200
commit23af8acbba234edd6fec58e7adff35219ed59849 (patch)
treece5f6486a5a0405df7a57bce519d4a6781a9dcc9
parent37d8e650a00494e65a37b07121f6c5a1d33b962c (diff)
downloadgtk+-23af8acbba234edd6fec58e7adff35219ed59849.tar.gz
vulkan: Split scale from matrix
Now, the scale is no longer part of the matrix. This allows shaders to transform points by the scale which increases accuracy for antialiasing.
-rw-r--r--gsk/vulkan/gskvulkanclip.c13
-rw-r--r--gsk/vulkan/gskvulkanclipprivate.h4
-rw-r--r--gsk/vulkan/gskvulkanrenderpass.c88
-rw-r--r--gsk/vulkan/resources/blendmode.vert2
-rw-r--r--gsk/vulkan/resources/blur.vert2
-rw-r--r--gsk/vulkan/resources/border.vert2
-rw-r--r--gsk/vulkan/resources/color-matrix.vert2
-rw-r--r--gsk/vulkan/resources/color.vert2
-rw-r--r--gsk/vulkan/resources/crossfade.vert2
-rw-r--r--gsk/vulkan/resources/inset-shadow.vert2
-rw-r--r--gsk/vulkan/resources/linear.vert2
-rw-r--r--gsk/vulkan/resources/mask.vert2
-rw-r--r--gsk/vulkan/resources/outset-shadow.vert2
-rw-r--r--gsk/vulkan/resources/texture.vert2
14 files changed, 85 insertions, 42 deletions
diff --git a/gsk/vulkan/gskvulkanclip.c b/gsk/vulkan/gskvulkanclip.c
index 7f54ad2899..5362bded74 100644
--- a/gsk/vulkan/gskvulkanclip.c
+++ b/gsk/vulkan/gskvulkanclip.c
@@ -143,6 +143,19 @@ gsk_vulkan_clip_intersect_rounded_rect (GskVulkanClip *dest,
return TRUE;
}
+void
+gsk_vulkan_clip_scale (GskVulkanClip *dest,
+ const GskVulkanClip *src,
+ float scale_x,
+ float scale_y)
+{
+ dest->type = src->type;
+ gsk_rounded_rect_scale_affine (&dest->rect,
+ &src->rect,
+ 1.0f / scale_x, 1.0f / scale_y,
+ 0, 0);
+}
+
gboolean
gsk_vulkan_clip_transform (GskVulkanClip *dest,
const GskVulkanClip *src,
diff --git a/gsk/vulkan/gskvulkanclipprivate.h b/gsk/vulkan/gskvulkanclipprivate.h
index 03282066af..0481dcc385 100644
--- a/gsk/vulkan/gskvulkanclipprivate.h
+++ b/gsk/vulkan/gskvulkanclipprivate.h
@@ -43,6 +43,10 @@ gboolean gsk_vulkan_clip_intersect_rect (GskVulk
gboolean gsk_vulkan_clip_intersect_rounded_rect (GskVulkanClip *dest,
const GskVulkanClip *src,
const GskRoundedRect *rounded) G_GNUC_WARN_UNUSED_RESULT;
+void gsk_vulkan_clip_scale (GskVulkanClip *dest,
+ const GskVulkanClip *src,
+ float scale_x,
+ float scale_y);
gboolean gsk_vulkan_clip_transform (GskVulkanClip *dest,
const GskVulkanClip *src,
GskTransform *transform,
diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c
index d20fc58714..73311203e5 100644
--- a/gsk/vulkan/gskvulkanrenderpass.c
+++ b/gsk/vulkan/gskvulkanrenderpass.c
@@ -538,9 +538,6 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
{
GskRenderNode *child;
GskTransform *transform;
- float scale_x;
- float scale_y;
- graphene_vec2_t scale;
GskVulkanParseState new_state;
#if 0
@@ -567,20 +564,47 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
{
- float dx, dy;
+ float dx, dy, scale_x, scale_y;
gsk_transform_to_affine (transform, &scale_x, &scale_y, &dx, &dy);
+ gsk_vulkan_clip_scale (&new_state.clip, &state->clip, scale_x, scale_y);
+ new_state.offset.x = (state->offset.x + dx) / scale_x;
+ new_state.offset.y = (state->offset.y + dy) / scale_y;
+ graphene_vec2_init (&new_state.scale, scale_x, scale_y);
+ graphene_vec2_multiply (&new_state.scale, &state->scale, &new_state.scale);
+ new_state.modelview = gsk_transform_ref (state->modelview);
}
break;
case GSK_TRANSFORM_CATEGORY_2D:
{
- float xx, xy, yx, yy, dx, dy;
+ float skew_x, skew_y, scale_x, scale_y, angle, dx, dy;
+ GskTransform *clip_transform;
- gsk_transform_to_2d (transform,
- &xx, &xy, &yx, &yy, &dx, &dy);
+ clip_transform = gsk_transform_transform (gsk_transform_translate (NULL, &state->offset), transform);
+
+ if (!gsk_vulkan_clip_transform (&new_state.clip, &state->clip, clip_transform, &child->bounds))
+ {
+ gsk_transform_unref (clip_transform);
+ FALLBACK ("Transform nodes can't deal with clip type %u", state->clip.type);
+ }
- scale_x = sqrtf (xx * xx + xy * xy);
- scale_y = sqrtf (yx * yx + yy * yy);
+ new_state.modelview = gsk_transform_ref (state->modelview);
+ new_state.modelview = gsk_transform_scale (state->modelview,
+ graphene_vec2_get_x (&state->scale),
+ graphene_vec2_get_y (&state->scale));
+ new_state.modelview = gsk_transform_transform (new_state.modelview, clip_transform);
+ gsk_transform_unref (clip_transform);
+
+ gsk_transform_to_2d_components (new_state.modelview,
+ &skew_x, &skew_y,
+ &scale_x, &scale_y,
+ &angle,
+ &dx, &dy);
+ scale_x = fabs (scale_x);
+ scale_y = fabs (scale_y);
+ new_state.modelview = gsk_transform_scale (new_state.modelview, 1 / scale_x, 1 / scale_y);
+ graphene_vec2_init (&new_state.scale, scale_x, scale_y);
+ new_state.offset = *graphene_point_zero ();
}
break;
@@ -594,8 +618,25 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
graphene_vec3_t translation;
graphene_vec3_t matrix_scale;
graphene_vec3_t shear;
+ GskTransform *clip_transform;
+ float scale_x, scale_y;
+
+ clip_transform = gsk_transform_transform (gsk_transform_translate (NULL, &state->offset), transform);
+
+ if (!gsk_vulkan_clip_transform (&new_state.clip, &state->clip, clip_transform, &child->bounds))
+ {
+ gsk_transform_unref (clip_transform);
+ FALLBACK ("Transform nodes can't deal with clip type %u", state->clip.type);
+ }
+
+ new_state.modelview = gsk_transform_ref (state->modelview);
+ new_state.modelview = gsk_transform_scale (state->modelview,
+ graphene_vec2_get_x (&state->scale),
+ graphene_vec2_get_y (&state->scale));
+ new_state.modelview = gsk_transform_transform (new_state.modelview, clip_transform);
+ gsk_transform_unref (clip_transform);
- gsk_transform_to_matrix (transform, &matrix);
+ gsk_transform_to_matrix (new_state.modelview, &matrix);
graphene_matrix_decompose (&matrix,
&translation,
&matrix_scale,
@@ -603,8 +644,11 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
&shear,
&perspective);
- scale_x = graphene_vec3_get_x (&matrix_scale);
- scale_y = graphene_vec3_get_y (&matrix_scale);
+ scale_x = fabs (graphene_vec3_get_x (&matrix_scale));
+ scale_y = fabs (graphene_vec3_get_y (&matrix_scale));
+ new_state.modelview = gsk_transform_scale (new_state.modelview, 1 / scale_x, 1 / scale_y);
+ graphene_vec2_init (&new_state.scale, scale_x, scale_y);
+ new_state.offset = *graphene_point_zero ();
}
break;
@@ -612,24 +656,10 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
break;
}
- new_state.modelview = gsk_transform_ref (state->modelview);
- new_state.modelview = gsk_transform_translate (new_state.modelview, &state->offset);
- new_state.modelview = gsk_transform_transform (new_state.modelview, transform);
-
- if (!gsk_vulkan_clip_transform (&new_state.clip, &state->clip, transform, &child->bounds))
- {
- gsk_transform_unref (new_state.modelview);
- FALLBACK ("Transform nodes can't deal with clip type %u", state->clip.type);
- }
-
graphene_matrix_init_from_matrix (&new_state.projection, &state->projection);
gsk_vulkan_render_pass_append_push_constants (self, node, &new_state);
- new_state.offset = *graphene_point_zero ();
- graphene_vec2_init (&scale, fabs (scale_x), fabs (scale_y));
- graphene_vec2_multiply (&state->scale, &scale, &new_state.scale);
-
gsk_vulkan_render_pass_add_node (self, render, &new_state, child);
gsk_vulkan_render_pass_append_push_constants (self, node, state);
@@ -1056,9 +1086,7 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
{
GskVulkanParseState state;
- state.modelview = gsk_transform_scale (NULL,
- graphene_vec2_get_x (&self->scale),
- graphene_vec2_get_y (&self->scale));
+ state.modelview = NULL;
graphene_matrix_init_ortho (&state.projection,
self->viewport.origin.x, self->viewport.origin.x + self->viewport.size.width,
self->viewport.origin.y, self->viewport.origin.y + self->viewport.size.height,
@@ -1071,8 +1099,6 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
gsk_vulkan_render_pass_append_push_constants (self, node, &state);
gsk_vulkan_render_pass_add_node (self, render, &state, node);
-
- gsk_transform_unref (state.modelview);
}
static GskVulkanImage *
diff --git a/gsk/vulkan/resources/blendmode.vert b/gsk/vulkan/resources/blendmode.vert
index 6670475ed8..b4c890302a 100644
--- a/gsk/vulkan/resources/blendmode.vert
+++ b/gsk/vulkan/resources/blendmode.vert
@@ -22,7 +22,7 @@ vec2 offsets[6] = { vec2(0.0, 0.0),
void main() {
vec4 rect = clip (inRect);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
diff --git a/gsk/vulkan/resources/blur.vert b/gsk/vulkan/resources/blur.vert
index 10dccf7b7f..7ba6046852 100644
--- a/gsk/vulkan/resources/blur.vert
+++ b/gsk/vulkan/resources/blur.vert
@@ -22,7 +22,7 @@ vec2 offsets[6] = { vec2(0.0, 0.0),
void main() {
vec4 rect = clip (inRect);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
outSize = inRect.zw;
diff --git a/gsk/vulkan/resources/border.vert b/gsk/vulkan/resources/border.vert
index d0f328a2e1..56dfd1292d 100644
--- a/gsk/vulkan/resources/border.vert
+++ b/gsk/vulkan/resources/border.vert
@@ -97,7 +97,7 @@ void main() {
pos = mix (rect.bounds.xy, rect.bounds.zw, offsets[vert_index]);
else
pos = mix (rect.bounds.zy, rect.bounds.xw, offsets[vert_index]);
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outColor = inBorderColors[((gl_VertexIndex / 3 + 15) / 4) % 4];
outPos = pos;
outRect = inRect;
diff --git a/gsk/vulkan/resources/color-matrix.vert b/gsk/vulkan/resources/color-matrix.vert
index f264d10cde..99487c9063 100644
--- a/gsk/vulkan/resources/color-matrix.vert
+++ b/gsk/vulkan/resources/color-matrix.vert
@@ -22,7 +22,7 @@ vec2 offsets[6] = { vec2(0.0, 0.0),
void main() {
vec4 rect = clip (inRect);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
diff --git a/gsk/vulkan/resources/color.vert b/gsk/vulkan/resources/color.vert
index cc2a853b5c..6a09ff5f99 100644
--- a/gsk/vulkan/resources/color.vert
+++ b/gsk/vulkan/resources/color.vert
@@ -21,7 +21,7 @@ void main() {
Rect rect = rect_round_larger (clip_rect (rect_from_gsk (inRect)));
vec2 pos = mix (rect.bounds.xy, rect.bounds.zw, offsets[gl_VertexIndex]);
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
outRect = rect_from_gsk (inRect);
outColor = inColor;
diff --git a/gsk/vulkan/resources/crossfade.vert b/gsk/vulkan/resources/crossfade.vert
index 837f0084ee..eb7a00767a 100644
--- a/gsk/vulkan/resources/crossfade.vert
+++ b/gsk/vulkan/resources/crossfade.vert
@@ -22,7 +22,7 @@ vec2 offsets[6] = { vec2(0.0, 0.0),
void main() {
vec4 rect = clip (inRect);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
diff --git a/gsk/vulkan/resources/inset-shadow.vert b/gsk/vulkan/resources/inset-shadow.vert
index 5fd8623529..13fa8d669f 100644
--- a/gsk/vulkan/resources/inset-shadow.vert
+++ b/gsk/vulkan/resources/inset-shadow.vert
@@ -29,7 +29,7 @@ void main() {
vec4 rect = clip (inOutline);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
outOutline = inOutline;
diff --git a/gsk/vulkan/resources/linear.vert b/gsk/vulkan/resources/linear.vert
index 7453c0d884..3d14b876f6 100644
--- a/gsk/vulkan/resources/linear.vert
+++ b/gsk/vulkan/resources/linear.vert
@@ -48,7 +48,7 @@ get_gradient_pos (vec2 pos)
void main() {
vec4 rect = clip (inRect);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
outGradientPos = get_gradient_pos (pos);
outRepeating = inRepeating;
diff --git a/gsk/vulkan/resources/mask.vert b/gsk/vulkan/resources/mask.vert
index 03f0329278..1406bfd1d1 100644
--- a/gsk/vulkan/resources/mask.vert
+++ b/gsk/vulkan/resources/mask.vert
@@ -20,7 +20,7 @@ vec2 offsets[6] = { vec2(0.0, 0.0),
void main() {
vec4 rect = clip (inRect);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
diff --git a/gsk/vulkan/resources/outset-shadow.vert b/gsk/vulkan/resources/outset-shadow.vert
index 6fdaf17171..18ec6f2774 100644
--- a/gsk/vulkan/resources/outset-shadow.vert
+++ b/gsk/vulkan/resources/outset-shadow.vert
@@ -38,7 +38,7 @@ void main() {
clip (inOutline);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;
outOutline = inOutline;
diff --git a/gsk/vulkan/resources/texture.vert b/gsk/vulkan/resources/texture.vert
index e1e08bc21a..443d6ecae9 100644
--- a/gsk/vulkan/resources/texture.vert
+++ b/gsk/vulkan/resources/texture.vert
@@ -18,7 +18,7 @@ vec2 offsets[6] = { vec2(0.0, 0.0),
void main() {
vec4 rect = clip (inRect);
vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
- gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
+ gl_Position = push.mvp * vec4 (push.scale * pos, 0.0, 1.0);
outPos = pos;