# Copyright (c) 2019-2025, Arm Limited and Contributors # Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. # # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 the "License"; # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # cmake_minimum_required(VERSION 3.16) project(framework LANGUAGES C CXX) set(FRAMEWORK_FILES # Header Files gui.h drawer.h spirv_reflection.h gltf_loader.h buffer_pool.h debug_info.h fence_pool.h heightmap.h semaphore_pool.h resource_binding_state.h resource_cache.h resource_record.h resource_replay.h vulkan_sample.h api_vulkan_sample.h timer.h camera.h builder_base.h vulkan_type_mapping.h hpp_api_vulkan_sample.h hpp_fence_pool.h hpp_gltf_loader.h hpp_resource_binding_state.h hpp_resource_cache.h hpp_resource_record.h hpp_resource_replay.h hpp_semaphore_pool.h # Source Files drawer.cpp spirv_reflection.cpp gltf_loader.cpp debug_info.cpp fence_pool.cpp heightmap.cpp semaphore_pool.cpp resource_binding_state.cpp resource_cache.cpp resource_record.cpp resource_replay.cpp api_vulkan_sample.cpp timer.cpp camera_core.cpp hpp_api_vulkan_sample.cpp hpp_resource_cache.cpp) set(COMMON_FILES # Header Files common/ktx_common.h common/vk_common.h common/vk_initializers.h common/glm_common.h common/resource_caching.h common/helpers.h common/error.h common/utils.h common/strings.h common/tags.h common/hpp_error.h common/hpp_resource_caching.h common/hpp_strings.h common/hpp_utils.h common/hpp_vk_common.h # Source Files common/error.cpp common/ktx_common.cpp common/vk_common.cpp common/utils.cpp common/strings.cpp) set(GEOMETRY_FILES # Header Files geometry/frustum.h # Source Files geometry/frustum.cpp) set(RENDERING_FILES # Header files rendering/pipeline_state.h rendering/postprocessing_pipeline.h rendering/postprocessing_pass.h rendering/postprocessing_renderpass.h rendering/postprocessing_computepass.h rendering/render_context.h rendering/render_frame.h rendering/render_pipeline.h rendering/render_target.h rendering/subpass.h rendering/hpp_pipeline_state.h rendering/hpp_render_pipeline.h rendering/hpp_render_target.h # Source files rendering/pipeline_state.cpp rendering/postprocessing_pipeline.cpp rendering/postprocessing_pass.cpp rendering/postprocessing_renderpass.cpp rendering/postprocessing_computepass.cpp rendering/render_pipeline.cpp rendering/render_target.cpp rendering/hpp_render_target.cpp) set(RENDERING_SUBPASSES_FILES # Header files rendering/subpasses/forward_subpass.h rendering/subpasses/lighting_subpass.h rendering/subpasses/geometry_subpass.h rendering/subpasses/hpp_forward_subpass.h # Source files rendering/subpasses/forward_subpass.cpp rendering/subpasses/lighting_subpass.cpp rendering/subpasses/geometry_subpass.cpp) set(SCENE_GRAPH_FILES # Header Files scene_graph/component.h scene_graph/node.h scene_graph/scene.h scene_graph/script.h scene_graph/hpp_scene.h # Source Files scene_graph/component.cpp scene_graph/scene.cpp scene_graph/script.cpp) set(SCENE_GRAPH_COMPONENT_FILES # Header Files scene_graph/components/aabb.h scene_graph/components/camera.h scene_graph/components/perspective_camera.h scene_graph/components/orthographic_camera.h scene_graph/components/image.h scene_graph/components/light.h scene_graph/components/material.h scene_graph/components/mesh.h scene_graph/components/pbr_material.h scene_graph/components/sampler.h scene_graph/components/sub_mesh.h scene_graph/components/texture.h scene_graph/components/transform.h scene_graph/components/image/astc.h scene_graph/components/image/ktx.h scene_graph/components/image/stb.h scene_graph/components/hpp_image.h scene_graph/components/hpp_material.h scene_graph/components/hpp_mesh.h scene_graph/components/hpp_sub_mesh.h scene_graph/components/hpp_texture.h # Source Files scene_graph/components/aabb.cpp scene_graph/components/camera.cpp scene_graph/components/perspective_camera.cpp scene_graph/components/orthographic_camera.cpp scene_graph/components/image.cpp scene_graph/components/light.cpp scene_graph/components/material.cpp scene_graph/components/mesh.cpp scene_graph/components/pbr_material.cpp scene_graph/components/sampler.cpp scene_graph/components/sub_mesh.cpp scene_graph/components/texture.cpp scene_graph/components/transform.cpp scene_graph/components/image/astc.cpp scene_graph/components/image/ktx.cpp scene_graph/components/image/stb.cpp scene_graph/components/hpp_image.cpp) set(SCENE_GRAPH_SCRIPTS_FILES # Header Files scene_graph/scripts/free_camera.h scene_graph/scripts/node_animation.h scene_graph/scripts/animation.h # Source Files scene_graph/scripts/free_camera.cpp scene_graph/scripts/node_animation.cpp scene_graph/scripts/animation.cpp) set(STATS_FILES # Header Files stats/stats.h stats/stats_common.h stats/stats_provider.h stats/frame_time_stats_provider.h stats/vulkan_stats_provider.h stats/hpp_stats.h # Source Files stats/stats.cpp stats/stats_provider.cpp stats/frame_time_stats_provider.cpp stats/vulkan_stats_provider.cpp) set(CORE_FILES # Header Files core/instance.h core/physical_device.h core/device.h core/debug.h core/shader_module.h core/pipeline_layout.h core/pipeline.h core/descriptor_set_layout.h core/descriptor_pool.h core/descriptor_set.h core/queue.h core/command_pool.h core/command_pool_base.h core/swapchain.h core/command_buffer.h core/allocated.h core/buffer.h core/image.h core/image_view.h core/sampled_image.h core/sampler.h core/framebuffer.h core/render_pass.h core/query_pool.h core/acceleration_structure.h core/hpp_debug.h core/hpp_descriptor_pool.h core/hpp_descriptor_set.h core/hpp_descriptor_set_layout.h core/hpp_framebuffer.h core/hpp_image.h core/hpp_image_view.h core/hpp_pipeline.h core/hpp_pipeline_layout.h core/hpp_query_pool.h core/hpp_queue.h core/hpp_render_pass.h core/hpp_sampler.h core/hpp_shader_module.h core/hpp_swapchain.h core/vulkan_resource.h # Source Files core/command_pool_base.cpp core/debug.cpp core/image_core.cpp core/shader_module.cpp core/pipeline_layout.cpp core/pipeline.cpp core/descriptor_set_layout.cpp core/descriptor_pool.cpp core/descriptor_set.cpp core/queue.cpp core/swapchain.cpp core/allocated.cpp core/image_core.cpp core/image_view.cpp core/sampled_image.cpp core/sampler_core.cpp core/framebuffer.cpp core/render_pass.cpp core/query_pool.cpp core/acceleration_structure.cpp core/hpp_debug.cpp core/hpp_image_core.cpp core/hpp_image_view.cpp core/hpp_pipeline_layout.cpp core/hpp_queue.cpp core/hpp_sampler.cpp core/hpp_swapchain.cpp ) set(PLATFORM_FILES # Header Files platform/application.h platform/platform.h platform/window.h platform/input_events.h platform/configuration.h platform/headless_window.h platform/plugins/plugin.h platform/plugins/plugin_base.h # Source Files platform/headless_window.cpp platform/application.cpp platform/platform.cpp platform/window.cpp platform/input_events.cpp platform/configuration.cpp platform/plugins/plugin.cpp) set(GLFW_FILES # Header Files platform/glfw_window.h # Source Files platform/glfw_window.cpp ) set(ANDROID_FILES # Header Files platform/android/android_platform.h platform/android/android_window.h stats/hwcpipe_stats_provider.h # Source Files platform/android/android_platform.cpp platform/android/android_window.cpp stats/hwcpipe_stats_provider.cpp) set(IOS_FILES # Header Files platform/ios/ios_platform.h platform/ios/ios_window.h # Source Files platform/ios/ios_platform.mm platform/ios/ios_window.mm) set(WINDOWS_FILES # Header Files platform/windows/windows_platform.h # Source Files platform/windows/windows_platform.cpp) set(UNIX_FILES # Header Files platform/unix/unix_platform.h # Source Files platform/unix/unix_platform.cpp) set(LINUX_D2D_FILES # Header Files platform/unix/unix_d2d_platform.h platform/unix/direct_window.h # Source Files platform/unix/unix_d2d_platform.cpp platform/unix/direct_window.cpp) source_group("\\" FILES ${FRAMEWORK_FILES}) source_group("common\\" FILES ${COMMON_FILES}) source_group("platform\\" FILES ${PLATFORM_FILES}) source_group("platform\\" FILES ${GLFW_FILES}) source_group("platform\\windows" FILES ${WINDOWS_FILES}) source_group("platform\\android" FILES ${ANDROID_FILES}) source_group("platform\\ios" FILES ${IOS_FILES}) source_group("platform\\unix" FILES ${UNIX_FILES}) source_group("platform\\unix" FILES ${LINUX_D2D_FILES}) source_group("core\\" FILES ${CORE_FILES}) source_group("geometry\\" FILES ${GEOMETRY_FILES}) source_group("rendering\\" FILES ${RENDERING_FILES}) source_group("rendering\\subpasses" FILES ${RENDERING_SUBPASSES_FILES}) source_group("scene_graph\\" FILES ${SCENE_GRAPH_FILES}) source_group("scene_graph\\components\\" FILES ${SCENE_GRAPH_COMPONENT_FILES}) source_group("scene_graph\\scripts\\" FILES ${SCENE_GRAPH_SCRIPTS_FILES}) source_group("stats\\" FILES ${STATS_FILES}) set(PROJECT_FILES ${PLATFORM_FILES} ${COMMON_FILES} ${FRAMEWORK_FILES} ${CORE_FILES} ${GEOMETRY_FILES} ${RENDERING_FILES} ${RENDERING_SUBPASSES_FILES} ${SCENE_GRAPH_FILES} ${SCENE_GRAPH_COMPONENT_FILES} ${SCENE_GRAPH_SCRIPTS_FILES} ${STATS_FILES}) # No need for explicit casts from vk::HandleType to VkHandleType on ANDROID if(ANDROID) add_definitions(-DVULKAN_HPP_TYPESAFE_CONVERSION=1) endif() # Add files based on platform if(ANDROID) list(APPEND PROJECT_FILES ${ANDROID_FILES}) message(STATUS "Android platform detected") else() if(DIRECT_TO_DISPLAY) list(APPEND PROJECT_FILES ${LINUX_D2D_FILES}) message(STATUS "Unix d2d platform detected") else() if(IOS) enable_language(OBJCXX) list(APPEND PROJECT_FILES ${IOS_FILES}) message(STATUS "iOS platform detected") else() list(APPEND PROJECT_FILES ${GLFW_FILES}) if(WIN32) list(APPEND PROJECT_FILES ${WINDOWS_FILES}) message(STATUS "Windows platform detected") else() list(APPEND PROJECT_FILES ${UNIX_FILES}) message(STATUS "Unix platform detected") endif() endif () endif() endif() # mask out the min/max macros from minwindef.h if(MSVC) add_definitions(-DNOMINMAX) endif() #NB: switch this to shared library and things stop working. (there is likely two copies of volk somewhere. add_library(${PROJECT_NAME} OBJECT ${PROJECT_FILES}) set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) # compiler flags based on compiler type if(NOT MSVC) target_compile_options(${PROJECT_NAME} PUBLIC -fexceptions) endif() if(MSVC) target_compile_options(${PROJECT_NAME} PUBLIC /MP) endif() if(${VKB_VALIDATION_LAYERS}) target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VALIDATION_LAYERS) endif() # GPU assisted validation layers are not available on macOS. if(${VKB_VALIDATION_LAYERS_GPU_ASSISTED}) if (APPLE) message(WARNING "GPU assisted validation layers are not currently available on macOS.") else() target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VALIDATION_LAYERS) target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VALIDATION_LAYERS_GPU_ASSISTED) endif() endif() if(${VKB_VALIDATION_LAYERS_BEST_PRACTICES}) target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VALIDATION_LAYERS) target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VALIDATION_LAYERS_BEST_PRACTICES) endif() if(${VKB_VALIDATION_LAYERS_SYNCHRONIZATION}) target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VALIDATION_LAYERS) target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VALIDATION_LAYERS_SYNCHRONIZATION) endif() if(${VKB_VULKAN_DEBUG}) target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_VULKAN_DEBUG) endif() if(${VKB_ENABLE_PORTABILITY}) message(STATUS "Vulkan Portability Enumeration and Portability Subset extensions are enabled") target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_ENABLE_PORTABILITY) endif() if(${VKB_WARNINGS_AS_ERRORS}) message(STATUS "Warnings as Errors Enabled") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") target_compile_options(${PROJECT_NAME} PRIVATE -Werror) elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") target_compile_options(${PROJECT_NAME} PRIVATE /W3 /WX) endif() endif() target_include_directories(${PROJECT_NAME} PUBLIC $ ${CMAKE_CURRENT_SOURCE_DIR}) # Link third party libraries target_link_libraries(${PROJECT_NAME} PUBLIC vkb__core vkb__filesystem volk ktx stb ${ASTC_TARGET} imgui tinygltf glm vma spirv-cross-glsl spdlog plugins) if(${NEED_LINK_ATOMIC}) target_link_libraries(${PROJECT_NAME} PUBLIC atomic) endif() # Link platform specific libraries if(ANDROID) # Import game-activity static lib inside the game-activity_static prefab module. find_package(game-activity REQUIRED CONFIG) target_link_libraries(${PROJECT_NAME} PUBLIC hwcpipe log android game-activity::game-activity_static) else() if (DIRECT_TO_DISPLAY) target_link_libraries(${PROJECT_NAME} PRIVATE dl) else() if (NOT IOS) target_link_libraries(${PROJECT_NAME} PRIVATE glfw) endif () endif() endif() if(VKB_DO_CLANG_TIDY) set_target_properties(framework PROPERTIES CXX_CLANG_TIDY "${VKB_DO_CLANG_TIDY}") endif() if (VKB_PROFILING) ## Enable profling target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_PROFILING=1) else() ## Disable profiling target_compile_definitions(${PROJECT_NAME} PUBLIC VKB_PROFILING=0) endif()