Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -732,6 +732,9 @@ string(TOLOWER "${DIST_ARCH}" DIST_ARCH)
string(REPLACE "amd64" "x86_64" DIST_ARCH "${DIST_ARCH}")
if (NOT DIST_DIR)
set(DIST_DIR "${DIST_ARCH}")
if (PLATFORM_NAME)
set(DIST_DIR "${DIST_DIR}-${PLATFORM_NAME}")
endif()
endif()

# ==================================================================================================
Expand Down
77 changes: 59 additions & 18 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ function print_help {
echo " -e"
echo " Enable EGL on Linux support for desktop builds."
echo " -l"
echo " Build arm64/x86_64 universal libraries."
echo " For iOS, this builds universal binaries for devices and the simulator (implies -s)."
echo " Build universal libraries/frameworks."
echo " For iOS, this builds XCFrameworks for devices and the simulator (implies -s)."
echo " For macOS, this builds universal binaries for both Apple silicon and Intel-based Macs."
echo " -k sample1,sample2,..."
echo " When building for Android, also build select sample APKs."
Expand Down Expand Up @@ -685,9 +685,9 @@ function build_ios_target {
local platform=$3

echo "Building iOS ${lc_target} (${arch}) for ${platform}..."
mkdir -p "out/cmake-ios-${lc_target}-${arch}"
mkdir -p "out/cmake-ios-${lc_target}-${arch}-${platform}"

pushd "out/cmake-ios-${lc_target}-${arch}" > /dev/null
pushd "out/cmake-ios-${lc_target}-${arch}-${platform}" > /dev/null

if [[ ! -d "CMakeFiles" ]] || [[ "${ISSUE_CMAKE_ALWAYS}" == "true" ]]; then
cmake \
Expand Down Expand Up @@ -746,38 +746,79 @@ function build_ios {
# only arm64 devices support OpenGL 3.0 / Metal

if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then
local out_dir="out/ios-debug/filament"
local lib_dir="${out_dir}/lib"

build_ios_target "Debug" "arm64" "iphoneos"

if [[ "${IOS_BUILD_SIMULATOR}" == "true" ]]; then
build_ios_target "Debug" "arm64" "iphonesimulator"
build_ios_target "Debug" "x86_64" "iphonesimulator"

# Create a universal library for the simulator
build/ios/create-universal-libs.sh \
-o "${lib_dir}/universal" \
"${lib_dir}/arm64-iphonesimulator" \
"${lib_dir}/x86_64-iphonesimulator"
fi

if [[ "${BUILD_UNIVERSAL_LIBRARIES}" == "true" ]]; then
build/ios/create-universal-libs.sh \
-o out/ios-debug/filament/lib/universal \
out/ios-debug/filament/lib/arm64 \
out/ios-debug/filament/lib/x86_64
rm -rf out/ios-debug/filament/lib/arm64
rm -rf out/ios-debug/filament/lib/x86_64
# Always create XCFrameworks
local xcframework_paths=("${lib_dir}/arm64-iphoneos")
if [[ -d "${lib_dir}/universal" ]]; then
xcframework_paths+=("${lib_dir}/universal")
elif [[ -d "${lib_dir}/arm64-iphonesimulator" ]]; then
# If we built only one simulator arch but not both
xcframework_paths+=("${lib_dir}/arm64-iphonesimulator")
elif [[ -d "${lib_dir}/x86_64-iphonesimulator" ]]; then
xcframework_paths+=("${lib_dir}/x86_64-iphonesimulator")
fi

build/ios/create-xc-frameworks.sh -o "${lib_dir}" "${xcframework_paths[@]}"

rm -rf \
"${lib_dir}/arm64-iphoneos" \
"${lib_dir}/arm64-iphonesimulator" \
"${lib_dir}/x86_64-iphonesimulator" \
"${lib_dir}/universal"

archive_ios "Debug"
fi

if [[ "${ISSUE_RELEASE_BUILD}" == "true" ]]; then
local out_dir="out/ios-release/filament"
local lib_dir="${out_dir}/lib"

build_ios_target "Release" "arm64" "iphoneos"

if [[ "${IOS_BUILD_SIMULATOR}" == "true" ]]; then
build_ios_target "Release" "arm64" "iphonesimulator"
build_ios_target "Release" "x86_64" "iphonesimulator"

# Create a universal library for the simulator
build/ios/create-universal-libs.sh \
-o "${lib_dir}/universal" \
"${lib_dir}/arm64-iphonesimulator" \
"${lib_dir}/x86_64-iphonesimulator"
fi

if [[ "${BUILD_UNIVERSAL_LIBRARIES}" == "true" ]]; then
build/ios/create-universal-libs.sh \
-o out/ios-release/filament/lib/universal \
out/ios-release/filament/lib/arm64 \
out/ios-release/filament/lib/x86_64
rm -rf out/ios-release/filament/lib/arm64
rm -rf out/ios-release/filament/lib/x86_64
# Always create XCFrameworks
local xcframework_paths=("${lib_dir}/arm64-iphoneos")
if [[ -d "${lib_dir}/universal" ]]; then
xcframework_paths+=("${lib_dir}/universal")
elif [[ -d "${lib_dir}/arm64-iphonesimulator" ]]; then
xcframework_paths+=("${lib_dir}/arm64-iphonesimulator")
elif [[ -d "${lib_dir}/x86_64-iphonesimulator" ]]; then
xcframework_paths+=("${lib_dir}/x86_64-iphonesimulator")
fi

build/ios/create-xc-frameworks.sh -o "${lib_dir}" "${xcframework_paths[@]}"

rm -rf \
"${lib_dir}/arm64-iphoneos" \
"${lib_dir}/arm64-iphonesimulator" \
"${lib_dir}/x86_64-iphonesimulator" \
"${lib_dir}/universal"

archive_ios "Release"
fi
}
Expand Down
87 changes: 87 additions & 0 deletions build/ios/create-xc-frameworks.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/usr/bin/env bash

set -e

function print_help {
local SELF_NAME
SELF_NAME=$(basename "$0")
echo "$SELF_NAME. Combine multiple platform-specific libraries into XCFramework bundles."
echo ""
echo "Usage:"
echo " $SELF_NAME [options] <path>..."
echo ""
echo "Options:"
echo " -h"
echo " Print this help message."
echo " -o"
echo " Output directory to store the XCFrameworks."
echo ""
echo "Example:"
echo " $SELF_NAME -o xcframeworks/ iphoneos/ iphonesimulator/"
echo ""
}

OUTPUT_DIR=""
while getopts "ho:" opt; do
case ${opt} in
h)
print_help
exit 1
;;
o)
OUTPUT_DIR="${OPTARG}"
;;
*)
print_help
exit 1
;;
esac
done

