aboutsummaryrefslogtreecommitdiff
path: root/games-frame-pacing/CMakeLists.txt
blob: 3445fa9a763dc3fb2c63065a6419c9be88f390ce (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
cmake_minimum_required(VERSION 3.18.1)
project(swappy C CXX)
set(CMAKE_CXX_STANDARD 17)
set(IgnoreOldToolchainWarning "${ANDROID_UNIFIED_HEADERS}")

set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -Werror -Wthread-safety" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D _LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -O3 -fPIC" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections" )
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g0")
if ( DEFINED GAMESDK_THREAD_CHECKS )
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGAMESDK_THREAD_CHECKS=${GAMESDK_THREAD_CHECKS}" )
endif()

set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections" )
set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-s" )
set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--hash-style=both" )

set ( SOURCE_LOCATION .)
set ( SOURCE_LOCATION_COMMON "${SOURCE_LOCATION}/common" )
set ( SOURCE_LOCATION_OPENGL "${SOURCE_LOCATION}/opengl" )
set ( SOURCE_LOCATION_VULKAN "${SOURCE_LOCATION}/vulkan" )
set ( SOURCE_LOCATION_TEST "${SOURCE_LOCATION}/src/androidTest/cpp" )

include_directories( ../include )
include_directories( ../src/common )
include_directories( common )
include_directories( opengl )
include_directories( vulkan )
include_directories( ${ANDROID_NDK}/sources/third_party/vulkan/src/common )

message( STATUS "Building swappy_static to ${CMAKE_CURRENT_BINARY_DIR}/build" )


# In order to support ChoreographerCallbacks back on older android versions we have a hack here
# which adds the dex file from :games-frame-pacing:extras to our binary.
# Android studio seems to use two different linkers and only one of those linkers requires we pass
# in the emulation option "-m".
# This linker which will be found in a path similar to this:
# 21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android-ld
# does not require the "-m" option.
# The more general linker which can be found in a path similar to this:
# 21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld
# does require the "-m" option
if(CMAKE_LINKER MATCHES ".*/ld.lld" AND ANDROID_NDK_MAJOR GREATER 17)
  if ( ANDROID_NDK_ABI_NAME MATCHES "armeabi-v7a")
    set (LINKER_TARGET_EMULATION_OPTION "-m" "armelf_linux_eabi")
  elseif(ANDROID_NDK_ABI_NAME MATCHES "arm64-v8a")
    set (LINKER_TARGET_EMULATION_OPTION "-m" "aarch64linux")
  elseif(ANDROID_NDK_ABI_NAME MATCHES "x86_64")
    set (LINKER_TARGET_EMULATION_OPTION "-m" "elf_x86_64")
  elseif(ANDROID_NDK_ABI_NAME MATCHES "x86")
      set (LINKER_TARGET_EMULATION_OPTION "-m" "elf_i386")
  endif()
endif()

add_custom_command(OUTPUT classes_dex.o
     COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}/extras/out/intermediates/dex/release/mergeDexRelease
     && ${CMAKE_LINKER}  ${LINKER_TARGET_EMULATION_OPTION} -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/classes_dex.o classes.dex
     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
     )

set_source_files_properties(
     classes_dex.o
     PROPERTIES
     EXTERNAL_OBJECT true
     GENERATED true
)

add_library( swappy_static

             STATIC

             ${SOURCE_LOCATION_COMMON}/ChoreographerFilter.cpp
             ${SOURCE_LOCATION_COMMON}/ChoreographerThread.cpp
             ${SOURCE_LOCATION_COMMON}/CpuInfo.cpp
             ${SOURCE_LOCATION_COMMON}/Settings.cpp
             ${SOURCE_LOCATION_COMMON}/Thread.cpp
             ${SOURCE_LOCATION_COMMON}/SwappyCommon.cpp
             ${SOURCE_LOCATION_COMMON}/swappy_c.cpp
             ${SOURCE_LOCATION_COMMON}/SwappyDisplayManager.cpp
             ${SOURCE_LOCATION_COMMON}/CPUTracer.cpp
	     ${SOURCE_LOCATION_COMMON}/FrameStatistics.cpp
             ${SOURCE_LOCATION_OPENGL}/EGL.cpp
             ${SOURCE_LOCATION_OPENGL}/swappyGL_c.cpp
             ${SOURCE_LOCATION_OPENGL}/SwappyGL.cpp
             ${SOURCE_LOCATION_OPENGL}/FrameStatisticsGL.cpp
             ${SOURCE_LOCATION_VULKAN}/swappyVk_c.cpp
             ${SOURCE_LOCATION_VULKAN}/SwappyVk.cpp
             ${SOURCE_LOCATION_VULKAN}/SwappyVkBase.cpp
             ${SOURCE_LOCATION_VULKAN}/SwappyVkFallback.cpp
             ${SOURCE_LOCATION_VULKAN}/SwappyVkGoogleDisplayTiming.cpp
             ${SOURCE_LOCATION}/../src/common/system_utils.cpp
             ${CMAKE_CURRENT_BINARY_DIR}/classes_dex.o
             # Add new source files here
             )

set_target_properties( swappy_static PROPERTIES
     LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/build )

add_library( swappy

             SHARED

             ${SOURCE_LOCATION_COMMON}/swappy_c.cpp
             ${SOURCE_LOCATION_OPENGL}/swappyGL_c.cpp
             ${SOURCE_LOCATION_VULKAN}/swappyVk_c.cpp)


target_link_libraries( swappy

                        swappy_static
                        android
                        GLESv2
                        log
			atomic)


option(BUILD_TEST "Build native tests" OFF)
if(BUILD_TEST)

     find_package(googletest REQUIRED CONFIG)
     find_package(junit-gtest REQUIRED CONFIG)

     add_library(swappy_test SHARED ${SOURCE_LOCATION_TEST}/swappy_test.cpp)
     target_link_libraries(swappy_test
       PRIVATE
         swappy
         android
         atomic
         log
         googletest::gtest
         googletest::gmock
         junit-gtest::junit-gtest
     )
endif()
unset(BUILD_TEST CACHE)