# Codec common sources
add_subdirectory(apigen-codec-common)
add_subdirectory(compressedTextureFormats)

# GL
add_subdirectory(gl)

# Vulkan
add_subdirectory(vulkan)

# RenderControl decoder
add_subdirectory(renderControl_dec)

# Magma decoder
add_subdirectory(magma)

if(CONFIG_AEMU)
    add_compile_definitions(CONFIG_AEMU)
endif()

# Stream server core
set(stream-server-core-sources
    Buffer.cpp
    BlobManager.cpp
    ColorBuffer.cpp
    GfxStreamAgents.cpp
    VirtioGpuTimelines.cpp
    VsyncThread.cpp
    ChannelStream.cpp
    DisplaySurface.cpp
    DisplaySurfaceUser.cpp
    Hwc2.cpp
    PostWorker.cpp
    PostWorkerGl.cpp
    ReadBuffer.cpp
    RenderChannelImpl.cpp
    RenderThreadInfo.cpp
    RenderThreadInfoGl.cpp
    RenderThreadInfoMagma.cpp
    RingStream.cpp
    SyncThread.cpp
    RenderThread.cpp
    RenderControl.cpp
    RenderWindow.cpp
    RenderLibImpl.cpp
    RendererImpl.cpp
    FrameBuffer.cpp)
if (APPLE)
    set(stream-server-core-platform-sources NativeSubWindow_cocoa.m)
elseif (WIN32)
    set(stream-server-core-platform-sources NativeSubWindow_win32.cpp)
elseif (QNX)
    set(stream-server-core-platform-sources NativeSubWindow_qnx.cpp)
else()
    set(stream-server-core-platform-sources NativeSubWindow_x11.cpp)
endif()

add_library(
        gfxstream_backend_headers
        INTERFACE)
target_include_directories(
        gfxstream_backend_headers
        INTERFACE
        include)

# Compile everything as a static library first so that unit tests can call non-exported functions
add_library(
        gfxstream_backend_static
        STATIC
        ${stream-server-core-sources}
        ${stream-server-core-platform-sources}
)
target_link_libraries(
        gfxstream_backend_static
        PUBLIC
        GLES_CM_translator_static
        OpenGLESDispatch
        renderControl_dec
        gfxstream-gl-server
        gfxstream-magma-server
        gfxstream-vulkan-server
        gfxstream_egl_headers
        gfxstream-snapshot
        apigen-codec-common
        ${GFXSTREAM_HOST_COMMON_LIB}
        ${GFXSTREAM_BASE_LIB})

target_include_directories(
        gfxstream_backend_static
        PUBLIC
        ${GFXSTREAM_REPO_ROOT}
        ${GFXSTREAM_REPO_ROOT}/include
        ${GFXSTREAM_REPO_ROOT}/host
        ${GFXSTREAM_REPO_ROOT}/host/include
        ${GFXSTREAM_REPO_ROOT}/host/apigen-codec-common
        ${GFXSTREAM_REPO_ROOT}/host/gl
        ${GFXSTREAM_REPO_ROOT}/host/gl/glestranslator/include
        ${GFXSTREAM_REPO_ROOT}/host/magma
        ${GFXSTREAM_REPO_ROOT}/host/magma/magma_dec
        ${GFXSTREAM_REPO_ROOT}/host/vulkan
        ${GFXSTREAM_REPO_ROOT}/host/vulkan/cereal/common
        ${GFXSTREAM_REPO_ROOT}/third-party/fuchsia/magma/include
        ${GFXSTREAM_REPO_ROOT}/third-party/glm/include)

if (APPLE)
    target_link_libraries(gfxstream_backend_static PUBLIC "-framework AppKit -framework QuartzCore -framework IOSurface")
endif()
if (WIN32)
    target_link_libraries(gfxstream_backend_static PRIVATE D3d9.lib)
endif()

# Suppress some warnings generated by platform/aemu repo
target_compile_options(
    gfxstream_backend_static
    PRIVATE
    -Wno-invalid-offsetof
    -Wno-free-nonheap-object
    -Wno-attributes
    -DGFXSTREAM_ENABLE_HOST_GLES=1
    )

