Merge branch 'blender-v5.0-release'
This commit is contained in:
@@ -77,9 +77,13 @@ ExternalProject_Add(external_osl
|
||||
URL_HASH ${OSL_HASH_TYPE}=${OSL_HASH}
|
||||
PREFIX ${BUILD_DIR}/osl
|
||||
|
||||
PATCH_COMMAND ${PATCH_CMD} -p 1 -d
|
||||
${BUILD_DIR}/osl/src/external_osl <
|
||||
${PATCH_DIR}/osl.diff
|
||||
PATCH_COMMAND
|
||||
${PATCH_CMD} -p 1 -d
|
||||
${BUILD_DIR}/osl/src/external_osl <
|
||||
${PATCH_DIR}/osl.diff &&
|
||||
${PATCH_CMD} -p 1 -d
|
||||
${BUILD_DIR}/osl/src/external_osl <
|
||||
${PATCH_DIR}/osl_supports_isa_thread.diff
|
||||
|
||||
CMAKE_ARGS
|
||||
-DCMAKE_INSTALL_PREFIX=${LIBDIR}/osl
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
From 69d11b6eebcfb1501193184333280ebd5985564e Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Sharybin <sergey@blender.org>
|
||||
Date: Thu, 9 Oct 2025 12:25:09 +0200
|
||||
Subject: [PATCH] Fix: LLVM_Util::supports_isa is not thread-safe
|
||||
|
||||
The supports_isa() function might be called from threads, and prior
|
||||
to this change it might have added entries to the global sCpuFeatures
|
||||
variable. This happened when detect_cpu_features() is called with
|
||||
TargetISA::UNKNOWN and the code was looking for the best ISA. This
|
||||
could lead to situation when the host CPU is ARM, and the probing
|
||||
happens for AVX512.
|
||||
|
||||
This change ensures that the supports_isa() accesses sCpuFeatures
|
||||
in the read-only manner.
|
||||
|
||||
This was originally noticed as unreliable OSL render tests in Blender
|
||||
reported at https://projects.blender.org/blender/blender/issues/147642
|
||||
|
||||
Signed-off-by: Sergey Sharybin <sergey@blender.org>
|
||||
---
|
||||
src/liboslexec/llvm_util.cpp | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/liboslexec/llvm_util.cpp b/src/liboslexec/llvm_util.cpp
|
||||
index f9b1296d..2d952567 100644
|
||||
--- a/src/liboslexec/llvm_util.cpp
|
||||
+++ b/src/liboslexec/llvm_util.cpp
|
||||
@@ -1443,7 +1443,16 @@ LLVM_Util::supports_isa(TargetISA target)
|
||||
continue;
|
||||
}
|
||||
OSL_DEV_ONLY(std::cout << "Testing for cpu feature:" << f << std::endl);
|
||||
- if (sCpuFeatures[f] == false) {
|
||||
+ // The required CPU feature for the specified target might not be in
|
||||
+ // the sCpuFeatures. This happens, for example, when the code is probing
|
||||
+ // the best target ISA when the requested one is UNKNOWN. In this case
|
||||
+ // it is possible that this function is called for the TargetISA::AVX512
|
||||
+ // on an ARM CPU.
|
||||
+ // This function might be called from multiple threads, so it is important
|
||||
+ // to keep the access to sCpuFeatures read-only.
|
||||
+ const auto cpu_feature_it = sCpuFeatures.find(f);
|
||||
+ if (cpu_feature_it == sCpuFeatures.end()
|
||||
+ || cpu_feature_it->second == false) {
|
||||
OSL_DEV_ONLY(std::cout << "MISSING cpu feature:" << f << std::endl);
|
||||
return false;
|
||||
}
|
||||
--
|
||||
2.51.0
|
||||
|
||||
Reference in New Issue
Block a user