Alternative solution to #141392 / #141564.
As a recap, the DST global lock (which prevented running drawing code
from multiple threads concurrently) was removed for 4.5 (#134690).
One unforeseen issue is that Images (and their GPUTextures) are shared
across dependency graphs (and therefore multiple threads), meaning we
are running into data race issues with them.
@fclem did #141392 and I continued it #141564. However, this is only a
partial solution, parts of the GPUTexture API and the whole BKE_image
API are still unsafe.
Trying to solve all the possible underlying issues seems unrealistic for
4.5 given the time frame and that the extension of the code affected by
this issue is quite large.
So this PR just brings the 4.4 locking behavior instead, which, while
risky on its own, seems much safer to me than the alternative.
This effectively undoes the improvements from #134690 by disabling
concurrent rendering, but instead of reverting all the code, it just
ensures we hold the lock in the same places we did in 4.4.
This means there's some redundant code that is not technically needed
anymore, like the `submission_mutex`, but it's probably best to make as
few modifications as possible, given how close we are to release and
that this is only intended as a temporary measure.
Pull Request: https://projects.blender.org/blender/blender/pulls/141618
This commit fixes a issue where GPU compositor tests would always run
with the default GPU backend, Metal for macOS, and OpenGL
for other operating systems.
Now tests correctly run on the defined GPU backend, allowing Vulkan
GPU compositor tests to correctly run with the Vulkan GPU backend.
Pull Request: https://projects.blender.org/blender/blender/pulls/141447
Some items in the node editors' add menus were not properly
translated. The affected items referenced an enum property on a node,
such as Math node's Operation.
Since some of those enums use a specific translation context, the same
context must be used when adding them to the search menus. The context
can simply be retrieved from the bl_rna prop itself.
In addition, some items use labels that are already translated
manually and do not need the auto translation, so disable that in
those cases (translate=False).
No new messages are added by this change.
Reported by Ye Gui in #43295.
Pull Request: https://projects.blender.org/blender/blender/pulls/141629
Implicit conversion for single values always return zero in GPU device.
That's because the conversion data was only stored on the CPU and not
uploaded to the GPU, so we ensure it gets uploaded to GPU.
Pull Request: https://projects.blender.org/blender/blender/pulls/141658
The files property, provided by the blender file browser, contain
paths relative to the directory property. Use that instead of using
the filepath parent directory.
Don't attempt to fill curve caps when the direction vector is invalid.
This prevents the crash in #141612 however the root cause of that
report isn't directly related to curve filling.
The check to prevent overly complex tessellation checked the objects
scale directly instead of the final evaluated scale.
Also corrects the scale check which wasn't accounting for negative axes.
The mesh importer was only checking for animated positions, velocities,
and primvars when determining if a cache modifier needed to be used.
Extend this to crease values (and normals) too.
The added test ensures a base level of coverage here.
Related to: #141633
Pull Request: https://projects.blender.org/blender/blender/pulls/141643
This commit fixes a bug where the timeline area height was clamped to
its minimum value when restoring an area layout saved on a non-HiDPI
screen on a HiDPI screen. In particular, this caused the default Blender
startup file timeline area to be wrongly clamped dwon on macOS when
using a HiDPI/Retina screen.
This was due to the `screen_geom_vertices_scale_pass` function using raw
`area->winy` value in the `facy > 1` case, which ensures the timeline
does not get expanded when resizing the window if its already at its
minimum height. When restoring the area layout, these `winy` values
were not yet refreshed, and still used the DPI scale of the screen
the layout was saved on. Which in case of macOS HiDPI screens caused
them to be two times smaller then the screen / other size values used
in the function.
This was fixed by using the `screen_geom_area_height()` instead, which
computes the area height from its screen geometry coordinates, and was
previously used in this function before being replaced by `winy`. The
comparaison now also uses a fixed value instead of `facy` which was
also subject to DPI differencies, see PR thread for more details
Pull Request: https://projects.blender.org/blender/blender/pulls/141154
Line art bakes strokes in a separate thread, which will also update
depsgraph, and if an image editor is present, it will try to iterate all
the objects in the view layer and this is unsafe. Now line art will set
region drawing lock to prevent image editor from drawing while baking.
Pull Request: https://projects.blender.org/blender/blender/pulls/141551
Fix an issue with Copy to Selected on bones, where an RNA pointer was
given an owner of the wrong type.
A pointer was constructed to a `Bone` (which is owned by the
Armature), but the owner was taken from the corresponding `PoseBone`
(which is owned by the Object), causing Armature "property update"
callbacks to be called without an actual Armature. This caused the
wrong data to be tagged for re-evaluation, which caused the issue.
Also f04bc75f8c affected the Copy to Selected on edit bones.
Co-authored by Philipp Oeser
Pull Request: https://projects.blender.org/blender/blender/pulls/141394
The feature to display multiple objects in the UV and Image Editor was
added in 24d08e0bae.
This commit did not account the multi-edit mode feature, where there may
be more than one object currently being edited, causing some UVs to
display with a faded opacity.
To fix this, introduce a new `eObjectInfoFlag` flag to indicate this
state, populate it when syncing the object, and use the flag inside the
relevant shaders.
Pull Request: https://projects.blender.org/blender/blender/pulls/141254
When handles are selected but not the control point this will convert the types `auto` to `align` and `vector` to `free`
This adds `tag_topology_changed` to make sure the handle types are updated.
This also fixes a problem where `free` handle would not be transformed with the control point.
Implement following Curve objects #128638
Pull Request: https://projects.blender.org/blender/blender/pulls/141438
Material selection didn't support empty geometries. Geometry list can
have nullptrs, when meshes contain more than 16 materials, but some
materials slots are not actually used in the mesh.
Material selection used to still looped over all the materials and
tried to draw geometry that aren't there.
Regression from !139781
Pull Request: https://projects.blender.org/blender/blender/pulls/141608
When beveling a vertex with only 2 connected edges, the resulting
geometry was not selected.
Resolve by not only selecting the faces created by the bevel operation,
but also selecting the vertices created.
Note: apply the same change as before,
the LFS data has been manually pushed.
Ref !139691
Windows/Intel GPU crashes when descriptor buffer cannot be allocated
anymore. This PR enables a workaround by not using descriptor buffers.
In future we should investigate how to improve the GC of descriptor
buffers and review the limits.
Pull Request: https://projects.blender.org/blender/blender/pulls/141600
Switching back and forth between viewers with shortcuts doesn't trigger
the compositor to update as expected when inside a node group.
See PR description for an example file.
The issue was caused by a missing tree update.
Pull Request: https://projects.blender.org/blender/blender/pulls/141606
When beveling a vertex with only 2 connected edges, the resulting
geometry was not selected.
Resolve by not only selecting the faces created by the bevel operation,
but also selecting the vertices created.
Ref !139691
With adding more c++ and templates all over our code-base, the general
memory footprint of regulare and 'heavy' compile jobs have increased
over the past couple of years, reflect that in the heuristics used to
auto-compute default 'good enough' max number of compile and
heavy-complie jobs.
Correct problem where face split inadvertently triggered the
un-triangulate detection logic in places due to freshly added diagonals.
Defer face split until after tagging is complete so the new edges don't
interfere with edge counting.
Ref !141511
When the layer tree in the evaluated state of the Grease Pencil object changed,
the code would fail to get the crazyspace deformation.
Currently we rely on a 1 to 1 index mapping of the original and evaluated
layers. For obvious reasons, this is very weak and can easily break.
The new implementation works as follows:
* Caller that wants to get the crazyspace deformation passes the evaluated and original
object + the original drawing to get the deformation of.
* Fallback deformation are the original positions.
* If there are drawing edit hints in the evaluated geoemtry set, then
* find the edit hint that corresponds to the original drawing
* use the positions in the edit hint.
To create the drawing edit hints, we need to know what evaluated layer corresponds
to which original layer. Currently, this simply stores the original layer index on the
evaluated layer runtime data.
The solution is not ideal and there are some possible improvements like:
* Find a way to solve the more general case, e.g. when there are multiple original
IDs involved.
* Propagate the "mapping" to original layers even when the type of geometry is
changed, like going to curve instances and back.
Pull Request: https://projects.blender.org/blender/blender/pulls/139285
After spending way too much time looking into the image handle code
because I assumed the issue is some interaction between OSL code using
a texture and the image system that's in SVM mode (which never happened
before the custom camera) with printf debuggine because OptiX doesn't
work in debug builds, it turns out the issue was something else entirely:
C++ iterator bullshit.
Specifically, when we remove an entry from services->textures, this
invalidates the iterator, so the code restarts from the beginning.
However, the for-loop still increments the iterator *before* checking
the termination criterion.
If we remove the only element of the map, we:
- Set it = map.begin(), which equals map.end() since it's empty now
- Increment it at the end of the loop iteration
- Compare it == map.end(), which is wrong now since we're past the end
No idea how this didn't blow up sooner, none of this seems camera-specific??
Anyways, the fix is simple - only increment if we didn't restart.
Pull Request: https://projects.blender.org/blender/blender/pulls/141580
This is related to #140381, where the symptom of the bug was a crash
caused by an undefined behavior. In that case, setting a valid active
viewer key was the proper fix. However,
`find_active_context_recursive()` could return `nullptr` in theory so
the same problem might occur in the future.
The commit resolves the undefined behavior by avoiding the
dereferencing of a null pointer.
Pull Request: https://projects.blender.org/blender/blender/pulls/141270
Reading from the top-right of the selection buffer could read
past the buffer bounds. Resolve by ensuring the clamped buffer
isn't empty. Relates to #141591.
When Timeline and similar regions become very short we try to remove
overlapping parts as they can no longer fit. While doing this I didn't
consider that the marker/Scrubbing Region color could include
transparency. This PR just backtracks a little and hides the marker
region in a different way, allowing transparency if wanted.
Pull Request: https://projects.blender.org/blender/blender/pulls/141581
The `files` property, provided by the blender file browser, contain
paths relative to the `directory` property. Use that instead of using
the file's parent directory.
Pull Request: https://projects.blender.org/blender/blender/pulls/141575
The memfile undo data-block change detection didn't work for meshes
because we ended up writing a new pointer every time. In practice the
array the pointer references is always empty anyway, so we can just add
a check and write null instead.
Unfortunately this fix only applies to 4.5, since the attribute DNA
data (which is actually used at runtime in 5.0) is created temporarily
specifically for writing, so it gets a new address every time.
We'll probably need to solve #127706 in 5.0 to fix this.
Pull Request: https://projects.blender.org/blender/blender/pulls/141457