set(DEMO_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/.. ) if(CMAKE_SYSTEM_NAME STREQUAL "Windows") add_definitions(-DVK_USE_PLATFORM_WIN32_KHR -DWIN32_LEAN_AND_MEAN) set(DisplayServer Win32) if (NOT MSVC_VERSION LESS 1900) # Enable control flow guard message(STATUS "Building demos with control flow guard") add_compile_options("$<$:/guard:cf>") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /guard:cf") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /guard:cf") endif() set(DEMO_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/icd/common" ${DEMO_INCLUDE_DIRS} ) elseif(CMAKE_SYSTEM_NAME STREQUAL "Android") add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR) elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") if (NOT DEMOS_WSI_SELECTION) set(DEMOS_WSI_SELECTION "XCB") endif() if (DEMOS_WSI_SELECTION STREQUAL "XCB") if (NOT BUILD_WSI_XCB_SUPPORT) message( FATAL_ERROR "Selected XCB for demos build but not building Xcb support" ) endif() set(DEMO_INCLUDE_DIRS ${XCB_INCLUDE_DIRS} ${DEMO_INCLUDE_DIRS} ) link_libraries(${XCB_LIBRARIES}) add_definitions(-DVK_USE_PLATFORM_XCB_KHR) elseif(DEMOS_WSI_SELECTION STREQUAL "XLIB") if (NOT BUILD_WSI_XLIB_SUPPORT) message( FATAL_ERROR "Selected XLIB for demos build but not building Xlib support" ) endif() set(DEMO_INCLUDE_DIRS ${X11_INCLUDE_DIR} ${DEMO_INCLUDE_DIRS} ) link_libraries(${X11_LIBRARIES}) add_definitions(-DVK_USE_PLATFORM_XLIB_KHR) elseif(DEMOS_WSI_SELECTION STREQUAL "WAYLAND") if (NOT BUILD_WSI_WAYLAND_SUPPORT) message( FATAL_ERROR "Selected Wayland for demos build but not building Wayland support" ) endif() set(DEMO_INCLUDE_DIRS ${WAYLAND_CLIENT_INCLUDE_DIR} ${DEMO_INCLUDE_DIRS} ) link_libraries(${WAYLAND_CLIENT_LIBRARIES}) add_definitions(-DVK_USE_PLATFORM_WAYLAND_KHR) elseif(DEMOS_WSI_SELECTION STREQUAL "MIR") if (NOT BUILD_WSI_MIR_SUPPORT) message( FATAL_ERROR "Selected MIR for demos build but not building Mir support" ) endif() add_definitions(-DVK_USE_PLATFORM_MIR_KHR) set(DEMO_INCLUDE_DIRS ${MIR_INCLUDE_DIR} ${DEMO_INCLUDE_DIRS} ) # TODO - Add Mir support elseif(DEMOS_WSI_SELECTION STREQUAL "DISPLAY") add_definitions(-DVK_USE_PLATFORM_DISPLAY_KHR) else() message( FATAL_ERROR "Unrecognized value for DEMOS_WSI_SELECTION: ${DEMOS_WSI_SELECTION}" ) endif() include_directories ("${PROJECT_SOURCE_DIR}/icd/common") link_libraries(${API_LOWERCASE} m) elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") add_definitions(-DVK_USE_PLATFORM_MACOS_MVK) else() message(FATAL_ERROR "Unsupported Platform!") endif() file(GLOB TEXTURES "${PROJECT_SOURCE_DIR}/demos/*.ppm" ) file(COPY ${TEXTURES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") if(WIN32) set (LIBRARIES "${API_LOWERCASE}-${MAJOR}") elseif(UNIX) set (LIBRARIES "${API_LOWERCASE}") else() endif() if(WIN32) # For Windows, since 32-bit and 64-bit items can co-exist, we build each in its own build directory. # 32-bit target data goes in build32, and 64-bit target data goes into build. So, include/link the # appropriate data at build time. if (CMAKE_CL_64) set (BUILDTGT_DIR build) else () set (BUILDTGT_DIR build32) endif() # Use static MSVCRT libraries foreach(configuration in CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${configuration} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${configuration} "${${configuration}}") endif() endforeach() file(COPY cube.vcxproj.user DESTINATION ${CMAKE_BINARY_DIR}/demos) file(COPY vulkaninfo.vcxproj.user DESTINATION ${CMAKE_BINARY_DIR}/demos) endif() add_custom_command( COMMENT "Compiling cube demo vertex shader" OUTPUT cube.vert.inc COMMAND ${GLSLANG_VALIDATOR} -V -x -o ${CMAKE_CURRENT_BINARY_DIR}/cube.vert.inc ${PROJECT_SOURCE_DIR}/demos/cube.vert MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/demos/cube.vert DEPENDS ${PROJECT_SOURCE_DIR}/demos/cube.vert ${GLSLANG_VALIDATOR} ) add_custom_command( COMMENT "Compiling cube demo fragment shader" OUTPUT cube.frag.inc COMMAND ${GLSLANG_VALIDATOR} -V -x -o ${CMAKE_CURRENT_BINARY_DIR}/cube.frag.inc ${PROJECT_SOURCE_DIR}/demos/cube.frag MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/demos/cube.frag DEPENDS ${PROJECT_SOURCE_DIR}/demos/cube.frag ${GLSLANG_VALIDATOR} ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) if(WIN32) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_USE_MATH_DEFINES") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_USE_MATH_DEFINES") endif() # MacOS setup common to all demos if(APPLE) include(macOS/common.cmake) endif() include_directories( ${DEMO_INCLUDE_DIRS} ) ###################################################################################### # vulkaninfo if(WIN32) add_executable(${API_LOWERCASE}info vulkaninfo.c vulkaninfo.rc) elseif(APPLE) add_executable(${API_LOWERCASE}info vulkaninfo.c ${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo/metal_view.m ${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo/metal_view.h) else() add_executable(${API_LOWERCASE}info vulkaninfo.c) endif() if(APPLE) target_link_libraries(${API_LOWERCASE}info ${LIBRARIES} "-framework AppKit -framework QuartzCore") target_include_directories(${API_LOWERCASE}info PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/macOS/vulkaninfo) else() target_link_libraries(${API_LOWERCASE}info ${LIBRARIES}) endif() if(APPLE) set_target_properties(${API_LOWERCASE}info PROPERTIES INSTALL_RPATH "@loader_path/../lib" ) install(TARGETS ${API_LOWERCASE}info DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) endif() # Create vulkaninfo application bundle for MacOS if(APPLE) include(macOS/vulkaninfo/vulkaninfo.cmake) endif() if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") if(INSTALL_LVL_FILES) install(TARGETS ${API_LOWERCASE}info DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() endif() ###################################################################################### # cube if(APPLE) include(macOS/cube/cube.cmake) elseif(NOT WIN32) if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) add_executable(cube cube.c ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) target_link_libraries(cube ${LIBRARIES}) endif() else() if (CMAKE_CL_64) set (LIB_DIR "Win64") else() set (LIB_DIR "Win32") endif() add_executable(cube WIN32 cube.c ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) target_link_libraries(cube ${LIBRARIES}) endif() ###################################################################################### # cubepp if(APPLE) include(macOS/cubepp/cubepp.cmake) elseif(NOT WIN32) if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR}) add_executable(cubepp cube.cpp ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) target_link_libraries(cubepp ${LIBRARIES}) endif() else() if (CMAKE_CL_64) set (LIB_DIR "Win64") else() set (LIB_DIR "Win32") endif() add_executable(cubepp WIN32 cube.cpp ${PROJECT_SOURCE_DIR}/demos/cube.vert ${PROJECT_SOURCE_DIR}/demos/cube.frag cube.vert.inc cube.frag.inc) target_link_libraries(cubepp ${LIBRARIES}) endif() ###################################################################################### # smoke if ((${CMAKE_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_HOST_SYSTEM_PROCESSOR})) if ((DEMOS_WSI_SELECTION STREQUAL "XCB") OR (DEMOS_WSI_SELECTION STREQUAL "WAYLAND") OR WIN32 OR (CMAKE_SYSTEM_NAME STREQUAL "Android") OR (CMAKE_SYSTEM_NAME STREQUAL "Darwin")) add_subdirectory(smoke) endif() endif()