From e0ffe85a30e97196a0e9cc14d1c0386f9dab09ef Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Thu, 5 Oct 2023 07:36:34 +0200 Subject: [PATCH] Simplify the CMake file even more - target_sources(... PUBLIC ...) doesn't do what I thought it did, and has no useful purpose here. - Experimental features are an Alpha only thing, and Unstable features should not be part of a Candidate release. - ENABLE_LTO is not a flag anymore, as CMake has a global flag for it. While we haven't split out Core from the main file yet, and we still keep running into strange duplicate symbol or undefined symbol errors, this will hopefully simplify the CMake file further. End goal is to eventually split StreamFX into smaller sub-plugins that can operate mostly independently. At some point, the goal is to be able to soft-depend on other components, i.e. Blur can softly depend on Dynamic Mask, and then have extra features if the component is installed. This is not quite fleshed out yet, and I have no clear idea on how to make it work. --- CMakeLists.txt | 631 +++++++++++++---------------------- source/gfx/gfx-mipmapper.cpp | 14 +- 2 files changed, 231 insertions(+), 414 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cd50dc0..109e05f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,11 @@ # Copyright (C) 2023 Isaac Nudelman # AUTOGENERATED COPYRIGHT HEADER END +# ToDo: +# - Explore RESOURCE property: https://cmake.org/cmake/help/latest/prop_tgt/RESOURCE.html +# - Explore PUBLIC_HEADER property: https://cmake.org/cmake/help/latest/prop_tgt/PUBLIC_HEADER.html + + # CMake Setup cmake_minimum_required(VERSION 3.26) list(APPEND CMAKE_MESSAGE_INDENT "[StreamFX] ") @@ -269,13 +274,13 @@ if(_VERSION_PRERELEASE STREQUAL "a") set(FEATURE_STABLE ON) elseif(_VERSION_PRERELEASE STREQUAL "b") set(FEATURE_DEPRECATED ON) - set(FEATURE_EXPERIMENTAL ON) + set(FEATURE_EXPERIMENTAL OFF) set(FEATURE_UNSTABLE ON) set(FEATURE_STABLE ON) elseif(_VERSION_PRERELEASE STREQUAL "c") set(FEATURE_DEPRECATED ON) set(FEATURE_EXPERIMENTAL OFF) - set(FEATURE_UNSTABLE ON) + set(FEATURE_UNSTABLE OFF) set(FEATURE_STABLE ON) else() set(FEATURE_DEPRECATED ON) @@ -288,7 +293,6 @@ endif() set(${PREFIX}VERSION "" CACHE STRING "Specify an override for the automatically detected version. Accepts a mixture of SemVer 2.0 and CMake Version.") # Compile/Link Related -set(${PREFIX}ENABLE_LTO ${D_HAS_IPO} CACHE BOOL "Enable Link Time Optimization for faster and smaller binaries.") set(${PREFIX}ENABLE_FASTMATH ON CACHE BOOL "Enable fast math optimizations, which sacrifice precision and stability.") if(D_PLATFORM_ARCH_X86) set(${PREFIX}TARGET_X86_64_V4 OFF CACHE BOOL "Target x86-64-v4 (x86-64-v3, AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL).") @@ -438,308 +442,6 @@ find_package("Qt6" CONFIG ) -################################################################################ -# Code -################################################################################ -set(PROJECT_DATA ) -set(PROJECT_LIBRARIES ) -set(PROJECT_INCLUDE_DIRS ) -set(PROJECT_TEMPLATES ) -set(PROJECT_PRIVATE_GENERATED ) -set(PROJECT_PRIVATE_SOURCE ) -set(PROJECT_UI ) -set(PROJECT_UI_SOURCE ) -set(PROJECT_DEFINITIONS ) -set(PROJECT_MEDIA ) - -# Data -file(GLOB_RECURSE PROJECT_DATA "data/*") - -# Media -file(GLOB_RECURSE PROJECT_MEDIA "media/*") - -# Templates -file(GLOB_RECURSE PROJECT_TEMPLATES "templates/*") - -# Configure Files -configure_file( - "templates/config.hpp.in" - "generated/config.hpp" -) -LIST(APPEND PROJECT_TEMPLATES "templates/config.hpp.in") -LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/config.hpp") - -configure_file( - "templates/version.hpp.in" - "generated/version.hpp" -) -LIST(APPEND PROJECT_TEMPLATES "templates/version.hpp.in") -LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/version.hpp") - -configure_file( - "templates/module.cpp.in" - "generated/module.cpp" -) -LIST(APPEND PROJECT_TEMPLATES "templates/module.cpp.in") -LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/module.cpp") -# Minimum Dependencies -list(APPEND PROJECT_LIBRARIES OBS::libobs) - -# Dependencies -list(APPEND PROJECT_PRIVATE_SOURCE - "source/util/util-curl.hpp" - "source/util/util-curl.cpp" -) -list(APPEND PROJECT_LIBRARIES CURL::libcurl) - -list(APPEND PROJECT_INCLUDE_DIRS ${JSON_INCLUDE_DIR}) - -if(TRUE) # OpenGL - if(NOT TARGET khronos_glad) - add_library(khronos_glad STATIC - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/gl.c" - ) - target_include_directories(khronos_glad - PRIVATE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" - INTERFACE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" - PUBLIC - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" - ) - if(D_PLATFORM_WINDOWS) - target_sources(khronos_glad - PRIVATE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/wgl.c" - ) - elseif(D_PLATFORM_LINUX) - target_sources(khronos_glad - PRIVATE - "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/glx.c" - ) - endif() - - # Requires for shared/static mixing. - set_property(TARGET khronos_glad PROPERTY POSITION_INDEPENDENT_CODE ON) - endif() - - list(APPEND PROJECT_LIBRARIES khronos_glad) -endif() - -list(APPEND PROJECT_LIBRARIES OBS::obs-frontend-api) -list(APPEND PROJECT_UI_SOURCE - "source/obs/browser/obs-browser-panel.hpp" -) - -list(APPEND PROJECT_LIBRARIES Qt6::Core Qt6::Gui Qt6::Widgets) - -################################################################################ -# Features -################################################################################ - -# Core -list(APPEND PROJECT_PRIVATE_SOURCE - "source/warning-disable.hpp" - "source/warning-enable.hpp" - "source/configuration.hpp" - "source/configuration.cpp" - "source/common.hpp" - "source/strings.hpp" - "source/plugin.hpp" - "source/plugin.cpp" - "source/util/utility.hpp" - "source/util/utility.cpp" - "source/util/util-bitmask.hpp" - "source/util/util-event.hpp" - "source/util/util-library.cpp" - "source/util/util-library.hpp" - "source/util/util-logging.cpp" - "source/util/util-logging.hpp" - "source/util/util-platform.hpp" - "source/util/util-platform.cpp" - "source/util/util-threadpool.cpp" - "source/util/util-threadpool.hpp" - "source/gfx/gfx-util.hpp" - "source/gfx/gfx-util.cpp" - "source/gfx/gfx-mipmapper.hpp" - "source/gfx/gfx-mipmapper.cpp" - "source/gfx/gfx-opengl.hpp" - "source/gfx/gfx-opengl.cpp" - "source/gfx/gfx-source-texture.hpp" - "source/gfx/gfx-source-texture.cpp" - "source/obs/gs/gs-helper.hpp" - "source/obs/gs/gs-helper.cpp" - "source/obs/gs/gs-effect.hpp" - "source/obs/gs/gs-effect.cpp" - "source/obs/gs/gs-effect-parameter.hpp" - "source/obs/gs/gs-effect-parameter.cpp" - "source/obs/gs/gs-effect-pass.hpp" - "source/obs/gs/gs-effect-pass.cpp" - "source/obs/gs/gs-effect-technique.hpp" - "source/obs/gs/gs-effect-technique.cpp" - "source/obs/gs/gs-indexbuffer.hpp" - "source/obs/gs/gs-indexbuffer.cpp" - "source/obs/gs/gs-limits.hpp" - "source/obs/gs/gs-rendertarget.hpp" - "source/obs/gs/gs-rendertarget.cpp" - "source/obs/gs/gs-sampler.hpp" - "source/obs/gs/gs-sampler.cpp" - "source/obs/gs/gs-texture.hpp" - "source/obs/gs/gs-texture.cpp" - "source/obs/gs/gs-vertex.hpp" - "source/obs/gs/gs-vertex.cpp" - "source/obs/gs/gs-vertexbuffer.hpp" - "source/obs/gs/gs-vertexbuffer.cpp" - "source/obs/obs-signal-handler.hpp" - "source/obs/obs-signal-handler.cpp" - "source/obs/obs-source-tracker.hpp" - "source/obs/obs-source-tracker.cpp" - "source/obs/obs-tools.hpp" - "source/obs/obs-tools.cpp" - - # obs_encoder_info_t, obs_encoder_t, obs_weak_encoder_t - "source/obs/obs-encoder-factory.hpp" - "source/obs/obs-encoder-factory.cpp" - - # obs_source_info_t, obs_source_t, obs_weak_source_t - "source/obs/obs-source-factory.hpp" - "source/obs/obs-source-factory.cpp" - "source/obs/obs-source.hpp" - "source/obs/obs-source.cpp" - "source/obs/obs-source-active-child.hpp" - "source/obs/obs-source-active-child.cpp" - "source/obs/obs-source-active-reference.hpp" - "source/obs/obs-source-active-reference.cpp" - "source/obs/obs-source-showing-reference.hpp" - "source/obs/obs-source-showing-reference.cpp" - "source/obs/obs-weak-source.hpp" - "source/obs/obs-weak-source.cpp" -) -list(APPEND PROJECT_DATA - "data/effects/color_conversion_rgb_hsl.effect" - "data/effects/color_conversion_rgb_hsv.effect" - "data/effects/color_conversion_rgb_yuv.effect" - "data/effects/mipgen.effect" - "data/effects/pack-unpack.effect" - "data/effects/standard.effect" - "data/effects/shared.effect" - "data/locale/en-US.ini" -) -list(APPEND PROJECT_INCLUDE_DIRS - "${PROJECT_BINARY_DIR}/generated" - "${PROJECT_SOURCE_DIR}/source" -) - -# Profiling -list(APPEND PROJECT_PRIVATE_SOURCE - "source/util/util-profiler.cpp" - "source/util/util-profiler.hpp" -) - -# Updater -list(APPEND PROJECT_PRIVATE_SOURCE - "source/updater.hpp" - "source/updater.cpp" -) - -# Frontend -list(APPEND PROJECT_UI - "ui/streamfx.qrc" - "ui/about.ui" - "ui/about-entry.ui" -) -list(APPEND PROJECT_UI_SOURCE - "source/ui/ui-common.hpp" - "source/ui/ui.hpp" - "source/ui/ui.cpp" - "source/ui/ui-about.hpp" - "source/ui/ui-about.cpp" - "source/ui/ui-about-entry.hpp" - "source/ui/ui-about-entry.cpp" - "source/ui/ui-obs-browser-widget.hpp" - "source/ui/ui-obs-browser-widget.cpp" -) -list(APPEND PROJECT_INCLUDE_DIRS - "source/ui" -) - -list(APPEND PROJECT_UI_SOURCE - "source/ui/ui-updater.hpp" - "source/ui/ui-updater.cpp" -) -list(APPEND PROJECT_UI - "ui/updater.ui" -) - -################################################################################ -# Parts -################################################################################ - -# Windows -if(D_PLATFORM_WINDOWS) - # Disable/Enable a ton of things. - list(APPEND PROJECT_DEFINITIONS - # Microsoft Visual C++ - _CRT_SECURE_NO_WARNINGS - _ENABLE_EXTENDED_ALIGNED_STORAGE - # windows.h - WIN32_LEAN_AND_MEAN - NOGPICAPMASKS - NOVIRTUALKEYCODES - #NOWINMESSAGES - NOWINSTYLES - NOSYSMETRICS - NOMENUS - NOICONS - NOKEYSTATES - NOSYSCOMMANDS - NORASTEROPS - #NOSHOWWINDOW - NOATOM - NOCLIPBOARD - NOCOLOR - #NOCTLMGR - NODRAWTEXT - #NOGDI - NOKERNEL - #NOUSER - #NONLS - NOMB - NOMEMMGR - NOMETAFILE - NOMINMAX - #NOMSG - NOOPENFILE - NOSCROLL - NOSERVICE - NOSOUND - #NOTEXTMETRIC - NOWH - NOWINOFFSETS - NOCOMM - NOKANJI - #NOHELP - NOPROFILER - NODEFERWINDOWPOS - NOMCX - NOIME - NOMDI - NOINOUT - ) -endif() - -# GCC before 9.0, Clang before 9.0 -if((CMAKE_C_COMPILER_ID STREQUAL "GNU") - OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - OR (CMAKE_C_COMPILER_ID STREQUAL "Clang") - OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0) - list(APPEND PROJECT_LIBRARIES - "stdc++fs" - ) - endif() -endif() - ################################################################################ # Helpers ################################################################################ @@ -772,6 +474,7 @@ function(streamfx_add_library TARGET_NAME TARGET_TYPE) # @rpath in installed binaries INSTALL_RPATH "@executable_path/../Frameworks/;@loader_path/../Frameworks/;@loader_path/../Resources/" ) + if(STANDALONE) set_target_properties(${TARGET_NAME} PROPERTIES # @rpath in built binaries @@ -1057,7 +760,7 @@ function(streamfx_add_component COMPONENT_NAME) ) # Always depend on StreamFX::Core - target_link_libraries(${COMPONENT_TARGET} PRIVATE $) + target_link_libraries(${COMPONENT_TARGET} PUBLIC $) # Register the component globally. get_target_property(_DEPENDS StreamFX COMPONENT_DEPENDS) @@ -1118,7 +821,6 @@ function(streamfx_add_component COMPONENT_NAME) ${USERINTERFACE} ${SOURCE_PRIVATE} ${GENERATED_PRIVATE} - PUBLIC ${SOURCE_PUBLIC} ${GENERATED_PUBLIC} ) @@ -1243,12 +945,6 @@ endfunction() ################################################################################ streamfx_add_library(StreamFX MODULE) # We are a module for libOBS. -target_include_directories(StreamFX PRIVATE - "source" - "include" - "${PROJECT_BINARY_DIR}/generated" -) - # Ensure there is at least one file. if(D_PLATFORM_WINDOWS) target_sources(StreamFX @@ -1262,6 +958,7 @@ else() ) endif() +# version.rc (can't be part of a static library) if(D_PLATFORM_WINDOWS) # Windows-exclusive # Version Resource set(PROJECT_PRODUCT_NAME "${PROJECT_FULL_NAME}") @@ -1272,36 +969,17 @@ if(D_PLATFORM_WINDOWS) # Windows-exclusive configure_file( "templates/windows/version.rc.in" - "generated/version.rc" + "version.rc" ) - target_sources(StreamFX - PRIVATE - "templates/windows/version.rc.in" - "${PROJECT_BINARY_DIR}/generated/version.rc" + target_sources(StreamFX PRIVATE + "${PROJECT_BINARY_DIR}/version.rc" ) -elseif(D_PLATFORM_MAC) # MacOS exclusive Changes - set_target_properties(StreamFX PROPERTIES - # No automatic code signing in XCode - XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "" - XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO" - - # @rpath in installed binaries - INSTALL_RPATH "@executable_path/../Frameworks/;@loader_path/../Frameworks/;@loader_path/../Resources/" - ) - - if(STANDALONE) - set_target_properties(StreamFX PROPERTIES - # @rpath in built binaries - BUILD_WITH_INSTALL_RPATH ON - ) - endif() endif() - -# Set file version set_target_properties(StreamFX PROPERTIES + # Version MACHO_COMPATIBILITY_VERSION ${_VERSION_MAJOR}.${_VERSION_MINOR} - MACHO_CURRENT_VERSION ${PROJECT_VERSION} SOVERSION ${_VERSION_MAJOR}.${_VERSION_MINOR} + MACHO_CURRENT_VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION} ) @@ -1311,66 +989,188 @@ set_target_properties(StreamFX PROPERTIES streamfx_add_library(StreamFX_Core STATIC EXCLUDE_FROM_ALL) add_library(StreamFX::Core ALIAS StreamFX_Core) -# Register the library -target_link_libraries(StreamFX_Core - PRIVATE ${PROJECT_LIBRARIES} - PUBLIC OBS::libobs -) -target_include_directories(StreamFX_Core - PRIVATE ${PROJECT_INCLUDE_DIRS} - PUBLIC - "${PROJECT_SOURCE_DIR}/source" - "${PROJECT_BINARY_DIR}/generated" -) -target_compile_definitions(StreamFX_Core - PRIVATE ${PROJECT_DEFINITIONS} -) - -# Combine all variables that matter. -set(PROJECT_FILES - # Always exist - ${PROJECT_DATA} - ${PROJECT_PRIVATE_GENERATED} - ${PROJECT_PRIVATE_SOURCE} - ${PROJECT_TEMPLATES} - # UI-only (empty if not enabled) - ${PROJECT_UI} - ${PROJECT_UI_SOURCE} - # Media - ${PROJECT_MEDIA} -) - -# Set source groups for IDE generators. -source_group(TREE "${PROJECT_SOURCE_DIR}/data" PREFIX "Data" FILES ${PROJECT_DATA}) -source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Source" FILES ${PROJECT_PRIVATE_SOURCE} ${PROJECT_UI_SOURCE}) -source_group(TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Source" FILES ${PROJECT_PRIVATE_GENERATED}) -source_group(TREE "${PROJECT_SOURCE_DIR}/templates" PREFIX "Templates" FILES ${PROJECT_TEMPLATES}) -source_group(TREE "${PROJECT_SOURCE_DIR}/ui" PREFIX "User Interface" FILES ${PROJECT_UI}) -source_group(TREE "${PROJECT_SOURCE_DIR}/media" PREFIX "Media" FILES ${PROJECT_MEDIA}) - -# Prevent unwanted files from being built as source. -set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_UI} ${PROJECT_MEDIA} PROPERTIES - HEADER_FILE_ONLY ON -) - -# Enable Qt if needed +# Enable Qt set_target_properties(StreamFX_Core PROPERTIES AUTOUIC ON AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/ui" AUTOMOC ON AUTORCC ON - AUTOGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated" + AUTOGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/qt" ) -# Prevent non-UI files from being Qt'd -set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_MEDIA} ${PROJECT_PRIVATE_GENERATED} ${PROJECT_PRIVATE_SOURCE} PROPERTIES +# Default Links +target_link_libraries(StreamFX_Core + PUBLIC + CURL::libcurl + Qt6::Core + Qt6::Gui + Qt6::Widgets + OBS::obs-frontend-api + OBS::libobs +) + +# Default Include Dirs +target_include_directories(StreamFX_Core + PRIVATE + "${PROJECT_SOURCE_DIR}/source/ui" + "${PROJECT_BINARY_DIR}/qt" + PUBLIC + "${PROJECT_SOURCE_DIR}/source" + "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_BINARY_DIR}/generated" + ${JSON_INCLUDE_DIR} +) + +# Templates +file(GLOB_RECURSE PROJECT_TEMPLATES FOLLOW_SYMLINKS CONFIGURE_DEPENDS "templates/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/templates" PREFIX "Templates" FILES ${PROJECT_TEMPLATES}) +set_source_files_properties(${PROJECT_TEMPLATES} PROPERTIES + HEADER_FILE_ONLY ON SKIP_AUTOGEN ON SKIP_AUTOMOC ON SKIP_AUTORCC ON SKIP_AUTOUIC ON ) +target_sources(StreamFX_Core PRIVATE ${PROJECT_TEMPLATES}) -target_sources(StreamFX_Core PRIVATE ${PROJECT_FILES}) +# Generated +#- config.hpp +configure_file( + "templates/config.hpp.in" + "generated/config.hpp" +) +#- version.hpp +configure_file( + "templates/version.hpp.in" + "generated/version.hpp" +) +#- module.cpp +configure_file( + "templates/module.cpp.in" + "generated/module.cpp" +) +#- Add all generated files +file(GLOB_RECURSE PROJECT_PRIVATE_GENERATED FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_BINARY_DIR}/generated/*") +source_group(TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Private Files/Generated" FILES ${PROJECT_PRIVATE_GENERATED}) +set_source_files_properties(${PROJECT_PRIVATE_GENERATED} PROPERTIES + SKIP_AUTOGEN ON + SKIP_AUTOMOC ON + SKIP_AUTORCC ON + SKIP_AUTOUIC ON +) +target_sources(StreamFX_Core PRIVATE ${PROJECT_PRIVATE_GENERATED}) + +# Source +file(GLOB_RECURSE PROJECT_PRIVATE FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/source/*") +list(REMOVE_ITEM PROJECT_PRIVATE "${PROJECT_SOURCE_DIR}/source/windll.cpp") # Only used by StreamFX, not part of StreamFX::Core +source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Private Files" FILES ${PROJECT_PRIVATE}) +set_source_files_properties(${PROJECT_PRIVATE} PROPERTIES + SKIP_AUTOGEN ON + SKIP_AUTOMOC ON + SKIP_AUTORCC ON + SKIP_AUTOUIC ON +) +target_sources(StreamFX_Core PRIVATE ${PROJECT_PRIVATE}) + +# User-Interface Source +file(GLOB_RECURSE PROJECT_PRIVATE_UI FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/source/ui/*") +list(APPEND PROJECT_PRIVATE_UI "${PROJECT_SOURCE_DIR}/source/obs/browser/obs-browser-panel.hpp") +set_source_files_properties(${PROJECT_PRIVATE_UI} PROPERTIES + SKIP_AUTOGEN OFF + SKIP_AUTOMOC OFF + SKIP_AUTORCC OFF + SKIP_AUTOUIC OFF +) + +# User-Interface Definitions +file(GLOB_RECURSE PROJECT_UI FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/ui/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/ui" PREFIX "User-Interface Files" FILES ${PROJECT_UI}) +set_source_files_properties(${PROJECT_UI} PROPERTIES + HEADER_FILE_ONLY ON +) +target_sources(StreamFX_Core PRIVATE ${PROJECT_UI}) + +# Windows +if(D_PLATFORM_WINDOWS) + # Disable/Enable a ton of things. + target_compile_definitions(StreamFX_Core PRIVATE + # Microsoft Visual C++ + _CRT_SECURE_NO_WARNINGS + _ENABLE_EXTENDED_ALIGNED_STORAGE + # windows.h + WIN32_LEAN_AND_MEAN + NOGPICAPMASKS + NOVIRTUALKEYCODES + #NOWINMESSAGES + NOWINSTYLES + NOSYSMETRICS + NOMENUS + NOICONS + NOKEYSTATES + NOSYSCOMMANDS + NORASTEROPS + #NOSHOWWINDOW + NOATOM + NOCLIPBOARD + NOCOLOR + #NOCTLMGR + NODRAWTEXT + #NOGDI + NOKERNEL + #NOUSER + #NONLS + NOMB + NOMEMMGR + NOMETAFILE + NOMINMAX + #NOMSG + NOOPENFILE + NOSCROLL + NOSERVICE + NOSOUND + #NOTEXTMETRIC + NOWH + NOWINOFFSETS + NOCOMM + NOKANJI + #NOHELP + NOPROFILER + NODEFERWINDOWPOS + NOMCX + NOIME + NOMDI + NOINOUT + ) +endif() + +# OpenGL via GLAD +if(NOT TARGET StreamFX::GLAD) + add_library(StreamFX_GLAD STATIC + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/gl.c" + ) + target_include_directories(StreamFX_GLAD + PUBLIC + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include" + ) + if(D_PLATFORM_WINDOWS) + target_sources(StreamFX_GLAD + PRIVATE + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/wgl.c" + ) + elseif(D_PLATFORM_LINUX) + target_sources(StreamFX_GLAD + PRIVATE + "${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/glx.c" + ) + endif() + + # Requires for shared/static mixing. + set_property(TARGET StreamFX_GLAD PROPERTY POSITION_INDEPENDENT_CODE ON) + + add_library(StreamFX::GLAD ALIAS StreamFX_GLAD) +endif() + +target_link_libraries(StreamFX_Core PUBLIC StreamFX::GLAD) ################################################################################ # Components @@ -1510,22 +1310,54 @@ foreach(_ENTITY ${_RESOLVED}) streamfx_enabled_component(${_ENTITY2} T_CHECK) if(T_CHECK) - target_link_libraries(${RENTITY} - PUBLIC - $ - ) + target_link_libraries(${RENTITY} PUBLIC $) endif() endforeach() endif() - target_link_libraries(StreamFX - PRIVATE - $ - ) + target_link_libraries(StreamFX PUBLIC $) endforeach() target_link_libraries(StreamFX PUBLIC $) +################################################################################ +# Resources +################################################################################ +# This needs to be handled separately, as CMake does not propagate Resources +# between dependencies. This feels like a bug in CMake, but it is better than +# not doing anything at all. Might eventually need to revise this when we start +# generating data files. + +# Data +file(GLOB_RECURSE PROJECT_DATA "data/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/data" PREFIX "Data" FILES ${PROJECT_DATA}) +if(D_PLATFORM_MAC) + foreach(FILE IN LISTS PROJECT_DATA) # Data location + cmake_path(ABSOLUTE_PATH FILE OUTPUT_VARIABLE FILE_PATH) + cmake_path(RELATIVE_PATH FILE_PATH BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/data/") + cmake_path(GET FILE_PATH PARENT_PATH FILE_PATH) + set_source_files_properties("${FILE}" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources/${FILE_PATH}" + ) + endforeach() +endif() + +# Media +file(GLOB_RECURSE PROJECT_MEDIA "media/*") +source_group(TREE "${PROJECT_SOURCE_DIR}/media" PREFIX "Media" FILES ${PROJECT_MEDIA}) +if(D_PLATFORM_MAC) + #- Bundle Icon location + set_source_files_properties("media/icon.png" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources" + ) +endif() + +# Add all Resources to StreamFX +set_source_files_properties(${PROJECT_DATA} ${PROJECT_MEDIA} PROPERTIES + HEADER_FILE_ONLY ON +) +target_sources(StreamFX PRIVATE ${PROJECT_DATA} ${PROJECT_MEDIA}) + ################################################################################ # Installation ################################################################################ @@ -1596,21 +1428,6 @@ if(STANDALONE) XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}" ) - # Proper location for resources in Bundles - foreach(FILE IN LISTS PROJECT_DATA) - cmake_path(ABSOLUTE_PATH FILE OUTPUT_VARIABLE FILE_PATH) - cmake_path(RELATIVE_PATH FILE_PATH BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/data/") - cmake_path(GET FILE_PATH PARENT_PATH FILE_PATH) - set_source_files_properties("${FILE}" PROPERTIES - MACOSX_PACKAGE_LOCATION "Resources/${FILE_PATH}" - ) - endforeach() - - # Bundle Icon - set_source_files_properties("media/icon.png" PROPERTIES - MACOSX_PACKAGE_LOCATION "Resources" - ) - install( TARGETS StreamFX RUNTIME DESTINATION "." COMPONENT StreamFX diff --git a/source/gfx/gfx-mipmapper.cpp b/source/gfx/gfx-mipmapper.cpp index 9da7c9bc..8664a47e 100644 --- a/source/gfx/gfx-mipmapper.cpp +++ b/source/gfx/gfx-mipmapper.cpp @@ -28,14 +28,14 @@ struct d3d_info { ID3D11Resource* target = nullptr; }; -void d3d_initialize(d3d_info& info, std::shared_ptr source, std::shared_ptr target) +static void d3d_initialize(d3d_info& info, std::shared_ptr source, std::shared_ptr target) { info.target = reinterpret_cast(gs_texture_get_obj(target->get_object())); info.device = reinterpret_cast(gs_get_device_obj()); info.device->GetImmediateContext(&info.context); } -void d3d_copy_subregion(d3d_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) +static void d3d_copy_subregion(d3d_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) { D3D11_BOX box = {0, 0, 0, width, height, 1}; auto source_ref = reinterpret_cast(gs_texture_get_obj(source->get_object())); @@ -49,7 +49,7 @@ struct opengl_info { GLuint fbo = 0; }; -std::string opengl_translate_error(GLenum error) +static std::string opengl_translate_error(GLenum error) { #define TRANSLATE_CASE(X) \ case X: \ @@ -70,7 +70,7 @@ std::string opengl_translate_error(GLenum error) #undef TRANSLATE_CASE } -std::string opengl_translate_framebuffer_status(GLenum error) +static std::string opengl_translate_framebuffer_status(GLenum error) { #define TRANSLATE_CASE(X) \ case X: \ @@ -106,19 +106,19 @@ std::string opengl_translate_framebuffer_status(GLenum error) throw std::runtime_error(sstr.str()); \ } -void opengl_initialize(opengl_info& info, std::shared_ptr source, std::shared_ptr target) +static void opengl_initialize(opengl_info& info, std::shared_ptr source, std::shared_ptr target) { info.target = *reinterpret_cast(gs_texture_get_obj(target->get_object())); glGenFramebuffers(1, &info.fbo); } -void opengl_finalize(opengl_info& info) +static void opengl_finalize(opengl_info& info) { glDeleteFramebuffers(1, &info.fbo); } -void opengl_copy_subregion(opengl_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) +static void opengl_copy_subregion(opengl_info& info, std::shared_ptr source, uint32_t mip_level, uint32_t width, uint32_t height) { GLuint source_ref = *reinterpret_cast(gs_texture_get_obj(source->get_object()));