Files
filament/libs/utils/CMakeLists.txt
Mathias Agopian 236d650ed7 Add display present time as well as compositor timings to FrameInfo (#9378)
* Use a custom, non-allocating map for frame ids

* use memory_order_relaxed for the id of heap allocated handles

* Added displayPresent time to FrameInfo

To do this, we added support for queryFrameTiming() to the backend,
as a synchronous API. Then FrameInfo uses it to update the
corresponding history entry.

displayPresent time can be used to detect "buffer stuffing", i.e.
when the GPU gets too much ahead of the display. Currently
the information is returned to the user only. Eventually filament will
make use of it to determine if a frame skip is mandated.

* API BREAK: rename frameTime to gpuFrameDuration

* FrameInfo now contains compositor timings

- the presentation deadline
- the refresh rate from the display
- the composition-display latency

* set FrameInfo data to INVALID if feature is not supported

report presentDeadline properly.
2025-10-30 15:33:26 -07:00

240 lines
8.0 KiB
CMake

cmake_minimum_required(VERSION 3.19)
project(utils)
set(TARGET utils)
set(TARGET_LINUX ${TARGET}/linux)
set(TARGET_GENERIC ${TARGET}/generic)
set(PUBLIC_HDR_DIR include)
# ==================================================================================================
# Sources and headers
# ==================================================================================================
file(GLOB_RECURSE PUBLIC_HDRS ${PUBLIC_HDR_DIR}/${TARGET}/*.h)
set(DIST_HDRS
${PUBLIC_HDR_DIR}/${TARGET}/algorithm.h
${PUBLIC_HDR_DIR}/${TARGET}/bitset.h
${PUBLIC_HDR_DIR}/${TARGET}/CallStack.h
${PUBLIC_HDR_DIR}/${TARGET}/debug.h
${PUBLIC_HDR_DIR}/${TARGET}/Allocator.h
${PUBLIC_HDR_DIR}/${TARGET}/BitmaskEnum.h
${PUBLIC_HDR_DIR}/${TARGET}/compiler.h
${PUBLIC_HDR_DIR}/${TARGET}/compressed_pair.h
${PUBLIC_HDR_DIR}/${TARGET}/CString.h
${PUBLIC_HDR_DIR}/${TARGET}/ImmutableCString.h
${PUBLIC_HDR_DIR}/${TARGET}/Entity.h
${PUBLIC_HDR_DIR}/${TARGET}/EntityInstance.h
${PUBLIC_HDR_DIR}/${TARGET}/EntityManager.h
${PUBLIC_HDR_DIR}/${TARGET}/FixedCapacityVector.h
${PUBLIC_HDR_DIR}/${TARGET}/Hash.h
${PUBLIC_HDR_DIR}/${TARGET}/InternPool.h
${PUBLIC_HDR_DIR}/${TARGET}/Invocable.h
${PUBLIC_HDR_DIR}/${TARGET}/Log.h
${PUBLIC_HDR_DIR}/${TARGET}/Logger.h
${PUBLIC_HDR_DIR}/${TARGET}/memalign.h
${PUBLIC_HDR_DIR}/${TARGET}/MonotonicRingMap.h
${PUBLIC_HDR_DIR}/${TARGET}/Mutex.h
${PUBLIC_HDR_DIR}/${TARGET}/NameComponentManager.h
${PUBLIC_HDR_DIR}/${TARGET}/ostream.h
${PUBLIC_HDR_DIR}/${TARGET}/Panic.h
${PUBLIC_HDR_DIR}/${TARGET}/Path.h
${PUBLIC_HDR_DIR}/${TARGET}/PrivateImplementation.h
${PUBLIC_HDR_DIR}/${TARGET}/PrivateImplementation-impl.h
${PUBLIC_HDR_DIR}/${TARGET}/RefCountedMap.h
${PUBLIC_HDR_DIR}/${TARGET}/SingleInstanceComponentManager.h
${PUBLIC_HDR_DIR}/${TARGET}/Slice.h
${PUBLIC_HDR_DIR}/${TARGET}/StaticString.h
${PUBLIC_HDR_DIR}/${TARGET}/Status.h
${PUBLIC_HDR_DIR}/${TARGET}/StructureOfArrays.h
${PUBLIC_HDR_DIR}/${TARGET}/Systrace.h
${PUBLIC_HDR_DIR}/${TARGET}/sstream.h
${PUBLIC_HDR_DIR}/${TARGET}/unwindows.h
)
# Use our custom mutex/condition only on ANDROID
set(DIST_ANDROID_HDRS
${PUBLIC_HDR_DIR}/${TARGET_LINUX}/Mutex.h
)
set(DIST_GENERIC_HDRS
${PUBLIC_HDR_DIR}/${TARGET_GENERIC}/Mutex.h
)
set(SRCS
src/api_level.cpp
src/architecture.cpp
src/ashmem.cpp
src/debug.cpp
src/Allocator.cpp
src/AsyncJobQueue.cpp
src/CallStack.cpp
src/CString.cpp
src/CountDownLatch.cpp
src/CyclicBarrier.cpp
src/EntityManager.cpp
src/EntityManagerImpl.h
src/FixedCapacityVectorBase.cpp
src/ImmutableCString.cpp
src/Invocable.cpp
src/JobSystem.cpp
src/Log.cpp
src/NameComponentManager.cpp
src/ostream.cpp
src/Panic.cpp
src/Path.cpp
src/Profiler.cpp
src/sstream.cpp
src/string.cpp
src/ThreadUtils.cpp
src/Status.cpp
)
if (WIN32)
list(APPEND SRCS src/win32/Path.cpp)
endif()
if (ANDROID)
list(APPEND SRCS src/android/ThermalManager.cpp)
list(APPEND SRCS src/android/PerformanceHintManager.cpp)
list(APPEND SRCS src/android/Systrace.cpp)
if (FILAMENT_ENABLE_PERFETTO)
list(APPEND SRCS src/android/Tracing.cpp)
endif()
endif()
if (LINUX OR ANDROID)
list(APPEND SRCS src/linux/Condition.cpp)
list(APPEND SRCS src/linux/Mutex.cpp)
list(APPEND SRCS src/linux/Path.cpp)
endif()
if (APPLE)
list(APPEND SRCS src/darwin/Path.mm)
list(APPEND SRCS src/darwin/Systrace.cpp)
list(APPEND SRCS src/darwin/Tracing.cpp)
endif()
if (WEBGL)
list(APPEND SRCS src/web/Path.cpp)
endif()
# ==================================================================================================
# Includes and target definition
# ==================================================================================================
include_directories(${PUBLIC_HDR_DIR})
add_library(${TARGET} STATIC ${PUBLIC_HDRS} ${SRCS})
target_include_directories(${TARGET} PUBLIC ${PUBLIC_HDR_DIR})
set_target_properties(${TARGET} PROPERTIES FOLDER Libs)
target_link_libraries(${TARGET} PUBLIC tsl)
if (ANDROID)
target_link_libraries(${TARGET} PUBLIC log)
target_link_libraries(${TARGET} PRIVATE dl)
target_link_libraries(${TARGET} PUBLIC android)
if (FILAMENT_ENABLE_PERFETTO)
target_link_libraries(${TARGET} PUBLIC perfetto)
endif()
endif()
if (WIN32)
# Needed for shlwapi.h (GetModuleFileName)
target_link_libraries(${TARGET} PUBLIC Shlwapi)
endif()
if (APPLE)
# Needed for NSTemporaryDirectory()
target_link_libraries(${TARGET} PRIVATE "-framework Foundation")
endif()
if (LINUX)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(${TARGET} PRIVATE Threads::Threads)
target_link_libraries(${TARGET} PRIVATE dl)
endif()
# ==================================================================================================
# Installation
# ==================================================================================================
set(INSTALL_TYPE ARCHIVE)
install(TARGETS ${TARGET} ${INSTALL_TYPE} DESTINATION lib/${DIST_DIR})
install(FILES ${DIST_HDRS} DESTINATION include/${TARGET})
if (ANDROID)
install(FILES ${DIST_ANDROID_HDRS} DESTINATION include/${TARGET_LINUX})
else()
install(FILES ${DIST_GENERIC_HDRS} DESTINATION include/${TARGET_GENERIC})
endif()
# ==================================================================================================
# Test executables
# ==================================================================================================
set(TEST_SRCS
test/test_algorithm.cpp
test/test_Allocators.cpp
test/test_bitset.cpp
test/test_CountDownLatch.cpp
test/test_CString.cpp
test/test_ImmutableCString.cpp
test/test_CyclicBarrier.cpp
test/test_Entity.cpp
test/test_FixedCapacityVector.cpp
test/test_FixedCircularBuffer.cpp
test/test_Hash.cpp
test/test_InternPool.cpp
test/test_JobSystem.cpp
test/test_MonotonicRingMap.cpp
test/test_QuadTreeArray.cpp
test/test_RangeMap.cpp
test/test_RefCountedMap.cpp
test/test_Slice.cpp
test/test_StructureOfArrays.cpp
test/test_sstream.cpp
test/test_string.cpp
test/test_utils_main.cpp
test/test_Zip2Iterator.cpp
test/test_BinaryTreeArray.cpp
test/test_Status.cpp
)
if (WEBGL_PTHREADS)
target_compile_definitions(${TARGET} PUBLIC -DFILAMENT_WASM_THREADS)
endif()
# The Path tests are platform-specific
if (NOT WEBGL)
if (WIN32)
list(APPEND TEST_SRCS test/test_WinPath.cpp)
else()
list(APPEND TEST_SRCS test/test_Path.cpp)
endif()
endif()
add_executable(test_${TARGET} ${TEST_SRCS})
target_link_libraries(test_${TARGET} PRIVATE gtest utils tsl math)
set_target_properties(test_${TARGET} PROPERTIES FOLDER Tests)
# ==================================================================================================
# Benchmarks
# ==================================================================================================
if (NOT WEBGL)
add_library(benchmark_${TARGET}_callee SHARED benchmark/benchmark_callee.cpp)
set_target_properties(benchmark_${TARGET}_callee PROPERTIES FOLDER Benchmarks)
set(BENCHMARK_SRCS
benchmark/benchmark_allocators.cpp
benchmark/benchmark_binary_search.cpp
benchmark/benchmark_calls.cpp
benchmark/benchmark_JobSystem.cpp
benchmark/benchmark_mutex.cpp
benchmark/benchmark_memcpy.cpp)
add_executable(benchmark_${TARGET} ${BENCHMARK_SRCS})
target_link_libraries(benchmark_${TARGET} PRIVATE benchmark_main utils benchmark_${TARGET}_callee)
set_target_properties(benchmark_${TARGET} PROPERTIES FOLDER Benchmarks)
endif()