# gfxstream_backend.dll
add_library(
    gfxstream_backend
    SHARED
    render_api.cpp
    virtio-gpu-gfxstream-renderer.cpp)

target_link_libraries(
    gfxstream_backend
    PUBLIC
    gfxstream_backend_static
    PRIVATE
    )

if(BUILD_STANDALONE)
    target_link_libraries(gfxstream_backend
        PRIVATE
        gfxstream-gl-host-common)
endif()

if (APPLE)
    set_target_properties(gfxstream_backend
        PROPERTIES
        LINK_FLAGS  "-undefined dynamic_lookup -flat_namespace")
endif()

if(CONFIG_AEMU)
    android_install_shared(gfxstream_backend)
else()
    install(
      TARGETS gfxstream_backend RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX})
endif()

# Testing libraries
add_subdirectory(testlibs)

if (ENABLE_VKCEREAL_TESTS)

set(LIST_OF_TESTS)
function(discover_tests test_name)
if (WIN32)
    gtest_discover_tests(
        ${test_name}
        ${ARGN})
    list(APPEND LIST_OF_TESTS ${test_name})
    set(LIST_OF_TESTS ${LIST_OF_TESTS} PARENT_SCOPE)
else()
    gtest_discover_tests(
        ${test_name}
        ${ARGN}
    )
