mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-09 20:58:31 +09:00
ES has neither glMultiDrawElements nor glMultiDrawElementsBaseVertex, so both are emulated. DirectGLES had two ways of doing it - one glMultiDrawElementsBaseVertexEXT where the driver has the extension interaction, otherwise a per-draw loop. This adds the five MobileGlues uses (gl/multidraw.cpp), so the ladder is now: one glMultiDrawElementsBaseVertexEXT; one glMultiDrawElementsIndirectEXT over a synthesized command buffer; one glDrawElementsIndirect per command over that same buffer; the base-vertex replay; plain glDrawElements over a CPU-rewritten index stream, for drivers with no base-vertex draw at all; and a compute shader that flattens the whole batch into one rebased index buffer drawn by a single glDrawElements. They live in their own translation unit that owns the entry point outright, preparation included - the compute tier has to dispatch BEFORE PrepareForDraw, or it would have to unpick the program, storage-block and index bindings the preparation just made, and a dispatch inside an open transform-feedback span is not legal at all. The auto ladder is ext -> basevertex -> multiindirect -> indirect -> drawelements, which is NOT MobileGlues' order (it puts the indirect tiers first). Measured on mc_sodium_multidraw, ns/op, median of three: NVIDIA ES 3.2 basevertex 2500 vs multiindirect 5700 and indirect 5800; Mesa llvmpipe ext 19300, basevertex 25200, multiindirect 27600, drawelements 28700, indirect 31000. Ring-allocating the command staging instead of respecifying per batch was tried first and moved the indirect tiers by less than noise, so the cost is the indirect draw path itself, not the upload; only a real multi-draw entry point beats replaying the sub-draws. auto therefore resolves to basevertex on this box - byte for byte the behaviour that shipped - and the new tiers are what a driver with the ext interaction, or without base vertex at all, now gets. compute is never chosen by auto (nor by MobileGlues'): it rewrites the primitive stream rather than replaying it, and it measured slowest here. Four places this deliberately does not follow MobileGlues, each a correctness bug there. A rewritten stream is emitted as GL_UNSIGNED_INT whatever came in, because GL adds baseVertex at full precision and folding it into ushort indices wraps. The restart sentinel is carried across a rebase unrebased, or an enabled primitive restart is lost. The flattening tier declines strip/loop/fan modes, any sub-draw whose count is not a whole number of primitives, and any batch at all while primitive restart is enabled - a restart ends a primitive, so leftover vertices would find a third vertex in the next sub-draw and become a triangle GL never draws. And the indirect tiers decline client-memory index arrays, which have no buffer to address. gl_DrawID gets better rather than worse: the unrolled tiers now feed each sub-draw its index (the spec's value, where the old loop left the uniform untouched), and a program that actually reads it demotes the batched tiers, which can only hold one value for the whole batch. The per-batch cost is nil for the programs that do not read it. Verified: the five DirectGLES retraces are byte-identical (md5) across all six tiers on NVIDIA and on Mesa, each tier proven to have really executed rather than silently demoted, via a per-tier announcement in the log. Unit suite 421/421. The full retrace suite's five failures all reproduce unchanged on a stashed tree, so none are new.
563 lines
22 KiB
CMake
563 lines
22 KiB
CMake
cmake_minimum_required(VERSION 3.22.1)
|
|
|
|
project("MobileGL")
|
|
|
|
option(MOBILEGL_BUILD_TEST "Build MobileGL tests" ON )
|
|
option(MOBILEGL_BUILD_BENCHMARK "Build MobileGL benchmarks" ON )
|
|
# Headless end-to-end GPU scenarios (MobileGL/MG_IntegrationTest). They need a
|
|
# real GPU/ICD to do anything, so they are off by default for CI; every scenario
|
|
# skips cleanly where there is none. Registered under the `integration-gpu`
|
|
# ctest label so a run can select or exclude them.
|
|
option(MOBILEGL_BUILD_INTEGRATION_TEST "Build MobileGL headless GPU integration tests" OFF)
|
|
option(MOBILEGL_FORCE_RELEASE_OPT "Enable Release optimization flags in Debug build" ON )
|
|
option(MOBILEGL_ENABLE_TRACY "Enable tracy for profiling" OFF)
|
|
option(MOBILEGL_BUILD_TRACE_REPLAY "Build desktop apitrace replay runner" OFF)
|
|
option(MOBILEGL_TRACE_ANGLE_VARIANTS "Enable signed trace-APK ANGLE variant loading" OFF)
|
|
option(MOBILEGL_IOS "Build MobileGL for iOS instead of macOS when APPLE is set" OFF)
|
|
set(MOBILEGL_LOG_ACTIVE_LEVEL "MOBILEGL_LOG_LEVEL_INFO" CACHE STRING "MobileGL active log level macro")
|
|
set(MOBILEGL_VULKAN_LIBRARY "" CACHE FILEPATH "Vulkan loader/MoltenVK library to link for iOS builds")
|
|
|
|
if (ANDROID)
|
|
set(MOBILEGL_BUILD_TEST OFF CACHE BOOL "Build MobileGL tests" FORCE)
|
|
set(MOBILEGL_BUILD_BENCHMARK OFF CACHE BOOL "Build MobileGL benchmarks" FORCE)
|
|
endif()
|
|
|
|
option(MOBILEGL_ENABLE_LTO "Build with ThinLTO/IPO" OFF)
|
|
|
|
if ((NOT CMAKE_BUILD_TYPE STREQUAL "Debug" OR MOBILEGL_FORCE_RELEASE_OPT) AND MOBILEGL_ENABLE_LTO)
|
|
# Check if ThinLTO or LTO is suppported
|
|
include(CheckIPOSupported)
|
|
include(CheckCCompilerFlag)
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
check_ipo_supported(RESULT LTOSupported OUTPUT LTOError)
|
|
|
|
check_c_compiler_flag("-flto" HAS_LTO_C)
|
|
check_cxx_compiler_flag("-flto" HAS_LTO_CXX)
|
|
|
|
if (LTOSupported OR (HAS_LTO_C AND HAS_LTO_CXX))
|
|
# Check ThinLTO
|
|
check_c_compiler_flag("-flto=thin" HAS_THINLTO_C)
|
|
check_cxx_compiler_flag("-flto=thin" HAS_THINLTO_CXX)
|
|
if (HAS_THINLTO_C AND HAS_THINLTO_CXX)
|
|
message(STATUS "ThinLTO supported, using -flto=thin")
|
|
|
|
add_compile_options(-flto=thin)
|
|
add_link_options(-flto=thin)
|
|
else()
|
|
# ThinLTO is not supported
|
|
message(STATUS "ThinLTO not available, fallback to CMAKE IPO")
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
|
endif()
|
|
else()
|
|
message(STATUS "IPO not supported: ${LTOError}")
|
|
endif()
|
|
|
|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" AND NOT MATCHES "AppleClang")
|
|
add_compile_options(-O3 -ffunction-sections -fdata-sections)
|
|
add_link_options(-Wl,--gc-sections)
|
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
|
# add_compile_options(/O2)
|
|
else ()
|
|
add_compile_options(-O2)
|
|
endif()
|
|
endif()
|
|
|
|
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
|
add_compile_options(/Zc:preprocessor)
|
|
add_compile_options(/Zc:__cplusplus)
|
|
endif()
|
|
|
|
enable_language(CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 23)
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
|
|
if (MSVC)
|
|
set(CMAKE_CXX_FLAGS "/EHsc ${CMAKE_CXX_FLAGS}")
|
|
endif()
|
|
|
|
# Generate MGGitHash.h
|
|
execute_process(
|
|
COMMAND git rev-parse HEAD
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_COMMIT_HASH_FULL
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
string(SUBSTRING "${GIT_COMMIT_HASH_FULL}" 0 7 GIT_COMMIT_HASH_SHORT)
|
|
|
|
configure_file(
|
|
${CMAKE_SOURCE_DIR}/MobileGL/MG_Util/Miscellany/MGGitHash.h.in
|
|
${CMAKE_BINARY_DIR}/generated/MGGitHash.h
|
|
@ONLY
|
|
)
|
|
|
|
include_directories(${CMAKE_BINARY_DIR}/generated)
|
|
|
|
set(ENABLE_RTTI ON CACHE BOOL "Enables RTTI (will be took by glslang)" FORCE)
|
|
|
|
set(ENABLE_GLSLANG_BINARIES OFF CACHE BOOL "Enable glslangValidator/spirv-remap" FORCE)
|
|
set(ENABLE_SPVREMAPPER OFF CACHE BOOL "Enable SPVRemapper" FORCE)
|
|
set(ENABLE_OPT ON CACHE BOOL "Enable SPIRV-Tools opt usage in glslang" FORCE)
|
|
set(BUILD_EXTERNAL ON CACHE BOOL "Build external deps in External/" FORCE)
|
|
set(ENABLE_GLSLANG_INSTALL OFF CACHE BOOL "Install glslang targets" FORCE)
|
|
|
|
set(SPIRV_CROSS_C_API ON CACHE BOOL "Enable C API" FORCE)
|
|
set(SPIRV_CROSS_ENABLE_GLSL ON CACHE BOOL "Enable GLSL backend" FORCE)
|
|
set(SPIRV_CROSS_ENABLE_HLSL OFF CACHE BOOL "Disable HLSL backend" FORCE)
|
|
set(SPIRV_CROSS_ENABLE_MSL OFF CACHE BOOL "Disable MSL backend" FORCE)
|
|
set(SPIRV_CROSS_ENABLE_CPP OFF CACHE BOOL "Disable C++ API target" FORCE)
|
|
set(SPIRV_CROSS_CLI OFF CACHE BOOL "Disable CLI binary" FORCE)
|
|
set(SPIRV_CROSS_STATIC ON CACHE BOOL "Prefer static libs" FORCE)
|
|
|
|
set(SPIRV_REFLECT_EXECUTABLE OFF CACHE BOOL "Build spirv-reflect executable" FORCE)
|
|
set(SPIRV_REFLECT_STATIC_LIB ON CACHE BOOL "Build a SPIRV-Reflect static library" FORCE)
|
|
set(SPIRV_REFLECT_BUILD_TESTS OFF CACHE BOOL "Build the SPIRV-Reflect test suite" FORCE)
|
|
set(SPIRV_REFLECT_ENABLE_ASSERTS OFF CACHE BOOL "Enable asserts for debugging" FORCE)
|
|
set(SPIRV_REFLECT_ENABLE_ASAN OFF CACHE BOOL "Use address sanitization" FORCE)
|
|
set(SPIRV_REFLECT_INSTALL OFF CACHE BOOL "Whether to install" FORCE)
|
|
|
|
# add_subdirectory(3rdparty/DiligentCore)
|
|
add_subdirectory(3rdparty/glslang)
|
|
add_subdirectory(3rdparty/SPIRV-Cross)
|
|
add_subdirectory(3rdparty/VulkanMemoryAllocator)
|
|
add_subdirectory(3rdparty/Vulkan-Headers)
|
|
add_subdirectory(3rdparty/Vulkan-Utility-Libraries)
|
|
add_subdirectory(3rdparty/SPIRV-Reflect)
|
|
|
|
set(XXHASH_BUILD_XXHSUM OFF)
|
|
option(BUILD_SHARED_LIBS OFF)
|
|
add_subdirectory(3rdparty/xxHash/build/cmake xxhash_build EXCLUDE_FROM_ALL)
|
|
|
|
set(TRACY_ENABLE ${MOBILEGL_ENABLE_TRACY} CACHE BOOL "Enable Tracy, this is an internal variable" FORCE)
|
|
|
|
if (TRACY_ENABLE)
|
|
set(TRACY_ON_DEMAND ON CACHE BOOL "Enable profiling only connected" FORCE)
|
|
set(TRACY_NO_EXIT OFF CACHE BOOL "Don't exit Tracy until connected" FORCE)
|
|
set(TRACY_DELAYED_INIT ON CACHE BOOL "Don't init Tracy on library load" FORCE)
|
|
set(TRACY_MANUAL_LIFETIME ON CACHE BOOL "Manually control Tracy lifetime" FORCE)
|
|
set(TRACY_NO_CRASH_HANDLER ON CACHE BOOL "Disable crash handling" FORCE)
|
|
|
|
add_subdirectory(3rdparty/tracy)
|
|
endif ()
|
|
|
|
set(SOURCE_FILES
|
|
MobileGL/Init.cpp
|
|
MobileGL/GlobalObjects.cpp
|
|
MobileGL/ConfigLoader.cpp
|
|
|
|
MobileGL/MG_Util/Debug/Log.cpp
|
|
|
|
MobileGL/MG_Util/Math/VectorTypes.cpp
|
|
MobileGL/MG_Util/Metrics/TextureMetrics.cpp
|
|
|
|
MobileGL/MG_Util/Metrics/BufferMetrics.cpp
|
|
|
|
MobileGL/MG_Util/Converters/GLToStr/GLEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/EGLToStr/EGLEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToStr/DataTypeConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToStr/RenderStateEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToStr/GLExtensionConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToStr/BufferEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToStr/FramebufferEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToStr/TextureEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/GLToGlslang/ProgramEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToGL/ErrorCodeConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToGL/FramebufferEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToGL/DataTypeConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToGL/RenderStateEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToGL/ProgramEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/GLToMG/BufferEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/GLToMG/FramebufferEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/GLToMG/TextureEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/GLToMG/DataTypeConverter.cpp
|
|
MobileGL/MG_Util/Converters/GLToMG/RenderStateEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/GLToMG/ProgramEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToMG/TextureEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToVk/RenderStateEnumConverter.cpp
|
|
MobileGL/MG_Util/Converters/MGToVk/TextureEnumConverter.cpp
|
|
|
|
MobileGL/MG_Util/Classifiers/TextureEnumClassifier.cpp
|
|
|
|
MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/ShaderSourceProcessor.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/glslang/TMglGlslIoResolver.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/FlattenInterfaceStructPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/EliminateFloatEqualsZeroPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/RenameSamplerFunctionParameterPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/DecomposeWorkgroupVec3Pass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/DecoratePositionInvariantPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/LowerDrawParametersPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/PackDoubleVertexInputsPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/RebaseInstanceIndexPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/NormalizeRectCoordinatesPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/StripUboMemberRelaxedPrecisionPass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/StripNoPerspectivePass.cpp
|
|
MobileGL/MG_Util/ShaderTranspiler/SpirvPasses/EmulateNoPerspectivePass.cpp
|
|
|
|
MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp
|
|
MobileGL/MG_Util/BackendLoaders/Vulkan/Loader.cpp
|
|
|
|
MobileGL/MG_Util/SelfTest/DriverPost.cpp
|
|
|
|
MobileGL/MG_Util/Texture/PixelStoreProcessor.cpp
|
|
MobileGL/MG_Util/Texture/TextureFormatProcessor.cpp
|
|
|
|
MobileGL/MG_Impl/GLXImpl/Exporting/Definitions.cpp
|
|
MobileGL/MG_Impl/GLXImpl/GLXImpl.cpp
|
|
MobileGL/MG_Impl/GLXImpl/LookUp/LookUp.cpp
|
|
|
|
MobileGL/MG_Impl/EGLImpl/Exporting/Definitions.cpp
|
|
MobileGL/MG_Impl/EGLImpl/EGLImpl.cpp
|
|
|
|
# @INSERTION_POINT:SOURCE_FILE_GLIMPL@ #
|
|
MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp
|
|
MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp
|
|
MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp
|
|
MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.cpp
|
|
MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.cpp
|
|
MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp
|
|
MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp
|
|
MobileGL/MG_Impl/GLImpl/Program/GL_ProgramPipeline.cpp
|
|
MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp
|
|
MobileGL/MG_Impl/GLImpl/Texture/Validators.cpp
|
|
MobileGL/MG_Impl/GLImpl/Texture/ProxyTexture.cpp
|
|
MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.cpp
|
|
MobileGL/MG_Impl/GLImpl/VertexArray/Validators.cpp
|
|
MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp
|
|
MobileGL/MG_Impl/GLImpl/Buffer/Validators.cpp
|
|
MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp
|
|
MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp
|
|
MobileGL/MG_Impl/GLImpl/Sync/GL_Sync.cpp
|
|
MobileGL/MG_Impl/GLImpl/Query/GL_Query.cpp
|
|
|
|
MobileGL/MG_Impl/Init.cpp
|
|
MobileGL/MG_Impl/GetProcAddress.cpp
|
|
|
|
MobileGL/MG_Backend/Init.cpp
|
|
MobileGL/MG_Backend/BackendObject.cpp
|
|
|
|
MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp
|
|
MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp
|
|
MobileGL/MG_Backend/DirectGLES/Utils.cpp
|
|
MobileGL/MG_Backend/DirectGLES/Managers.cpp
|
|
MobileGL/MG_Backend/DirectGLES/MultiDraw.cpp
|
|
|
|
MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/VmaImpl.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/SwapchainObject.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/FrameContext.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineFactory.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/ProgramFactory.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/UniformManager.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/BufferArena.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VertexInputStateBuilder.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VertexInputStateFactory.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferObject.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkTimerQueryManager.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkSamplerManager.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkClearManager.cpp
|
|
MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp
|
|
|
|
MobileGL/MG_State/GLState/Core.cpp
|
|
MobileGL/MG_State/EGLState/Core.cpp
|
|
MobileGL/MG_State/GLState/ErrorState/Error.cpp
|
|
MobileGL/MG_State/GLState/BufferState/BufferState.cpp
|
|
MobileGL/MG_State/GLState/BufferState/BufferObject.cpp
|
|
MobileGL/MG_State/GLState/VertexArrayState/VertexArrayState.cpp
|
|
MobileGL/MG_State/GLState/VertexArrayState/VertexArrayObject.cpp
|
|
MobileGL/MG_State/GLState/TextureState/MipmapStorage.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureObject.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureObject1D.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureObject2D.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureObject2DCube.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureObject3D.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureObjectBuffer.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureUnit.cpp
|
|
MobileGL/MG_State/GLState/TextureState/TextureState.cpp
|
|
MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp
|
|
MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp
|
|
MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp
|
|
MobileGL/MG_State/GLState/RenderState/RenderState.cpp
|
|
MobileGL/MG_State/GLState/FramebufferState/FramebufferObject.cpp
|
|
MobileGL/MG_State/GLState/FramebufferState/FramebufferState.cpp
|
|
MobileGL/MG_State/GLState/SamplerState/SamplerObject.cpp
|
|
MobileGL/MG_State/GLState/SamplerState/SamplerState.cpp
|
|
MobileGL/MG_State/GLState/RenderbufferState/RenderbufferObject.cpp
|
|
MobileGL/MG_State/GLState/RenderbufferState/RenderbufferState.cpp
|
|
)
|
|
|
|
if (APPLE AND NOT MOBILEGL_IOS)
|
|
list(APPEND SOURCE_FILES
|
|
MobileGL/MG_Impl/CGLImpl/CGLImpl.cpp
|
|
MobileGL/MG_Impl/CGLImpl/Exporting/Definitions.cpp
|
|
MobileGL/MG_Impl/DyldInterpose/DyldInterpose.cpp
|
|
MobileGL/MG_Impl/NSOpenGLImpl/NSOpenGLImpl.cpp
|
|
)
|
|
endif()
|
|
|
|
if (ANDROID)
|
|
list(APPEND SOURCE_FILES
|
|
MobileGL/MG_Util/SelfTest/DriverPostJni.cpp
|
|
MobileGL/MG_Util/SelfTest/DriverBenchJni.cpp
|
|
)
|
|
endif()
|
|
|
|
if (WIN32)
|
|
list(APPEND SOURCE_FILES
|
|
MobileGL/MG_Impl/WGLImpl/WGLImpl.cpp
|
|
MobileGL/MG_Impl/WGLImpl/Exporting/Definitions.cpp
|
|
)
|
|
endif()
|
|
|
|
set(MOBILEGL_LINK_LIBRARIES
|
|
glslang::glslang
|
|
spirv-cross-c
|
|
SPIRV-Tools-opt
|
|
SPIRV-Tools
|
|
xxHash::xxhash
|
|
GPUOpen::VulkanMemoryAllocator
|
|
Vulkan::UtilityHeaders
|
|
spirv-reflect-static
|
|
)
|
|
|
|
set(MOBILEGL_COMPILE_DEF
|
|
-DVMA_STATIC_VULKAN_FUNCTIONS=0
|
|
-DVMA_DYNAMIC_VULKAN_FUNCTIONS=1
|
|
-DVMA_VULKAN_VERSION=1001000
|
|
)
|
|
|
|
message(STATUS "MOBILEGL_COMPILE_DEF=${MOBILEGL_COMPILE_DEF}")
|
|
|
|
set(MOBILEGL_INCLUDE_DIR
|
|
${CMAKE_SOURCE_DIR}/include
|
|
${CMAKE_SOURCE_DIR}/MobileGL
|
|
${spirv-tools_SOURCE_DIR}
|
|
${spirv-tools_SOURCE_DIR}/include
|
|
${spirv-tools_BINARY_DIR}
|
|
${SPIRV-Headers_SOURCE_DIR}/include
|
|
)
|
|
|
|
add_library(${CMAKE_PROJECT_NAME} SHARED
|
|
${SOURCE_FILES}
|
|
)
|
|
|
|
if (WIN32)
|
|
# The wgl* entry points are exported via .def (see the comment in wgl.def);
|
|
# only the shared library links it.
|
|
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
|
|
MobileGL/MG_Impl/WGLImpl/Exporting/wgl.def
|
|
)
|
|
endif()
|
|
|
|
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
|
|
C_VISIBILITY_PRESET default
|
|
CXX_VISIBILITY_PRESET default
|
|
VISIBILITY_INLINES_HIDDEN OFF
|
|
)
|
|
else()
|
|
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
|
|
C_VISIBILITY_PRESET hidden
|
|
CXX_VISIBILITY_PRESET hidden
|
|
VISIBILITY_INLINES_HIDDEN ON
|
|
)
|
|
endif()
|
|
|
|
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC
|
|
${MOBILEGL_INCLUDE_DIR}
|
|
)
|
|
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}
|
|
PUBLIC
|
|
${MOBILEGL_LINK_LIBRARIES}
|
|
)
|
|
|
|
target_compile_definitions(${CMAKE_PROJECT_NAME}
|
|
PUBLIC
|
|
${MOBILEGL_COMPILE_DEF}
|
|
MOBILEGL_LOG_ACTIVE_LEVEL=${MOBILEGL_LOG_ACTIVE_LEVEL}
|
|
$<$<BOOL:${MOBILEGL_TRACE_ANGLE_VARIANTS}>:MOBILEGL_TRACE_ANGLE_VARIANTS=1>
|
|
)
|
|
|
|
if(UNIX AND NOT APPLE AND NOT ANDROID)
|
|
foreach(MOBILEGL_LOADER_ALIAS
|
|
libEGL.so libEGL.so.1)
|
|
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink
|
|
"$<TARGET_FILE_NAME:${CMAKE_PROJECT_NAME}>"
|
|
"$<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>/${MOBILEGL_LOADER_ALIAS}"
|
|
COMMENT "Creating ${MOBILEGL_LOADER_ALIAS} alias for Linux GL/EGL loaders"
|
|
)
|
|
endforeach()
|
|
endif()
|
|
|
|
if(WIN32)
|
|
# Drop-in for the classic GL loader path: a copy named opengl32.dll placed
|
|
# next to a host executable is what LoadLibrary("opengl32.dll") and gdi32's
|
|
# pixel-format forwarding will resolve.
|
|
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"$<TARGET_FILE:${CMAKE_PROJECT_NAME}>"
|
|
"$<TARGET_FILE_DIR:${CMAKE_PROJECT_NAME}>/opengl32.dll"
|
|
COMMENT "Creating opengl32.dll drop-in copy"
|
|
)
|
|
endif()
|
|
|
|
if(NOT ANDROID)
|
|
add_library(${CMAKE_PROJECT_NAME}_s STATIC
|
|
${SOURCE_FILES}
|
|
)
|
|
|
|
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
set_target_properties(${CMAKE_PROJECT_NAME}_s PROPERTIES
|
|
C_VISIBILITY_PRESET default
|
|
CXX_VISIBILITY_PRESET default
|
|
VISIBILITY_INLINES_HIDDEN OFF
|
|
)
|
|
else()
|
|
set_target_properties(${CMAKE_PROJECT_NAME}_s PROPERTIES
|
|
C_VISIBILITY_PRESET hidden
|
|
CXX_VISIBILITY_PRESET hidden
|
|
VISIBILITY_INLINES_HIDDEN ON
|
|
)
|
|
endif()
|
|
|
|
target_include_directories(${CMAKE_PROJECT_NAME}_s PUBLIC
|
|
${MOBILEGL_INCLUDE_DIR}
|
|
)
|
|
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_s
|
|
PUBLIC
|
|
${MOBILEGL_LINK_LIBRARIES}
|
|
)
|
|
|
|
target_compile_definitions(${CMAKE_PROJECT_NAME}_s
|
|
PUBLIC
|
|
${MOBILEGL_COMPILE_DEF}
|
|
MOBILEGL_LOG_ACTIVE_LEVEL=${MOBILEGL_LOG_ACTIVE_LEVEL}
|
|
)
|
|
endif()
|
|
|
|
if (TRACY_ENABLE)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC Tracy::TracyClient)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_s PUBLIC Tracy::TracyClient)
|
|
target_compile_definitions(${CMAKE_PROJECT_NAME} PUBLIC -DTRACY_ENABLE)
|
|
target_compile_definitions(${CMAKE_PROJECT_NAME}_s PUBLIC -DTRACY_ENABLE)
|
|
endif ()
|
|
|
|
if (ANDROID)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC
|
|
android
|
|
log
|
|
vulkan
|
|
)
|
|
endif()
|
|
|
|
if (APPLE AND NOT MOBILEGL_IOS)
|
|
# MobileGL statically embeds glslang, SPIRV-Tools, and SPIRV-Cross. When
|
|
# this dylib is injected with DYLD_INSERT_LIBRARIES, exporting those C++
|
|
# symbols interposes incompatible copies embedded by host libraries such
|
|
# as shaderc. Keep only the public GL/EGL/CGL loader surface globally
|
|
# visible; GetProcAddress can still return pointers to hidden internals.
|
|
set(MOBILEGL_MACOS_EXPORTED_SYMBOLS
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/MobileGL/MG_Impl/DyldInterpose/ExportedSymbols.txt")
|
|
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
|
|
"LINKER:-exported_symbols_list,${MOBILEGL_MACOS_EXPORTED_SYMBOLS}")
|
|
set_property(TARGET ${CMAKE_PROJECT_NAME} APPEND PROPERTY
|
|
LINK_DEPENDS "${MOBILEGL_MACOS_EXPORTED_SYMBOLS}")
|
|
|
|
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC
|
|
"-framework Cocoa"
|
|
"-framework CoreVideo"
|
|
"-framework QuartzCore"
|
|
"-framework Foundation"
|
|
"-framework OpenGL"
|
|
objc)
|
|
if(TARGET ${CMAKE_PROJECT_NAME}_s)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_s PUBLIC
|
|
"-framework Cocoa"
|
|
"-framework CoreVideo"
|
|
"-framework QuartzCore"
|
|
"-framework Foundation"
|
|
"-framework OpenGL"
|
|
objc)
|
|
endif()
|
|
endif()
|
|
|
|
if (APPLE AND MOBILEGL_IOS)
|
|
target_compile_definitions(${CMAKE_PROJECT_NAME} PUBLIC MOBILEGL_IOS=1 _LIBCPP_DISABLE_AVAILABILITY)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC
|
|
"-framework CoreGraphics"
|
|
"-framework Foundation"
|
|
"-framework QuartzCore"
|
|
objc)
|
|
if (MOBILEGL_VULKAN_LIBRARY)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC "${MOBILEGL_VULKAN_LIBRARY}")
|
|
endif()
|
|
|
|
if(TARGET ${CMAKE_PROJECT_NAME}_s)
|
|
target_compile_definitions(${CMAKE_PROJECT_NAME}_s PUBLIC MOBILEGL_IOS=1 _LIBCPP_DISABLE_AVAILABILITY)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_s PUBLIC
|
|
"-framework CoreGraphics"
|
|
"-framework Foundation"
|
|
"-framework QuartzCore"
|
|
objc)
|
|
if (MOBILEGL_VULKAN_LIBRARY)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_s PUBLIC "${MOBILEGL_VULKAN_LIBRARY}")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if (NOT ANDROID AND NOT MOBILEGL_IOS)
|
|
find_package(Vulkan)
|
|
if (Vulkan_FOUND)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC Vulkan::Vulkan Vulkan::Headers)
|
|
target_link_libraries(${CMAKE_PROJECT_NAME}_s PUBLIC Vulkan::Vulkan Vulkan::Headers)
|
|
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC ${Vulkan_INCLUDE_DIR})
|
|
target_include_directories(${CMAKE_PROJECT_NAME}_s PUBLIC ${Vulkan_INCLUDE_DIR})
|
|
endif ()
|
|
endif ()
|
|
|
|
if (NOT ANDROID)
|
|
# Enable testing in the top-level scope so a CTestTestfile.cmake is emitted
|
|
# at the build-tree root. This lets `ctest` be invoked from the top-level
|
|
# build directory (IDE "run all tests", CI) and discover every test in the
|
|
# subdirectories below, instead of having to descend into each
|
|
# MG_Test/MG_Benchmark subdirectory. Tests are tagged with CTest labels
|
|
# (unit / benchmark / integration), so e.g. `ctest -L unit` selects just
|
|
# the unit suite.
|
|
enable_testing()
|
|
|
|
if (MOBILEGL_BUILD_TEST)
|
|
add_subdirectory(MobileGL/MG_Test)
|
|
endif()
|
|
|
|
# After MG_Test so googletest is already available when the unit tests are
|
|
# built; the module fetches its own copy when they are not.
|
|
if (MOBILEGL_BUILD_INTEGRATION_TEST)
|
|
add_subdirectory(MobileGL/MG_IntegrationTest)
|
|
endif()
|
|
|
|
if (MOBILEGL_BUILD_BENCHMARK)
|
|
add_subdirectory(MobileGL/MG_Benchmark)
|
|
endif()
|
|
|
|
if (MOBILEGL_BUILD_TRACE_REPLAY)
|
|
add_subdirectory(tools/trace_replay)
|
|
endif()
|
|
endif()
|