@@ -, +, @@ --- graphics/mesa-dri/Makefile | 2 +- .../files/patch-src_util_u__cpu__detect.c | 95 +++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 graphics/mesa-dri/files/patch-src_util_u__cpu__detect.c --- b/graphics/mesa-dri/Makefile +++ b/graphics/mesa-dri/Makefile @@ -3,7 +3,7 @@ PORTNAME= mesa-dri PORTVERSION= ${MESAVERSION} -PORTREVISION= 4 +PORTREVISION= 5 CATEGORIES= graphics COMMENT= OpenGL hardware acceleration drivers for DRI2+ --- /dev/null +++ b/graphics/mesa-dri/files/patch-src_util_u__cpu__detect.c @@ -0,0 +1,95 @@ +- Detect NEON/AltiVec/VSX on FreeBSD + +--- src/util/u_cpu_detect.c.orig 2019-01-17 11:26:23 UTC ++++ src/util/u_cpu_detect.c +@@ -47,16 +47,18 @@ + #endif + #endif + +-#if defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD) ++#if defined(PIPE_OS_BSD) + #include + #include + #include + #endif + +-#if defined(PIPE_OS_FREEBSD) || defined(PIPE_OS_DRAGONFLY) +-#include +-#include ++#if defined(PIPE_OS_FREEBSD) ++#if __has_include() ++#include ++#define HAVE_ELF_AUX_INFO + #endif ++#endif + + #if defined(PIPE_OS_LINUX) + #include +@@ -92,7 +94,7 @@ static int has_cpuid(void); + #endif + + +-#if defined(PIPE_ARCH_PPC) && !defined(PIPE_OS_APPLE) ++#if defined(PIPE_ARCH_PPC) && !defined(PIPE_OS_APPLE) && !defined(PIPE_OS_BSD) + static jmp_buf __lv_powerpc_jmpbuf; + static volatile sig_atomic_t __lv_powerpc_canjump = 0; + +@@ -113,8 +115,20 @@ sigill_handler(int sig) + static void + check_os_altivec_support(void) + { +-#if defined(PIPE_OS_APPLE) ++#if defined(__ALTIVEC__) ++ util_cpu_caps.has_altivec = 1; ++#endif ++#if defined(__VSX__) ++ util_cpu_caps.has_vsx = 1; ++#endif ++#if defined(__ALTIVEC__) && defined(__VSX__) ++/* Do nothing */ ++#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD) ++#ifdef HW_VECTORUNIT + int sels[2] = {CTL_HW, HW_VECTORUNIT}; ++#else ++ int sels[2] = {CTL_MACHDEP, CPU_ALTIVEC}; ++#endif + int has_vu = 0; + int len = sizeof (has_vu); + int err; +@@ -126,7 +140,19 @@ check_os_altivec_support(void) + util_cpu_caps.has_altivec = 1; + } + } +-#else /* !PIPE_OS_APPLE */ ++#elif defined(PIPE_OS_FREEBSD) /* !PIPE_OS_APPLE && !PIPE_OS_NETBSD && !PIPE_OS_OPENBSD */ ++ unsigned long hwcap = 0; ++#ifdef HAVE_ELF_AUX_INFO ++ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap)); ++#else ++ size_t len = sizeof(hwcap); ++ sysctlbyname("hw.cpu_features", &hwcap, &len, NULL, 0); ++#endif ++ if (hwcap & PPC_FEATURE_HAS_ALTIVEC) ++ util_cpu_caps.has_altivec = 1; ++ if (hwcap & PPC_FEATURE_HAS_VSX) ++ util_cpu_caps.has_vsx = 1; ++#else /* !PIPE_OS_APPLE && !PIPE_OS_BSD */ + /* not on Apple/Darwin, do it the brute-force way */ + /* this is borrowed from the libmpeg2 library */ + signal(SIGILL, sigill_handler); +@@ -339,7 +365,14 @@ check_os_arm_support(void) + * used. Because of this we cannot use PIPE_OS_ANDROID here, but rather + * have a separate macro that only gets enabled from respective Android.mk. + */ +-#if defined(HAS_ANDROID_CPUFEATURES) ++#if defined(__ARM_NEON) || defined(__ARM_NEON__) ++ util_cpu_caps.has_neon = 1; ++#elif defined(PIPE_OS_FREEBSD) && defined(HAVE_ELF_AUX_INFO) ++ unsigned long hwcap = 0; ++ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap)); ++ if (hwcap & HWCAP_NEON) ++ util_cpu_caps.has_neon = 1; ++#elif defined(HAS_ANDROID_CPUFEATURES) + AndroidCpuFamily cpu_family = android_getCpuFamily(); + uint64_t cpu_features = android_getCpuFeatures(); +