# Platform port library

# Target file may define TCUTIL_PLATFORM_SRCS
if (NOT DEFINED TCUTIL_PLATFORM_SRCS)
	if (DE_OS_IS_WIN32)
		set(TCUTIL_PLATFORM_SRCS
			win32/tcuWin32Platform.hpp
			win32/tcuWin32Platform.cpp
			win32/tcuWGLContextFactory.hpp
			win32/tcuWGLContextFactory.cpp
			win32/tcuWGL.hpp
			win32/tcuWGL.cpp
			win32/tcuWin32API.h
			win32/tcuWin32Window.cpp
			win32/tcuWin32Window.hpp
			win32/tcuWin32EGLNativeDisplayFactory.hpp
			win32/tcuWin32EGLNativeDisplayFactory.cpp
			win32/tcuWin32VulkanPlatform.hpp
			win32/tcuWin32VulkanPlatform.cpp
			)

	elseif ((DE_OS_IS_UNIX OR DE_OS_IS_OSX) AND (DEQP_USE_X11 OR DEQP_USE_WAYLAND OR DEQP_USE_HEADLESS))

		set(TCUTIL_PLATFORM_SRCS
			lnx/tcuLnx.cpp
			lnx/tcuLnx.hpp
			lnx/tcuLnxPlatform.cpp
			lnx/tcuLnxPlatform.hpp
			lnx/tcuLnxEglPlatform.hpp
			lnx/tcuLnxEglPlatform.cpp
			lnx/tcuLnxVulkanPlatform.hpp
			lnx/tcuLnxVulkanPlatform.cpp
		)

		include_directories(lnx)

		if (DEQP_USE_X11)
			add_definitions(-DDEQP_SUPPORT_X11=1)
			include_directories(lnx/X11)

			message(STATUS "DEQP_SUPPORT_GLX        = ${DEQP_SUPPORT_GLX}")

			if (DEQP_SUPPORT_GLX)
				add_definitions(-DDEQP_SUPPORT_GLX=1)
			endif ()

			set(TCUTIL_PLATFORM_SRCS
				${TCUTIL_PLATFORM_SRCS}
				lnx/X11/tcuLnxX11.cpp
				lnx/X11/tcuLnxX11.hpp
				lnx/X11/tcuLnxX11EglDisplayFactory.hpp
				lnx/X11/tcuLnxX11EglDisplayFactory.cpp
				)

			if (DEQP_USE_XCB)
				set(TCUTIL_PLATFORM_SRCS
					${TCUTIL_PLATFORM_SRCS}
					lnx/X11/tcuLnxX11Xcb.hpp
					lnx/X11/tcuLnxX11Xcb.cpp
					)
			endif()

			if (DEQP_SUPPORT_GLX)
				set(TCUTIL_PLATFORM_SRCS
					${TCUTIL_PLATFORM_SRCS}
					lnx/X11/tcuLnxX11GlxPlatform.hpp
					lnx/X11/tcuLnxX11GlxPlatform.cpp
				)
			endif()
		endif()

		if (DEQP_USE_WAYLAND)
			add_definitions(-DDEQP_SUPPORT_WAYLAND=1)
			include_directories(lnx/wayland)

			pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
			pkg_get_variable(WAYLAND_SCANNER wayland-scanner wayland_scanner)

			set(DEQP_XDG_SHELL_PROTOCOL ${WAYLAND_PROTOCOLS_DIR}/stable/xdg-shell/xdg-shell.xml)
			set(DEQP_XDG_SHELL_GEN_OUTPUTS_DIR ${PROJECT_BINARY_DIR}/framework/platform)
			set(DEQP_XDG_SHELL_OUTPUTS
				${DEQP_XDG_SHELL_GEN_OUTPUTS_DIR}/xdg-shell.c
				${DEQP_XDG_SHELL_GEN_OUTPUTS_DIR}/xdg-shell.h)

			add_custom_command(
				COMMAND ${WAYLAND_SCANNER} ARGS client-header ${DEQP_XDG_SHELL_PROTOCOL} xdg-shell.h
				COMMAND ${WAYLAND_SCANNER} ARGS public-code ${DEQP_XDG_SHELL_PROTOCOL} xdg-shell.c
				DEPENDS ${DEQP_XDG_SHELL_PROTOCOL}
				OUTPUT ${DEQP_XDG_SHELL_OUTPUTS})

			add_custom_target(
				deqp-xdg-shell ALL
				DEPENDS ${DEQP_XDG_SHELL_OUTPUTS})

			set(TCUTIL_PLATFORM_SRCS
				${TCUTIL_PLATFORM_SRCS}
				lnx/wayland/tcuLnxWayland.hpp
				lnx/wayland/tcuLnxWayland.cpp
				lnx/wayland/tcuLnxWaylandEglDisplayFactory.cpp
				lnx/wayland/tcuLnxWaylandEglDisplayFactory.hpp
				${DEQP_XDG_SHELL_GEN_OUTPUTS_DIR}/xdg-shell.c
				${DEQP_XDG_SHELL_GEN_OUTPUTS_DIR}/xdg-shell.h
				)
			include_directories(${DEQP_XDG_SHELL_GEN_OUTPUTS_DIR})
			include_directories(wayland)
		endif()

		if (DEQP_USE_HEADLESS)
			add_definitions(-DDEQP_SUPPORT_HEADLESS=1)
		endif()

	elseif (DE_OS_IS_UNIX AND DEQP_USE_SURFACELESS)
		set(TCUTIL_PLATFORM_SRCS
			surfaceless/tcuSurfacelessPlatform.hpp
			surfaceless/tcuSurfacelessPlatform.cpp
			)

	elseif (DE_OS_IS_ANDROID)
		set(TCUTIL_PLATFORM_SRCS
			android/tcuAndroidExecService.cpp
			android/tcuAndroidExecService.hpp
			)

		if (DE_ANDROID_API GREATER 8)
			# Add NativeActivity code
			set(TCUTIL_PLATFORM_SRCS
				${TCUTIL_PLATFORM_SRCS}
				android/tcuAndroidAssets.cpp
				android/tcuAndroidAssets.hpp
				android/tcuAndroidNativeActivity.cpp
				android/tcuAndroidNativeActivity.hpp
				android/tcuAndroidPlatform.cpp
				android/tcuAndroidPlatform.hpp
				android/tcuAndroidRenderActivity.cpp
				android/tcuAndroidRenderActivity.hpp
				android/tcuAndroidTestActivity.cpp
				android/tcuAndroidTestActivity.hpp
				android/tcuAndroidUtil.cpp
				android/tcuAndroidUtil.hpp
				android/tcuAndroidWindow.cpp
				android/tcuAndroidWindow.hpp
				)
		endif ()

	elseif (DE_OS_IS_IOS)
		set(TCUTIL_PLATFORM_SRCS
			ios/tcuIOSApp.mm
			ios/tcuIOSApp.h
			ios/tcuIOSPlatform.mm
			ios/tcuIOSPlatform.hh
			)

	elseif (DE_OS_IS_OSX)
		set(TCUTIL_PLATFORM_SRCS
			osx/tcuOSXPlatform.cpp
			osx/tcuOSXPlatform.hpp
			osx/tcuOSXVulkanPlatform.cpp
			osx/tcuOSXVulkanPlatform.hpp
			osx/tcuOSXMetalView.mm
			osx/tcuOSXMetalView.hpp
			)
		list(APPEND TCUTIL_PLATFORM_LIBS ${QUARTZCORE_LIBRARY} ${COCOA_LIBRARY})

	else ()
		set(TCUTIL_PLATFORM_SRCS
			vanilla/tcuVanillaPlatform.cpp
			)

	endif ()
