Skip to content

Commit 286e578

Browse files
committed
[Linux] Add SSE4.2 support runtime check.
1 parent 250ef8d commit 286e578

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

platform/linuxbsd/godot_linuxbsd.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@
4141
#include <sys/resource.h>
4242
#endif
4343

44+
#if defined(__x86_64) || defined(__x86_64__)
45+
void __cpuid(int *r_cpuinfo, int p_info) {
46+
// Note: Some compilers have a buggy `__cpuid` intrinsic, using inline assembly (based on LLVM-20 implementation) instead.
47+
__asm__ __volatile__(
48+
"xchgq %%rbx, %q1;"
49+
"cpuid;"
50+
"xchgq %%rbx, %q1;"
51+
: "=a"(r_cpuinfo[0]), "=r"(r_cpuinfo[1]), "=c"(r_cpuinfo[2]), "=d"(r_cpuinfo[3])
52+
: "0"(p_info));
53+
}
54+
#endif
55+
4456
// For export templates, add a section; the exporter will patch it to enclose
4557
// the data appended to the executable (bundled PCK).
4658
#if !defined(TOOLS_ENABLED) && defined(__GNUC__)
@@ -54,6 +66,27 @@ extern "C" const char *pck_section_dummy_call() {
5466
#endif
5567

5668
int main(int argc, char *argv[]) {
69+
#if defined(__x86_64) || defined(__x86_64__)
70+
int cpuinfo[4];
71+
__cpuid(cpuinfo, 0x01);
72+
73+
if (!(cpuinfo[2] & (1 << 20))) {
74+
printf("A CPU with SSE4.2 instruction set support is required.\n");
75+
76+
int ret = system("zenity --warning --title \"Godot Engine\" --text \"A CPU with SSE4.2 instruction set support is required.\" 2> /dev/null");
77+
if (ret != 0) {
78+
ret = system("kdialog --title \"Godot Engine\" --sorry \"A CPU with SSE4.2 instruction set support is required.\" 2> /dev/null");
79+
}
80+
if (ret != 0) {
81+
ret = system("Xdialog --title \"Godot Engine\" --msgbox \"A CPU with SSE4.2 instruction set support is required.\" 0 0 2> /dev/null");
82+
}
83+
if (ret != 0) {
84+
ret = system("xmessage -center -title \"Godot Engine\" \"A CPU with SSE4.2 instruction set support is required.\" 2> /dev/null");
85+
}
86+
abort();
87+
}
88+
#endif
89+
5790
#if defined(SANITIZERS_ENABLED)
5891
// Note: Set stack size to be at least 30 MB (vs 8 MB default) to avoid overflow, address sanitizer can increase stack usage up to 3 times.
5992
struct rlimit stack_lim = { 0x1E00000, 0x1E00000 };

0 commit comments

Comments
 (0)