# 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
			)

		if (DEQP_SUPPORT_EGL)
			set(TCUTIL_PLATFORM_SRCS
				${TCUTIL_PLATFORM_SRCS}
				win32/tcuWin32EGLNativeDisplayFactory.hpp
				win32/tcuWin32EGLNativeDisplayFactory.cpp
				)
		endif()
	elseif ((DE_OS_IS_UNIX OR DE_OS_IS_OSX) AND DEQP_USE_X11)
		set(TCUTIL_PLATFORM_SRCS
			X11/tcuX11.cpp
			X11/tcuX11.hpp
			X11/tcuX11Platform.hpp
			X11/tcuX11Platform.cpp
			)
		if (DEQP_SUPPORT_EGL)
			set(TCUTIL_PLATFORM_SRCS
				${TCUTIL_PLATFORM_SRCS}
				X11/tcuX11EglPlatform.hpp
				X11/tcuX11EglPlatform.cpp
				)
		endif()
		if (DEQP_SUPPORT_GLX)
			set(TCUTIL_PLATFORM_SRCS
				${TCUTIL_PLATFORM_SRCS}
				X11/tcuX11GlxPlatform.hpp
				X11/tcuX11GlxPlatform.cpp
				)
		endif()
		if (NOT (DEQP_SUPPORT_EGL OR DEQP_SUPPORT_GLX))
		  message(FATAL_ERROR "At least one of EGL and GLX must be enabled for X11")
		endif ()
	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
			)

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

	endif ()
endif ()

add_library(tcutil-platform STATIC ${TCUTIL_PLATFORM_SRCS})
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)

# Link to eglutil if platform supports EGL
if (DEQP_SUPPORT_EGL)
	target_link_libraries(tcutil-platform eglutil)
endif ()

# X11 libraries
if (DEQP_USE_X11)
	find_package(X11 REQUIRED)
	target_link_libraries(tcutil-platform ${X11_LIBRARIES})
	if (DEQP_SUPPORT_GLX)
	  # GLX functions don't currently have wrappers, so link directly to libGL.
	  target_link_libraries(tcutil-platform GL)
	endif ()
endif ()
