# Configure and add `astc-encoder`, if needed
if (ASTC_CPU_DECODING)
    set(DECOMPRESSOR ON)   # Disable compression code
    set(CLI OFF)           # Disable the command line interface

    # Compile with the AVX2 instruction set. This is the fastest option available on x86_64.
    # At run time, if the CPU doesn't support AVX2, the library will simply return an error status
    # during initialization and we will fall back on the compute shader to decompress ASTC textures.
    #
    # In the future, we should define `ASTCENC_DYNAMIC_LIBRARY` and build multiple versions of the
    # library for each SIMD architecture, and dynamically load the fastest one at run time.
    # See also: https://github.com/ARM-software/astc-encoder/issues/79
    set(ISA_AVX2 ON)

    add_subdirectory(astc-encoder)
endif ()

# Enable perfetto in CMake if needed
# add_subdirectory(perfetto-tracing-only)
add_subdirectory(renderdoc)
add_subdirectory(stb)

if(ENABLE_VKCEREAL_TESTS)
    set(AEMU_BASE_USE_LZ4 ON CACHE BOOL "" FORCE)
endif()

if(NOT TARGET lz4_static AND AEMU_BASE_USE_LZ4)
    set(BUILD_STATIC_LIBS ON CACHE BOOL "" FORCE)
    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        set(LZ4_PATH ${PROJECT_SOURCE_DIR}/../../../external/lz4/build/cmake)
        if(EXISTS ${LZ4_PATH})
            add_subdirectory(${LZ4_PATH} lz4)
        endif()
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        find_package(PkgConfig REQUIRED)
        pkg_search_module(lz4 REQUIRED IMPORTED_TARGET GLOBAL liblz4)
        add_library(lz4_static ALIAS PkgConfig::lz4)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            lz4
            GIT_REPOSITORY https://android.googlesource.com/platform/external/lz4
            GIT_REMOTE_NAME aosp
            GIT_TAG aosp/master
            GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
            GIT_PROGRESS TRUE
            SOURCE_SUBDIR build/cmake
        )
        FetchContent_MakeAvailable(lz4)
    endif()
endif()

if(NOT TARGET gtest_main AND ENABLE_VKCEREAL_TESTS)
    # For Windows: Prevent overriding the parent project's compiler/linker settings
    set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        set(GOOGLETEST_PATH ${PROJECT_SOURCE_DIR}/../../../external/googletest)
        if(EXISTS ${GOOGLETEST_PATH})
            add_subdirectory(${GOOGLETEST_PATH} googletest)
        endif()
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        find_package(PkgConfig REQUIRED)
        pkg_search_module(gtest REQUIRED IMPORTED_TARGET GLOBAL gtest)
        pkg_search_module(gtest_main REQUIRED IMPORTED_TARGET GLOBAL gtest_main)
        pkg_search_module(gmock REQUIRED IMPORTED_TARGET GLOBAL gmock)
        pkg_search_module(gmock_main REQUIRED IMPORTED_TARGET GLOBAL gmock_main)
        add_library(gtest ALIAS PkgConfig::gtest)
        add_library(gtest_main ALIAS PkgConfig::gtest_main)
        add_library(gmock ALIAS PkgConfig::gmock)
        add_library(gmock_main ALIAS PkgConfig::gmock_main)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            googletest
            GIT_REPOSITORY https://android.googlesource.com/platform/external/googletest
            GIT_REMOTE_NAME aosp
            GIT_TAG aosp/master
            GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
            GIT_PROGRESS TRUE
        )
        FetchContent_MakeAvailable(googletest)
    endif()
endif()

