Benjamin Otte
d4618ea8a6
vulkan: Don't crash with overly large nodes
...
... when these nodes are used as children of a complex transform nodes
and we lose the clip.
2023-06-04 19:42:01 +02:00
Benjamin Otte
a73530f952
vulkan: Update texture shader to do AA
2023-06-04 19:42:01 +02:00
Benjamin Otte
3e620a8fe5
vulkan: Split generic code off
...
No need to duplicate code in shaders when it can be shared.
2023-06-04 19:42:01 +02:00
Benjamin Otte
6d8c8199d9
vulkan: Use rounded rect APIs to improve clips
...
There are a bunch of intersection APIs available these days.
Let's use them.
2023-06-04 19:42:01 +02:00
Benjamin Otte
968ceb71d5
gsk: Add (private) gsk_rounded_rect_intersection()
...
The idea is that for a rectangle intersection, each corner of the
result is either entirely part of one original rectangle or it is
an intersection point.
By detecting those 2 cases and treating them differently, we can
simplify the code to compare rounded rectangles.
2023-06-04 19:42:01 +02:00
Benjamin Otte
7f5504bea4
vulkan: Set the initial clip rect
...
Instead of rendering unclipped, set the clip region to the extents of
the current clip region.
2023-06-04 19:42:01 +02:00
Benjamin Otte
4b2b239550
vulkan: Only draw one rect
...
Instead of emitting the render commands once per rectangle of the clip
region, just emit them once with the region's extents.
This is generally faster because it emits fewer commands to the GPU,
even though it may touch significantly more pixels.
For a proper method, we'd need to record the commands per clip rectangle
instead of emitting all of them all the time.
2023-06-04 19:42:01 +02:00
Benjamin Otte
23c10d434c
vulkan: Use CLAMP_TO_EDGE in sampler
...
We don't want to clamp to the border, that causes fade-outs at the
edges.
2023-06-04 19:42:01 +02:00
Benjamin Otte
87c9503293
vulkan: Rewrite AA shaders to respect scale
...
The border and color shaders - the ones that do AA - now multiply their
coordinates by the scale factor, which gives them better rounding
capabilities.
This in particular improves the case where they are used in fractional
scaling situations, where the scale is defined at the root element.
2023-06-04 19:42:01 +02:00
Benjamin Otte
76634cb68b
vulkan: Don't allocate no descriptor sets
...
If we don't need them, exit early.
Shuts up the validation layers when running simple denos without
textures.
2023-06-04 19:42:01 +02:00
Benjamin Otte
52eefdb7d9
vulkan: Only use a single pipeline layout
...
There's no need to use 3 different ones when they are compatible.
2023-06-04 19:42:01 +02:00
Benjamin Otte
ea9f0a3372
vulkan: Don't cull vertices
...
We end up with the backside, when we scale(-1) and we still want it to
be visible, just flipped.
2023-06-04 19:42:01 +02:00
Benjamin Otte
8561ff37c4
vulkan: Use scale factor for offscreens and fallbacks
...
Previously, we just used the defaultscale factor, but now that we're
having it available in push constants, we can read it back for creating
offscreens and rendering fallbacks.
So do that.
2023-06-04 19:42:01 +02:00
Benjamin Otte
a09580b9ef
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.
2023-06-04 19:42:01 +02:00
Benjamin Otte
0511227379
vulkan: Keep the modelview as a GskTransform
...
This allows doing more optimized math on it.
2023-06-04 19:42:01 +02:00
Benjamin Otte
4183ce0b52
vulkan: Split modelview and projection
...
This is adding extra work, but the benefits should become visible
in future commits.
2023-06-04 19:42:01 +02:00
Benjamin Otte
57222cc64c
vulkan: Add scale to push constants
...
This way, it can be pushed to the shaders
2023-06-04 19:42:01 +02:00
Benjamin Otte
b3c1284382
vulkan: Move scale into the state object
2023-06-04 19:42:01 +02:00
Benjamin Otte
b02e054592
vulkan: Add offset to the Vulkan clip checks
...
This was forgotten when tracking the offset was added, so code was
actually selecting the wrong shaders.
2023-06-04 19:42:01 +02:00
Benjamin Otte
870ee06d1f
vulkan: Move offset into the state object
2023-06-04 19:42:01 +02:00
Benjamin Otte
8d586be693
vulkan: Add a new GskVulkanParseState
...
It's a 1:1 replacement for GskVulkanPushConstants, just without the
indirection through a different file.
GskVulkanPushConstants as a struct is gone now.
The file still exists to handle the push_constants operation.
2023-06-04 19:42:01 +02:00
Benjamin Otte
94ab11b999
vulkan: Don't store push constants in RenderOp
...
Instead, only store the values that are needed.
2023-06-04 19:42:01 +02:00
Benjamin Otte
9b1dcd3872
vulkan: Split out gsk_vulkan_render_pass_append_push_constants()
...
Simplifies the code and makes future refactoring easier
2023-06-04 19:42:01 +02:00
Benjamin Otte
c37171f4d6
vulkan: Pass values to push directly
...
Don't require a GskVulkanPushConstants there.
2023-06-04 19:42:01 +02:00
Benjamin Otte
c479f93372
vulkan: Add a static assert
...
We don't want to make the push constants larger than what the spec
guarantees. And that is 128 bytes, see value for
maxPushConstantsSize in table 55 of
https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#limits-minmax
2023-06-04 19:42:01 +02:00
Benjamin Otte
186e056c56
vulkan: Handle clip properly for offscreens
...
This was broken in the last commit.
2023-06-04 19:42:01 +02:00
Benjamin Otte
d8b9c3ae96
vulkan: Track offset in the renderpass
...
This avoids emitting lots of push constant updates as most of the
transforms we have are simple translations to adjust drawing for the
next widget.
2023-06-04 19:42:01 +02:00
Benjamin Otte
5de6f12e88
vulkan: Pass scale to offscreens
...
Create offscreens with enough pixels for the given scale and ensure
the scale is passed on.
This improves text rendering on offscreens quite a bit.
2023-06-04 19:42:01 +02:00
Benjamin Otte
5422c12577
vulkan: Clean up scale handling
...
1. Use a graphene_vec2_t
2. Ensure it's always positive
3. Don't break with fallback
The scale value is nothing more than an indication of how many pixels to
assume per unit of a node.
2023-06-04 19:42:01 +02:00
Benjamin Otte
bb145b9bc1
vulkan: Fix typo
2023-06-04 19:42:01 +02:00
Benjamin Otte
a55fda0b49
vulkan: Don't store unused matrices
...
We can compute it when needed, so do that.
2023-06-04 19:42:01 +02:00
Benjamin Otte
5b93a32f90
vulkan: Remove unneeded argument
...
The initial matrix can be computed as needed, so we don't need to
precompute it.
2023-06-04 19:42:01 +02:00
Benjamin Otte
495ee1be3d
vulkan: Don't explode without vertex data
...
If no buffer has any vertex data (read: if nothing gets drawn), don't
try to allocate a 0 bytes buffer.
2023-06-04 19:42:01 +02:00
Benjamin Otte
7f1bd1f047
vulkan: Handle empty child bounds in repeat node
...
Also add test to the testsuite for it.
2023-06-04 19:42:01 +02:00
Benjamin Otte
da147dca92
vulkan: Fix repeat nodes
2023-06-04 19:42:01 +02:00
Benjamin Otte
8ba5ff98aa
vulkan: Don't transform the viewport rect
...
We don't want to render the offscreen trnsformed, we want to render it
as-is.
We lose the correct scale factor, but that requires some separate work,
so for now it gets a bit blurry on hidpi.
2023-06-04 19:42:01 +02:00
Benjamin Otte
34f4493c36
vulkan: Make quarks global variables
...
I don't want to ensure there's a RenderPass available everywhere and
recreate the quarks in each, I just want to use them.
2023-06-04 19:42:01 +02:00
Benjamin Otte
314923d4b5
vulkan: Split out a function
...
We can now create offscreens explicitly.
2023-06-04 19:42:00 +02:00
Benjamin Otte
d2f45dae96
vulkan: offscreens are used as color attachments
...
... so set the corresponding flag.
Also name the function "new_for_offscreen()" because thats what this
function is about, "texture" is ambiguous.
2023-06-04 19:42:00 +02:00
Benjamin Otte
0e31cf9542
vulkan: compute new modelview directly
...
no need to go through a GskTransform
2023-06-04 19:42:00 +02:00
Benjamin Otte
af901a10e3
vulkan: Make border shader handle fractional widths
...
We were rounding widths properly, make sure we always round up.
2023-06-04 19:42:00 +02:00
Benjamin Otte
3d1a607367
vulkan: Don't round corners when growing rounded rect
...
If the corner is set to 0, keep it there.
2023-06-04 19:42:00 +02:00
Benjamin Otte
1be21a33d9
vulkan: Rewrite rounded rectangle to use SDF distance
...
We can use this to properly compute distance in scaled situations.
We also now compute coverage with (imperfect) antialiasing.
2023-06-04 19:42:00 +02:00
Benjamin Otte
64bcdb713c
vulkan: Start rework on shaders to allow antialiased drawing
...
This introduces the rect object and adds a rect_distance() and
rect_coverage() function.
_distance() returns the signed distance tp the rectangle.
_coverage() returns the coverage of a pixel centered at that position.
Note that the pixel size is computed using dFdx/dFdy.
2023-06-04 19:42:00 +02:00
Benjamin Otte
4a868736f9
vulkan: Render whole texture
...
When the node bounds were a non-integer size, the texture would get
ceil()ed pixels, but various viewport or scissor computations might
floor() instead, leaving the right/bottom row of pixels untouched.
Make sure those functions ceil(), too.
2023-06-04 19:42:00 +02:00
Benjamin Otte
cfeaa0ac72
renderer: return_if_fail() if the given texture size is 0
...
All renderers SEGV currently when that happens.
2023-06-04 19:42:00 +02:00
Matthias Clasen
b44ef07e22
Merge branch 'matthiasc/for-main' into 'main'
...
wayland: Don't leak cursor structs
See merge request GNOME/gtk!6058
2023-06-04 17:35:04 +00:00
Ekaterine Papava
7f119b5ad2
Update Georgian translation
2023-06-04 14:45:45 +00:00
Matthias Clasen
d427933c61
testsuite: Improve test coverage
2023-06-04 09:04:25 -04:00
Matthias Clasen
85bafbdff0
wayland: Don't leak cursor structs
...
Found by gcc's -fanalyzer.
2023-06-04 07:58:24 -04:00