endif ()

include_directories(${PROJECT_BINARY_DIR}/external/vulkancts/framework/vulkan)

add_library(tcutil-platform STATIC ${TCUTIL_PLATFORM_SRCS})
if (DEQP_USE_WAYLAND)
	add_dependencies(tcutil-platform deqp-xdg-shell)
endif()

# Add vkutil to the deps before tcutil so that it picks up the c++11 dependencies
target_link_libraries(tcutil-platform vkutil)

target_link_libraries(tcutil-platform tcutil ${TCUTIL_PLATFORM_LIBS})

# Always link to glutil as some platforms such as Win32 always support GL
target_link_libraries(tcutil-platform glutil)

# Always link to eglutil
target_link_libraries(tcutil-platform eglutil)

# X11 libraries
if (DEQP_USE_X11)
	find_package(X11 REQUIRED)
	target_link_libraries(tcutil-platform ${X11_LIBRARIES})
	if (DEQP_USE_XCB)
		find_package(XCB REQUIRED)
		target_link_libraries(tcutil-platform ${XCB_LIBRARIES})
		add_definitions(-DDEQP_SUPPORT_XCB=1)
	endif ()
	if (DEQP_SUPPORT_GLX)
	  # GLX functions don't currently have wrappers, so link directly to libGL.
	  target_link_libraries(tcutil-platform GL)
	endif ()
	if (DEQP_USE_WAYLAND)
		find_package(Wayland REQUIRED)
		target_link_libraries(tcutil-platform ${WAYLAND_LIBRARIES})
		add_definitions(-DDEQP_SUPPORT_WAYLAND=1)
	endif ()
endif ()

if (DE_OS_IS_WIN32)
	target_link_libraries(tcutil-platform "version")
endif()