endif()
endfunction()
    # Backend unit tests
    add_executable(
        gfxstream_backend_unittests
        gfxstream_unittest.cpp)
    target_link_libraries(
        gfxstream_backend_unittests
        PRIVATE
        OSWindow
        gfxstream_backend
        aemu-host-common-testing-support
        ${GFXSTREAM_BASE_LIB}
        gtest_main)
        discover_tests(gfxstream_backend_unittests)

    # More functional tests#########################################################

    # Common testing support library################################################
    # This includes the server core and testing sources
    add_library(
        stream-server-testing-support
        tests/SampleApplication.cpp
        tests/GLSnapshotTesting.cpp
        tests/OpenGLTestContext.cpp
        tests/GLTestUtils.cpp
        tests/ShaderUtils.cpp
        tests/GLSnapshotTestDispatch.cpp
        tests/GLSnapshotTestStateUtils.cpp
        tests/HelloTriangleImp.cpp
        tests/ImageUtils.cpp)
    target_include_directories(
        stream-server-testing-support
        PUBLIC
        ${GFXSTREAM_REPO_ROOT}
        ${GFXSTREAM_REPO_ROOT}/include
        ${GFXSTREAM_REPO_ROOT}/host
        ${GFXSTREAM_REPO_ROOT}/host/gl/glestranslator/GLES_CM
        ${GFXSTREAM_REPO_ROOT}/host/gl/glestranslator/include
        ${GFXSTREAM_REPO_ROOT}/host/apigen-codec-common
        ${GFXSTREAM_REPO_ROOT}/host/vulkan)
    target_link_libraries(
        stream-server-testing-support
        PUBLIC
        aemu-host-common-testing-support
        aemu-base-testing-support
        gfxstream_backend_static
        gfxstream_stb
        OSWindow
        gtest)

    if (LINUX)
    add_library(
        x11_testing_support
        tests/X11TestingSupport.cpp)
    target_link_libraries(
        x11_testing_support
        aemu-base.headers)
    endif()

    # Basic opengl rendering tests##################################################
    add_executable(
        OpenglRender_unittests
        tests/FrameBuffer_unittest.cpp
        tests/GLES1Dispatch_unittest.cpp
        tests/DefaultFramebufferBlit_unittest.cpp
        tests/TextureDraw_unittest.cpp
        tests/StalePtrRegistry_unittest.cpp
        tests/VsyncThread_unittest.cpp)
    target_link_libraries(
        OpenglRender_unittests
        PRIVATE
        stream-server-testing-support
        aemu-host-common-testing-support
        aemu-base-testing-support
        gfxstream_backend_static
        gtest_main)
    if (LINUX)
        target_compile_definitions(
            OpenglRender_unittests
            PRIVATE GFXSTREAM_HAS_X11=1)
        target_link_libraries(
            OpenglRender_unittests
            PRIVATE x11_testing_support)
    endif()
    discover_tests(OpenglRender_unittests)

    # Snapshot tests################################################################
    add_executable(
        OpenglRender_snapshot_unittests
        tests/GLSnapshotBuffers_unittest.cpp
        tests/GLSnapshotFramebufferControl_unittest.cpp
        tests/GLSnapshotFramebuffers_unittest.cpp
        tests/GLSnapshotMultisampling_unittest.cpp
        tests/GLSnapshotPixelOperations_unittest.cpp
        tests/GLSnapshotPixels_unittest.cpp
        tests/GLSnapshotPrograms_unittest.cpp
        tests/GLSnapshotRasterization_unittest.cpp
        tests/GLSnapshotRenderbuffers_unittest.cpp
        tests/GLSnapshotRendering_unittest.cpp
        tests/GLSnapshotShaders_unittest.cpp
        tests/GLSnapshotTextures_unittest.cpp
        tests/GLSnapshotTransformation_unittest.cpp
        tests/GLSnapshotVertexAttributes_unittest.cpp
        tests/GLSnapshot_unittest.cpp)
    target_link_libraries(
        OpenglRender_snapshot_unittests
        PRIVATE
        stream-server-testing-support
        aemu-host-common-testing-support
        aemu-base-testing-support
        gfxstream_backend_static
        gtest_main)
    discover_tests(OpenglRender_snapshot_unittests)

    # Vulkan tests##################################################################
    add_executable(
        Vulkan_unittests
        tests/Vulkan_unittest.cpp
        tests/CompositorVk_unittest.cpp
        tests/SwapChainStateVk_unittest.cpp
        tests/DisplayVk_unittest.cpp
        tests/VirtioGpuTimelines_unittest.cpp
        vulkan/vk_util_unittest.cpp
        vulkan/VkFormatUtils_unittest.cpp
        vulkan/VkQsriTimeline_unittest.cpp
        vulkan/VkDecoderGlobalState_unittest.cpp
    )
    target_link_libraries(
        Vulkan_unittests
        PRIVATE
        stream-server-testing-support
        aemu-host-common-testing-support
        aemu-base-testing-support
        gfxstream_backend_static
        gtest
        gtest_main
        gmock)
    if (APPLE)
        target_compile_definitions(Vulkan_unittests PRIVATE -DVK_USE_PLATFORM_METAL_EXT)
        target_link_libraries(Vulkan_unittests PUBLIC "-framework AppKit")
    endif()
    discover_tests(
            Vulkan_unittests
            WORKING_DIRECTORY ${CMAKE_BINARY_DIR})

    if (APPLE)
        target_compile_definitions(Vulkan_unittests PRIVATE -DVK_USE_PLATFORM_METAL_EXT)
    elseif (QNX)
        target_compile_definitions(Vulkan_unittests PRIVATE -DVK_USE_PLATFORM_SCREEN_QNX)
    elseif (UNIX)
        target_compile_definitions(Vulkan_unittests PRIVATE -DVK_USE_PLATFORM_XCB_KHR)
    endif()


    file(GLOB Vulkan_unittests_datafiles "tests/testdata/*.png")
    add_custom_command(TARGET Vulkan_unittests POST_BUILD
                       COMMAND ${CMAKE_COMMAND} -E make_directory
                            ${CMAKE_BINARY_DIR}/tests/testdata
                       COMMAND ${CMAKE_COMMAND} -E copy_if_different
                            ${Vulkan_unittests_datafiles}
                            ${CMAKE_BINARY_DIR}/tests/testdata)

    add_executable(
            Vulkan_integrationtests
            vulkan/testing/VkDecoderTestDispatch.h
            vulkan/testing/VulkanTestHelper.cpp
    )
    target_link_libraries(
            Vulkan_integrationtests
            PRIVATE
            gfxstream_backend_static
            gfxstream-gl-server
            gfxstream-vulkan-server
            stream-server-testing-support
            gtest
            gtest_main
            gmock)
    discover_tests(Vulkan_integrationtests)
endif()
if (WIN32)
    set(BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    configure_file(../cmake/SetWin32TestEnvironment.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/SetWin32TestEnvironment.cmake @ONLY)
    set_property(DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES ${CMAKE_CURRENT_BINARY_DIR}/SetWin32TestEnvironment.cmake)
endif()