shift $((OPTIND - 1))

PATHS=("$@")

if [[ ! "${PATHS[*]}" ]]; then
echo "One or more paths required."
print_help
exit 1
fi

if [[ ! "${OUTPUT_DIR}" ]]; then
echo "Output directory required."
print_help
exit 1
fi

mkdir -p "${OUTPUT_DIR}"

# Use the first path as the leader to find all .a files
LEADER_PATH="${PATHS[0]}"

for FILE in "${LEADER_PATH}"/*.a; do
[ -f "${FILE}" ] || continue

LIBRARY_NAME="${FILE##*/}"
FRAMEWORK_NAME="${LIBRARY_NAME%.a}.xcframework"

echo "Creating XCFramework for: ${LIBRARY_NAME}"

CMD="xcodebuild -create-xcframework"

for PLATFORM_PATH in "${PATHS[@]}"; do
LIB_PATH="${PLATFORM_PATH}/${LIBRARY_NAME}"
if [[ -f "${LIB_PATH}" ]]; then
CMD="${CMD} -library ${LIB_PATH}"
else
echo "Warning: ${LIB_PATH} does not exist, skipping this platform for ${LIBRARY_NAME}"
fi
done

CMD="${CMD} -output ${OUTPUT_DIR}/${FRAMEWORK_NAME}"

# Remove existing framework if it exists
rm -rf "${OUTPUT_DIR}/${FRAMEWORK_NAME}"

eval "${CMD}"
done
3 changes: 3 additions & 0 deletions filament/backend/src/metal/MetalDriver.mm
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
* limitations under the License.
*/

#include <TargetConditionals.h>
#include "backend/PresentCallable.h"
#include "private/backend/CommandStream.h"
#include "CommandStreamDispatcher.h"
Expand Down Expand Up @@ -160,9 +161,11 @@
}

mContext->supportsDepthClamp = false;
#if !TARGET_OS_SIMULATOR
if (@available(macOS 10.11, iOS 11.0, *)) {
mContext->supportsDepthClamp = true;
}
#endif

// In order to support resolve store action on depth attachment, the GPU needs to support it.
// Note that support for depth resolve implies support for stencil resolve using .sample0 resolve filter.
Expand Down
69 changes: 31 additions & 38 deletions ios/CocoaPods/Filament.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,6 @@ Pod::Spec.new do |spec|

spec.libraries = 'c++'

# Fix linking error with Xcode 12; we do not yet support the simulator on Apple silicon.
spec.pod_target_xcconfig = {
'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64'
}
spec.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

