[Bf-blender-cvs] [ef73d54] master: Fix T38815
Martijn Berger
noreply at git.blender.org
Tue Feb 25 18:01:11 CET 2014
Commit: ef73d547cc7c663ad180721094c81b3c81482ac3
Author: Martijn Berger
Date: Tue Feb 25 17:57:05 2014 +0100
https://developer.blender.org/rBef73d547cc7c663ad180721094c81b3c81482ac3
Fix T38815
For AVX support we need to check both OS support and CPU support.
===================================================================
M intern/cycles/util/util_system.cpp
===================================================================
diff --git a/intern/cycles/util/util_system.cpp b/intern/cycles/util/util_system.cpp
index 3d7781f..c489862 100644
--- a/intern/cycles/util/util_system.cpp
+++ b/intern/cycles/util/util_system.cpp
@@ -161,8 +161,24 @@ static CPUCapabilities& system_cpu_capabilities()
caps.sse41 = (result[2] & ((int)1 << 19)) != 0;
caps.sse42 = (result[2] & ((int)1 << 20)) != 0;
- caps.avx = (result[2] & ((int)1 << 28)) != 0;
caps.fma3 = (result[2] & ((int)1 << 12)) != 0;
+ caps.avx = false;
+ bool os_uses_xsave_xrestore = result[2] & ((int)1 << 27) != 0;
+ bool cpu_avx_support = (result[2] & ((int)1 << 28)) != 0;
+
+ if( os_uses_xsave_xrestore && cpu_avx_support) {
+ // Check if the OS will save the YMM registers
+ uint32_t xcr_feature_mask;
+ #if defined(__GNUC__)
+ int edx; // not used
+ __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a" (xcr_feature_mask) , "=d" (edx) : "c" (0) ); /* actual opcode for xgetbv */
+ #elif defined(_MSC_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
+ xcr_feature_mask = (uint32_t)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); /* min VS2010 SP1 compiler is required */
+ #else
+ xcr_feature_mask = 0;
+ #endif
+ caps.avx = (xcr_feature_mask & 0x6) == 0x6;
+ }
}
#if 0
More information about the Bf-blender-cvs
mailing list