summaryrefslogtreecommitdiffstats
path: root/meta/recipes-graphics/vulkan/vulkan-samples/0001-support-link-against-libatomic-if-no-built-in-atomic.patch
blob: 6c0fb60868bfef771283db9b1efb32e2140203ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
From e20a5d13935a41a856e8f71c49f2cc9d81b1d92c Mon Sep 17 00:00:00 2001
From: Changqing Li <changqing.li@windriver.com>
Date: Fri, 13 Nov 2020 17:07:00 +0800
Subject: [PATCH] support link against libatomic if no built-in atomic exist

fix error:
| framework/lib/ppc/libframework.a(device.cpp.o): in function `std::__atomic_base<unsigned long long>::load(std::memory_order) const':
| /usr/include/c++/10.2.0/bits/atomic_base.h:426: undefined reference to `__atomic_load_8'

Upstream-Status: Submitted [https://github.com/KhronosGroup/Vulkan-Samples/pull/212]

Signed-off-by: Changqing Li <changqing.li@windriver.com>
---
 CMakeLists.txt                  |  1 +
 bldsys/cmake/check_atomic.cmake | 62 +++++++++++++++++++++++++++++++++
 framework/CMakeLists.txt        |  4 +++
 3 files changed, 67 insertions(+)
 create mode 100644 bldsys/cmake/check_atomic.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e72e829..466f51d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -42,6 +42,7 @@ endmacro(vulkan_samples_pch)
 include(utils)
 include(global_options)
 include(sample_helper)
+include(check_atomic)
 
 # Add third party libraries
 add_subdirectory(third_party)
diff --git a/bldsys/cmake/check_atomic.cmake b/bldsys/cmake/check_atomic.cmake
new file mode 100644
index 0000000..6b47a7a
--- /dev/null
+++ b/bldsys/cmake/check_atomic.cmake
@@ -0,0 +1,62 @@
+# check weither need to link atomic library explicitly
+INCLUDE(CheckCXXSourceCompiles)
+INCLUDE(CheckLibraryExists)
+
+if(NOT DEFINED VULKAN_COMPILER_IS_GCC_COMPATIBLE)
+  if(CMAKE_COMPILER_IS_GNUCXX)
+    set(VULKAN_COMPILER_IS_GCC_COMPATIBLE ON) 
+  elseif( MSVC )
+    set(VULKAN_COMPILER_IS_GCC_COMPATIBLE OFF)
+  elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
+    set(VULKAN_COMPILER_IS_GCC_COMPATIBLE ON) 
+  elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel" )
+    set(VULKAN_COMPILER_IS_GCC_COMPATIBLE ON) 
+  endif()
+endif()
+
+# Sometimes linking against libatomic is required for atomic ops, if
+# the platform doesn't support lock-free atomics.
+
+function(check_working_cxx_atomics varname)
+  set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
+  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11")
+  CHECK_CXX_SOURCE_COMPILES("
+#include <atomic>
+std::atomic<int> x;
+std::atomic<short> y;
+std::atomic<char> z;
+int main() {
+  ++z;
+  ++y;
+  return ++x;
+}
+" ${varname})
+  set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
+endfunction(check_working_cxx_atomics)
+
+function(check_working_cxx_atomics64 varname)
+  set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
+  set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}")
+  CHECK_CXX_SOURCE_COMPILES("
+#include <atomic>
+#include <cstdint>
+std::atomic<uint64_t> x (0);
+int main() {
+  uint64_t i = x.load(std::memory_order_relaxed);
+  (void)i;
+  return 0;
+}
+" ${varname})
+  set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
+endfunction(check_working_cxx_atomics64)
+
+set(NEED_LINK_ATOMIC  OFF CACHE BOOL "weither need to link against atomic library")
+if(VULKAN_COMPILER_IS_GCC_COMPATIBLE)
+    # check if non-64-bit atomics work without the library.
+    check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
+    # check 64-bit atomics work without the library.
+    check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB)
+    if (NOT HAVE_CXX_ATOMICS_WITHOUT_LIB OR NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
+        set(NEED_LINK_ATOMIC  ON CACHE BOOL "weither need to link to atomic library" FORCE)
+    endif()
+endif()
diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt
index bf26786..322526e 100644
--- a/framework/CMakeLists.txt
+++ b/framework/CMakeLists.txt
@@ -412,6 +412,10 @@ target_link_libraries(${PROJECT_NAME}
     ctpl
     docopt)
 
+if(${NEED_LINK_ATOMIC})
+    target_link_libraries(${PROJECT_NAME} atomic)
+endif()
+
 # Link platform specific libraries
 if(ANDROID)
     target_link_libraries(${PROJECT_NAME} log android native_app_glue)
-- 
2.17.1