23cf287f06c4dcb9c228b5e4cf0f5844526d73b0
[platform/core/uifw/vulkan-wsi-tizen.git] / CMakeLists.txt
1 # Copyright (c) 2019-2021 Arm Limited.
2 #
3 # SPDX-License-Identifier: MIT
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to
7 # deal in the Software without restriction, including without limitation the
8 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9 # sell copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
11 #
12 # The above copyright notice and this permission notice shall be included in all
13 # copies or substantial portions of the Software.
14 #
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 # SOFTWARE.
22
23 cmake_minimum_required(VERSION 3.4.3)
24 project(VkLayer_window_system_integration)
25
26 find_package(PkgConfig REQUIRED)
27 pkg_check_modules(VULKAN_PKG_CONFIG vulkan)
28
29 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pthread -fPIC")
30 if (DEFINED DEBUG)
31    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
32 endif()
33 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
34 set(CMAKE_CXX_STANDARD 11)
35
36 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
37
38 if(NOT DEFINED VULKAN_CXX_INCLUDE)
39    set(VULKAN_CXX_INCLUDE ${VULKAN_PKG_CONFIG_INCLUDEDIR})
40 endif()
41
42 if(DEFINED VULKAN_CXX_INCLUDE)
43    message(STATUS "Using Vulkan include directories: ${VULKAN_CXX_INCLUDE}")
44    separate_arguments(VULKAN_CXX_INCLUDE)
45 else()
46    message(FATAL_ERROR "Either vulkan.pc must be available or VULKAN_CXX_INCLUDE must be defined")
47 endif()
48
49 # Build Configuration options
50 option(BUILD_WSI_WAYLAND "Build with support for VK_KHR_wayland_surface" OFF)
51 set(SELECT_EXTERNAL_ALLOCATOR "none" CACHE STRING "Select an external system allocator (none, ion)")
52
53 option(BUILD_WSI_TIZEN "Build with support for VK_KHR_wayland_surface(For Tizen platform)" OFF)
54
55 if(BUILD_WSI_WAYLAND)
56    if(SELECT_EXTERNAL_ALLOCATOR STREQUAL "none")
57       message(FATAL_ERROR "Wayland only supported with an external allocator.")
58    endif()
59    set(BUILD_DRM_UTILS True)
60 endif()
61
62 if(BUILD_WSI_TIZEN)
63    set(BUILD_DRM_UTILS True)
64 endif()
65
66 # DRM Utilities
67 if(BUILD_DRM_UTILS)
68    add_library(drm_utils STATIC util/drm/drm_utils.cpp)
69
70    pkg_check_modules(LIBDRM REQUIRED libdrm)
71    message(STATUS "Using libdrm include directories: ${LIBDRM_INCLUDE_DIRS}")
72    message(STATUS "Using libdrm cflags: ${LIBDRM_CFLAGS}")
73
74    target_sources(drm_utils PRIVATE util/drm/format_table.c)
75    target_include_directories(drm_utils PRIVATE ${VULKAN_CXX_INCLUDE})
76    target_include_directories(drm_utils PUBLIC ${LIBDRM_INCLUDE_DIRS})
77    target_compile_options(drm_utils PUBLIC ${LIBDRM_CFLAGS})
78 endif()
79
80 # External WSI Alloctator
81 if(NOT SELECT_EXTERNAL_ALLOCATOR STREQUAL "none")
82    add_library(wsialloc STATIC)
83    set_target_properties(wsialloc PROPERTIES C_STANDARD 99)
84
85    if(SELECT_EXTERNAL_ALLOCATOR STREQUAL "ion")
86       target_sources(wsialloc PRIVATE util/wsialloc/wsialloc_ion.c)
87       target_link_libraries(wsialloc drm_utils)
88       if(DEFINED KERNEL_DIR)
89          target_include_directories(wsialloc PRIVATE "${KERNEL_DIR}/drivers/staging/android/uapi")
90       else()
91          message(FATAL_ERROR "KERNEL_DIR must be defined as the root of the Linux kernel source.")
92       endif()
93    else()
94       message(FATAL_ERROR "Invalid external allocator selected: ${SELECT_EXTERNAL_ALLOCATOR}")
95    endif()
96
97    target_include_directories(wsialloc PRIVATE ${VULKAN_CXX_INCLUDE})
98    target_include_directories(wsialloc PRIVATE util/drm)
99 endif()
100
101 # Wayland WSI
102 if(BUILD_WSI_WAYLAND)
103    add_library(wayland_wsi STATIC
104       wsi/wayland/surface_properties.cpp
105       wsi/wayland/swapchain_wl_helpers.cpp
106       wsi/wayland/swapchain.cpp)
107
108    pkg_check_modules(WAYLAND_CLIENT REQUIRED wayland-client)
109    message(STATUS "Using Wayland client include directories: ${WAYLAND_CLIENT_INCLUDE_DIRS}")
110    message(STATUS "Using Wayland client cflags: ${WAYLAND_CLIENT_CFLAGS}")
111    message(STATUS "Using Wayland client ldflags: ${WAYLAND_CLIENT_LDFLAGS}")
112
113    pkg_check_modules(WAYLAND_SCANNER REQUIRED wayland-scanner)
114    pkg_get_variable(WAYLAND_SCANNER_EXEC wayland-scanner wayland_scanner)
115    message(STATUS "Using wayland-scanner : ${WAYLAND_SCANNER_EXEC}")
116
117    pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols)
118    pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
119    message(STATUS "Using wayland protocols dir : ${WAYLAND_PROTOCOLS_DIR}")
120
121    add_custom_target(wayland_generated_files
122       COMMAND ${WAYLAND_SCANNER_EXEC} client-header
123       ${WAYLAND_PROTOCOLS_DIR}/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml
124       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-client-protocol.h
125       COMMAND ${WAYLAND_SCANNER_EXEC} code
126       ${WAYLAND_PROTOCOLS_DIR}/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml
127       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-protocol.c
128       BYPRODUCTS linux-dmabuf-unstable-v1-protocol.c linux-dmabuf-unstable-v1-client-protocol.h)
129
130    target_sources(wayland_wsi PRIVATE
131       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-protocol.c
132       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-client-protocol.h)
133    add_dependencies(wayland_wsi wayland_generated_files)
134
135    target_include_directories(wayland_wsi PRIVATE
136       ${PROJECT_SOURCE_DIR}
137       ${VULKAN_CXX_INCLUDE}
138       ${WAYLAND_CLIENT_INCLUDE_DIRS}
139       ${CMAKE_CURRENT_BINARY_DIR})
140
141    target_compile_options(wayland_wsi PRIVATE ${WAYLAND_CLIENT_CFLAGS})
142    target_compile_options(wayland_wsi INTERFACE "-DBUILD_WSI_WAYLAND=1")
143    target_link_libraries(wayland_wsi drm_utils wsialloc ${WAYLAND_CLIENT_LDFLAGS})
144    list(APPEND LINK_WSI_LIBS wayland_wsi)
145 elseif(BUILD_WSI_TIZEN)
146    add_library(tizen_wsi STATIC
147       wsi/tizen/surface_properties.cpp
148       wsi/tizen/swapchain_wl_helpers.cpp
149       wsi/tizen/swapchain.cpp)
150
151    pkg_check_modules(WAYLAND_CLIENT REQUIRED wayland-client)
152    message(STATUS "Using Wayland client include directories: ${WAYLAND_CLIENT_INCLUDE_DIRS}")
153    message(STATUS "Using Wayland client cflags: ${WAYLAND_CLIENT_CFLAGS}")
154    message(STATUS "Using Wayland client ldflags: ${WAYLAND_CLIENT_LDFLAGS}")
155
156    pkg_check_modules(WAYLAND_SCANNER REQUIRED wayland-scanner)
157    pkg_get_variable(WAYLAND_SCANNER_EXEC wayland-scanner wayland_scanner)
158    message(STATUS "Using wayland-scanner : ${WAYLAND_SCANNER_EXEC}")
159
160    pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols)
161    pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
162    message(STATUS "Using wayland protocols dir : ${WAYLAND_PROTOCOLS_DIR}")
163
164    add_custom_target(wayland_generated_files
165       COMMAND ${WAYLAND_SCANNER_EXEC} client-header
166       ${WAYLAND_PROTOCOLS_DIR}/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml
167       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-client-protocol.h
168       COMMAND ${WAYLAND_SCANNER_EXEC} code
169       ${WAYLAND_PROTOCOLS_DIR}/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml
170       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-protocol.c
171       BYPRODUCTS linux-dmabuf-unstable-v1-protocol.c linux-dmabuf-unstable-v1-client-protocol.h)
172
173    target_sources(tizen_wsi PRIVATE
174       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-protocol.c
175       ${CMAKE_CURRENT_BINARY_DIR}/linux-dmabuf-unstable-v1-client-protocol.h)
176    add_dependencies(tizen_wsi wayland_generated_files)
177
178    target_include_directories(tizen_wsi PRIVATE
179       ${PROJECT_SOURCE_DIR}
180       ${VULKAN_CXX_INCLUDE}
181       ${WAYLAND_CLIENT_INCLUDE_DIRS}
182       ${CMAKE_CURRENT_BINARY_DIR})
183
184    target_compile_options(tizen_wsi PRIVATE ${WAYLAND_CLIENT_CFLAGS})
185    target_compile_options(tizen_wsi INTERFACE "-DBUILD_WSI_TIZEN=1")
186    target_link_libraries(tizen_wsi dlog tbm tpl-egl drm_utils ${WAYLAND_CLIENT_LDFLAGS})
187    list(APPEND LINK_WSI_LIBS tizen_wsi)
188 else()
189    list(APPEND JSON_COMMANDS COMMAND sed -i '/VK_KHR_wayland_surface/d' ${CMAKE_CURRENT_BINARY_DIR}/VkLayer_window_system_integration.json)
190 endif()
191
192 # Layer
193 add_library(${PROJECT_NAME} SHARED
194    layer/layer.cpp
195    layer/private_data.cpp
196    layer/surface_api.cpp
197    layer/swapchain_api.cpp
198    util/timed_semaphore.cpp
199    util/custom_allocator.cpp
200    util/extension_list.cpp
201    wsi/swapchain_base.cpp
202    wsi/wsi_factory.cpp
203    wsi/headless/surface_properties.cpp
204    wsi/headless/swapchain.cpp)
205 target_compile_definitions(${PROJECT_NAME} PRIVATE ${WSI_DEFINES})
206 target_include_directories(${PROJECT_NAME} PRIVATE
207         ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${VULKAN_CXX_INCLUDE})
208
209 target_link_libraries(${PROJECT_NAME} ${LINK_WSI_LIBS})
210
211 add_custom_target(manifest_json ALL COMMAND
212    cp ${PROJECT_SOURCE_DIR}/layer/VkLayer_window_system_integration.json ${CMAKE_CURRENT_BINARY_DIR}
213    ${JSON_COMMANDS})