if(NOT TARGET aemu_common)
    set(AEMU_COMMON_BUILD_CONFIG "gfxstream" CACHE STRING "")
    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        set(AEMU_COMMON_PATH ${PROJECT_SOURCE_DIR}/../../../hardware/google/aemu)
        if(EXISTS ${AEMU_COMMON_PATH})
            add_subdirectory(${AEMU_COMMON_PATH} aemu_common)
        endif()
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        find_package(PkgConfig REQUIRED)
        set(AEMU_PC_FILES
            aemu_base
            aemu_logging
            aemu_host_common
            aemu_base_testing_support
            aemu_host_common_testing_support
            aemu_snapshot)
        foreach(PC_FILE IN LISTS AEMU_PC_FILES)
            pkg_search_module(${PC_FILE} REQUIRED IMPORTED_TARGET GLOBAL ${PC_FILE}>=0.0.0)
        endforeach()

        add_library(aemu-base.headers INTERFACE)
        target_include_directories(aemu-base.headers INTERFACE ${aemu_base_INCLUDE_DIRS})

        add_library(aemu-host-common.headers INTERFACE)
        target_include_directories(aemu-host-common.headers INTERFACE ${aemu_host_common_INCLUDE_DIRS})
        target_link_libraries(aemu-host-common.headers INTERFACE renderdoc gfxstream_vulkan_headers)

        add_library(gfxstream-snapshot.headers INTERFACE)
        target_include_directories(gfxstream-snapshot.headers INTERFACE ${aemu_snapshot_INCLUDE_DIRS})
        add_library(gfxstream-snapshot ALIAS PkgConfig::aemu_snapshot)

        add_library(logging-base INTERFACE)
        target_link_libraries(logging-base INTERFACE PkgConfig::aemu_logging)

        if (WIN32)
            set(aemu-base-platform-deps Shlwapi)
        else()
            set(aemu-base-platform-deps dl rt)
        endif()
        add_library(aemu-base INTERFACE)
        target_link_libraries(
            aemu-base
            INTERFACE
            PkgConfig::aemu_base
            logging-base
            ${aemu-base-platform-deps})
        if(TARGET lz4_static)
            target_link_libraries(aemu-base INTERFACE lz4_static)
        endif()
        if(TARGET perfetto-tracing-only)
            target_link_libraries(aemu-base INTERFACE perfetto-tracing-only)
        endif()
        add_library(aemu-host-common INTERFACE)
        target_link_libraries(aemu-host-common INTERFACE PkgConfig::aemu_host_common aemu-base)

        add_library(aemu-base-testing-support INTERFACE)
        target_link_libraries(
            aemu-base-testing-support
            INTERFACE
            PkgConfig::aemu_base_testing_support
            aemu-base
            gmock
            gtest)

        add_library(aemu-host-common-testing-support INTERFACE)
        target_link_libraries(
            aemu-host-common-testing-support
            INTERFACE
            PkgConfig::aemu_host_common_testing_support
            PkgConfig::aemu_host_common
            PkgConfig::aemu_base
            PkgConfig::aemu_logging
            gmock
            gtest)
        if(TARGET lz4_static)
            target_link_libraries(aemu-host-common-testing-support INTERFACE lz4_static)
        endif()

        if(TARGET perfetto-tracing-only)
            target_link_libraries(aemu-host-common-testing-support INTERFACE perfetto-tracing-only)
        endif()
        add_library(aemu_common INTERFACE)
        target_link_libraries(aemu_common INTERFACE aemu-base aemu-host-common)
        target_include_directories(aemu_common INTERFACE aemu-base.headers aemu-host-common.headers)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            aemu_common
            GIT_REPOSITORY https://android.googlesource.com/platform/hardware/google/aemu
            GIT_REMOTE_NAME aosp
            GIT_TAG aosp/master
            GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
            GIT_PROGRESS TRUE
        )
        FetchContent_MakeAvailable(aemu_common)
    endif()
endif()

if(NOT TARGET gfxstream_vulkan_headers)
    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        set(GFXSTREAM_PROTOCOLS_PATH ${PROJECT_SOURCE_DIR}/../../../external/gfxstream-protocols)
        if(EXISTS ${GFXSTREAM_PROTOCOLS_PATH})
            add_subdirectory(${GFXSTREAM_PROTOCOLS_PATH} gfxstream-protocols)
        endif()
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        find_package(Vulkan 1.2.198 REQUIRED)
        add_library(gfxstream_vulkan_headers INTERFACE)
        target_include_directories(gfxstream_vulkan_headers INTERFACE ${Vulkan_INCLUDE_DIRS})
        target_compile_definitions(gfxstream_vulkan_headers
                                   INTERFACE VK_GFXSTREAM_STRUCTURE_TYPE_EXT)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            gfxstream_protocols
            GIT_REPOSITORY https://android.googlesource.com/platform/external/gfxstream-protocols
            GIT_REMOTE_NAME aosp
            GIT_TAG aosp/master
            GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
            GIT_PROGRESS TRUE
        )
        FetchContent_MakeAvailable(gfxstream_protocols)
    endif()
endif()

if(NOT TARGET flatbuffers)
    set(FLATBUFFERS_BUILD_TESTS OFF)
    set(FLATBUFFERS_BUILD_CPP17 ON)

    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        set(FLATBUFFERS_PATH ${PROJECT_SOURCE_DIR}/../../../external/flatbuffers)
        if(EXISTS ${FLATBUFFERS_PATH})
            add_subdirectory(${FLATBUFFERS_PATH} flatbuffers)
        endif()
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        find_package(PkgConfig REQUIRED)
        pkg_search_module(flatbuffers REQUIRED IMPORTED_TARGET GLOBAL flatbuffers>=2.0.6)
        add_library(flatbuffers ALIAS PkgConfig::flatbuffers)
        find_program(FLATC flatc NO_CACHE REQUIRED)
        add_executable(flatc IMPORTED GLOBAL)
        set_property(TARGET flatc PROPERTY IMPORTED_LOCATION ${FLATC})
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            flatbuffers
            GIT_REPOSITORY https://android.googlesource.com/platform/external/flatbuffers
            GIT_REMOTE_NAME aosp
            GIT_TAG aosp/master
            GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
            GIT_PROGRESS TRUE
        )
        FetchContent_MakeAvailable(flatbuffers)
    endif()