spec.subspec "filament" do |ss|
ss.source_files =
"include/filament/*.h",
Expand All @@ -25,13 +19,13 @@ Pod::Spec.new do |spec|
"include/ibl/*.h",
"include/geometry/*.h"
ss.header_mappings_dir = "include"
ss.vendored_libraries =
"lib/universal/libfilament.a",
"lib/universal/libbackend.a",
"lib/universal/libfilabridge.a",
"lib/universal/libfilaflat.a",
"lib/universal/libibl.a",
"lib/universal/libgeometry.a"
ss.vendored_frameworks =
"lib/libfilament.xcframework",
"lib/libbackend.xcframework",
"lib/libfilabridge.xcframework",
"lib/libfilaflat.xcframework",
"lib/libibl.xcframework",
"lib/libgeometry.xcframework"
ss.dependency "Filament/utils"
ss.dependency "Filament/math"
end
Expand All @@ -42,55 +36,54 @@ Pod::Spec.new do |spec|
"include/filament/MaterialChunkType.h",
"include/filament/MaterialEnums.h"
ss.header_mappings_dir = "include"
ss.vendored_libraries =
"lib/universal/libfilamat.a",
"lib/universal/libshaders.a",
"lib/universal/libsmol-v.a",
"lib/universal/libfilabridge.a"
ss.vendored_frameworks =
"lib/libfilamat.xcframework",
"lib/libshaders.xcframework",
"lib/libsmol-v.xcframework"
ss.dependency "Filament/utils"
ss.dependency "Filament/math"
end

spec.subspec "gltfio_core" do |ss|
ss.source_files = "include/gltfio/**/*.h"
ss.header_mappings_dir = "include"
ss.vendored_libraries =
"lib/universal/libgltfio_core.a",
"lib/universal/libdracodec.a",
"lib/universal/libuberarchive.a",
"lib/universal/libstb.a"
ss.vendored_frameworks =
"lib/libgltfio_core.xcframework",
"lib/libdracodec.xcframework",
"lib/libuberarchive.xcframework",
"lib/libstb.xcframework"
ss.dependency "Filament/filament"
ss.dependency "Filament/ktxreader"
ss.dependency "Filament/uberz"
end

spec.subspec "camutils" do |ss|
ss.source_files = "include/camutils/*.h"
ss.vendored_libraries = "lib/universal/libcamutils.a"
ss.vendored_frameworks = "lib/libcamutils.xcframework"
ss.header_dir = "camutils"
ss.dependency "Filament/math"
end

spec.subspec "filameshio" do |ss|
ss.source_files = "include/filameshio/*.h"
ss.vendored_libraries =
"lib/universal/libfilameshio.a",
"lib/universal/libmeshoptimizer.a"
ss.vendored_frameworks =
"lib/libfilameshio.xcframework",
"lib/libmeshoptimizer.xcframework"
ss.header_dir = "filameshio"
ss.dependency "Filament/filament"
end

spec.subspec "image" do |ss|
ss.source_files = "include/image/*.h"
ss.vendored_libraries = "lib/universal/libimage.a"
ss.vendored_frameworks = "lib/libimage.xcframework"
ss.header_dir = "image"
ss.dependency "Filament/filament"
end

spec.subspec "utils" do |ss|
ss.source_files = "include/utils/**/*.h"
ss.header_mappings_dir = "include"
ss.vendored_libraries = "lib/universal/libutils.a"
ss.vendored_frameworks = "lib/libutils.xcframework"
ss.dependency "Filament/tsl"
end

Expand All @@ -107,29 +100,29 @@ Pod::Spec.new do |spec|
spec.subspec "ktxreader" do |ss|
ss.source_files = "include/ktxreader/*.h"
ss.header_mappings_dir = "include"
ss.vendored_libraries =
"lib/universal/libktxreader.a",
"lib/universal/libbasis_transcoder.a"
ss.vendored_frameworks =
"lib/libktxreader.xcframework",
"lib/libbasis_transcoder.xcframework"
ss.dependency "Filament/image"
ss.dependency "Filament/filament"
end

spec.subspec "viewer" do |ss|
ss.source_files = "include/viewer/*.h"
ss.header_mappings_dir = "include"
ss.vendored_libraries =
"lib/universal/libviewer.a",
"lib/universal/libcivetweb.a"
ss.vendored_frameworks =
"lib/libviewer.xcframework",
"lib/libcivetweb.xcframework"
ss.dependency "Filament/filament"
ss.dependency "Filament/gltfio_core"
end

spec.subspec "uberz" do |ss|
ss.source_files = "include/uberz/*.h"
ss.header_mappings_dir = "include"
ss.vendored_libraries =
"lib/universal/libuberzlib.a",
"lib/universal/libzstd.a"
ss.vendored_frameworks =
"lib/libuberzlib.xcframework",
"lib/libzstd.xcframework"
ss.header_dir = "uberz"
ss.dependency "Filament/filamat"
ss.dependency "Filament/tsl"
Expand Down
Loading
Loading