endif()

if (QNX) # QNX SDP provides EGL headers
    add_library(gfxstream_egl_headers INTERFACE)
    target_include_directories(gfxstream_egl_headers INTERFACE ${QNX_TARGET}/usr/include)
endif()

if(NOT TARGET gfxstream_egl_headers)
    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        # ANGLE provides the EGL headers for us.
        set(ANGLE_PATH ${PROJECT_SOURCE_DIR}/../../../external/angle)
        if(NOT EXISTS ${ANGLE_PATH})
            message(FATAL_ERROR "ANGLE is not found.")
        endif()
        add_library(gfxstream_egl_headers INTERFACE)
        target_include_directories(gfxstream_egl_headers INTERFACE ${ANGLE_PATH}/include)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        find_package(PkgConfig REQUIRED)
        pkg_search_module(egl REQUIRED IMPORTED_TARGET GLOBAL egl>=1.5)
        add_library(gfxstream_egl_headers ALIAS PkgConfig::egl)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            egl
            GIT_REPOSITORY https://github.com/KhronosGroup/EGL-Registry.git
            GIT_TAG main
            GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
            GIT_PROGRESS TRUE
        )
        FetchContent_MakeAvailable(egl)
        add_library(gfxstream_egl_headers INTERFACE)
        target_include_directories(gfxstream_egl_headers INTERFACE ${egl_SOURCE_DIR}/api)
    endif()
endif()

if(WITH_BENCHMARK)
    # Add Google's benchmarking framework
    set(BENCHMARK_ENABLE_EXCEPTIONS OFF)  # We disable exceptions in gfxstream
    set(BENCHMARK_ENABLE_TESTING OFF)     # Don't build the unit tests for the library, to save time
    set(BENCHMARK_ENABLE_GTEST_TESTS OFF)

    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        set(GOOGLE_BENCHMARK_PATH ${PROJECT_SOURCE_DIR}/../../../external/google-benchmark)
        if(EXISTS ${GOOGLE_BENCHMARK_PATH})
            add_subdirectory(${GOOGLE_BENCHMARK_PATH} google-benchmark)
        endif()
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        message(FATAL_ERROR "Not implemented")
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            google_benchmark
            GIT_REPOSITORY https://github.com/google/benchmark.git
            GIT_TAG v1.7.0
            GIT_PROGRESS TRUE
        )
        FetchContent_MakeAvailable(google_benchmark)
    endif()
endif()

if(NOT TARGET libdrm_headers)
    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
        set(LIBDRM_PATH ${PROJECT_SOURCE_DIR}/../../../external/libdrm)
        if(NOT EXISTS ${LIBDRM_PATH})
            message(FATAL_ERROR "LIBDRM is not found.")
        endif()
        add_library(libdrm_headers INTERFACE)
        target_include_directories(libdrm_headers INTERFACE ${LIBDRM_PATH}/include/drm)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "SYSTEM")
        find_package(PkgConfig REQUIRED)
        pkg_search_module(drm REQUIRED IMPORTED_TARGET GLOBAL libdrm)
        add_library(libdrm_headers ALIAS PkgConfig::drm)
    elseif(DEPENDENCY_RESOLUTION STREQUAL "DOWNLOAD")
        FetchContent_Declare(
            drm
            GIT_REPOSITORY https://gitlab.freedesktop.org/mesa/drm.git
            GIT_TAG main
            GIT_REMOTE_UPDATE_STRATEGY CHECKOUT
            GIT_PROGRESS TRUE
        )
        FetchContent_MakeAvailable(drm)
        add_library(libdrm_headers INTERFACE)
        target_include_directories(libdrm_headers INTERFACE ${drm_SOURCE_DIR}/include/drm)
    endif()
endif()

if(NOT TARGET aemu_common)
    message(FATAL_ERROR "The dependency aemu_common not found")
endif()
if(NOT TARGET gfxstream_vulkan_headers)
    message(FATAL_ERROR "The dependency gfxstream_vulkan_headers not found")
endif()
if(NOT TARGET flatbuffers)
    message(FATAL_ERROR "The dependency flatbuffers not found.")
endif()
if(NOT TARGET libdrm_headers)
    message(FATAL_ERROR "The dependency libdrm_headers not found.")
endif()
