diff options
Diffstat (limited to 'platform/ios')
| -rw-r--r-- | platform/ios/SCsub | 61 | ||||
| -rw-r--r-- | platform/ios/detect.py | 2 | ||||
| -rw-r--r-- | platform/ios/display_server_ios.mm | 2 | ||||
| -rw-r--r-- | platform/ios/export/export_plugin.cpp | 10 | ||||
| -rw-r--r-- | platform/ios/rendering_context_driver_vulkan_ios.h | 4 | ||||
| -rw-r--r-- | platform/ios/rendering_context_driver_vulkan_ios.mm | 12 |
6 files changed, 80 insertions, 11 deletions
diff --git a/platform/ios/SCsub b/platform/ios/SCsub index d7c950967c..5a57f3840b 100644 --- a/platform/ios/SCsub +++ b/platform/ios/SCsub @@ -2,6 +2,62 @@ Import("env") +import os, json +from platform_methods import run_in_subprocess, architectures, lipo, get_build_version, detect_mvk +import subprocess +import shutil + + +def generate_bundle(target, source, env): + bin_dir = Dir("#bin").abspath + + # Template bundle. + app_prefix = "godot." + env["platform"] + rel_prefix = "libgodot." + env["platform"] + "." + "template_release" + dbg_prefix = "libgodot." + env["platform"] + "." + "template_debug" + if env.dev_build: + app_prefix += ".dev" + rel_prefix += ".dev" + dbg_prefix += ".dev" + if env["precision"] == "double": + app_prefix += ".double" + rel_prefix += ".double" + dbg_prefix += ".double" + + # Lipo template libraries. + rel_target_bin = lipo(bin_dir + "/" + rel_prefix, env.extra_suffix + ".a") + dbg_target_bin = lipo(bin_dir + "/" + dbg_prefix, env.extra_suffix + ".a") + rel_target_bin_sim = lipo(bin_dir + "/" + rel_prefix, ".simulator" + env.extra_suffix + ".a") + dbg_target_bin_sim = lipo(bin_dir + "/" + dbg_prefix, ".simulator" + env.extra_suffix + ".a") + + # Assemble Xcode project bundle. + app_dir = Dir("#bin/ios_xcode").abspath + templ = Dir("#misc/dist/ios_xcode").abspath + if os.path.exists(app_dir): + shutil.rmtree(app_dir) + shutil.copytree(templ, app_dir) + if rel_target_bin != "": + shutil.copy(rel_target_bin, app_dir + "/libgodot.ios.release.xcframework/ios-arm64/libgodot.a") + if dbg_target_bin != "": + shutil.copy(dbg_target_bin, app_dir + "/libgodot.ios.debug.xcframework/ios-arm64/libgodot.a") + if rel_target_bin_sim != "": + shutil.copy( + rel_target_bin_sim, app_dir + "/libgodot.ios.release.xcframework/ios-arm64_x86_64-simulator/libgodot.a" + ) + if dbg_target_bin_sim != "": + shutil.copy( + dbg_target_bin_sim, app_dir + "/libgodot.ios.debug.xcframework/ios-arm64_x86_64-simulator/libgodot.a" + ) + mvk_path = detect_mvk(env, "ios-arm64") + if mvk_path != "": + shutil.copytree(mvk_path, app_dir + "/MoltenVK.xcframework") + + # ZIP Xcode project bundle. + zip_dir = Dir("#bin/" + (app_prefix + env.extra_suffix).replace(".", "_")).abspath + shutil.make_archive(zip_dir, "zip", root_dir=app_dir) + shutil.rmtree(app_dir) + + ios_lib = [ "godot_ios.mm", "os_ios.mm", @@ -42,3 +98,8 @@ def combine_libs(target=None, source=None, env=None): combine_command = env_ios.Command("#bin/libgodot" + env_ios["LIBSUFFIX"], [ios_lib] + env_ios["LIBS"], combine_libs) + +if env["generate_bundle"]: + generate_bundle_command = env.Command("generate_bundle", [], generate_bundle) + command = env.AlwaysBuild(generate_bundle_command) + env.Depends(command, [combine_command]) diff --git a/platform/ios/detect.py b/platform/ios/detect.py index 23f688501b..f8468e3d9e 100644 --- a/platform/ios/detect.py +++ b/platform/ios/detect.py @@ -23,6 +23,7 @@ def get_opts(): from SCons.Variables import BoolVariable return [ + ("vulkan_sdk_path", "Path to the Vulkan SDK", ""), ( "IOS_TOOLCHAIN_PATH", "Path to iOS toolchain", @@ -31,6 +32,7 @@ def get_opts(): ("IOS_SDK_PATH", "Path to the iOS SDK", ""), BoolVariable("ios_simulator", "Build for iOS Simulator", False), ("ios_triple", "Triple for ios toolchain", ""), + BoolVariable("generate_bundle", "Generate an APP bundle after building iOS/macOS binaries", False), ] diff --git a/platform/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm index c371f2777c..2895dffdfa 100644 --- a/platform/ios/display_server_ios.mm +++ b/platform/ios/display_server_ios.mm @@ -80,7 +80,7 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode if (!layer) { ERR_FAIL_MSG("Failed to create iOS Vulkan rendering layer."); } - wpd.vulkan.layer_ptr = &layer; + wpd.vulkan.layer_ptr = (CAMetalLayer *const *)&layer; rendering_context = memnew(RenderingContextDriverVulkanIOS); } #endif diff --git a/platform/ios/export/export_plugin.cpp b/platform/ios/export/export_plugin.cpp index d35819c34d..f518d7607b 100644 --- a/platform/ios/export/export_plugin.cpp +++ b/platform/ios/export/export_plugin.cpp @@ -1007,6 +1007,12 @@ Error EditorExportPlatformIOS::_convert_to_framework(const String &p_source, con // Creating Info.plist { + String lib_clean_name = file_name; + for (int i = 0; i < lib_clean_name.length(); i++) { + if (!is_ascii_alphanumeric_char(lib_clean_name[i]) && lib_clean_name[i] != '.' && lib_clean_name[i] != '-') { + lib_clean_name[i] = '-'; + } + } String info_plist_format = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" "<plist version=\"1.0\">\n" @@ -1014,7 +1020,7 @@ Error EditorExportPlatformIOS::_convert_to_framework(const String &p_source, con " <key>CFBundleShortVersionString</key>\n" " <string>1.0</string>\n" " <key>CFBundleIdentifier</key>\n" - " <string>$id.framework.$name</string>\n" + " <string>$id.framework.$cl_name</string>\n" " <key>CFBundleName</key>\n" " <string>$name</string>\n" " <key>CFBundleExecutable</key>\n" @@ -1032,7 +1038,7 @@ Error EditorExportPlatformIOS::_convert_to_framework(const String &p_source, con " </dict>\n" "</plist>"; - String info_plist = info_plist_format.replace("$id", p_id).replace("$name", file_name); + String info_plist = info_plist_format.replace("$id", p_id).replace("$name", file_name).replace("$cl_name", lib_clean_name); Ref<FileAccess> f = FileAccess::open(p_destination.path_join("Info.plist"), FileAccess::WRITE); if (f.is_valid()) { diff --git a/platform/ios/rendering_context_driver_vulkan_ios.h b/platform/ios/rendering_context_driver_vulkan_ios.h index 0778993a05..dc85ff738d 100644 --- a/platform/ios/rendering_context_driver_vulkan_ios.h +++ b/platform/ios/rendering_context_driver_vulkan_ios.h @@ -35,7 +35,7 @@ #include "drivers/vulkan/rendering_context_driver_vulkan.h" -#import <UIKit/UIKit.h> +#import <QuartzCore/CAMetalLayer.h> class RenderingContextDriverVulkanIOS : public RenderingContextDriverVulkan { private: @@ -46,7 +46,7 @@ protected: public: struct WindowPlatformData { - CALayer *const *layer_ptr; + CAMetalLayer *const *layer_ptr; }; RenderingContextDriverVulkanIOS(); diff --git a/platform/ios/rendering_context_driver_vulkan_ios.mm b/platform/ios/rendering_context_driver_vulkan_ios.mm index 7e9c3e0e44..6a6af1bc41 100644 --- a/platform/ios/rendering_context_driver_vulkan_ios.mm +++ b/platform/ios/rendering_context_driver_vulkan_ios.mm @@ -35,22 +35,22 @@ #ifdef USE_VOLK #include <volk.h> #else -#include <vulkan/vulkan.h> +#include <vulkan/vulkan_metal.h> #endif const char *RenderingContextDriverVulkanIOS::_get_platform_surface_extension() const { - return VK_MVK_IOS_SURFACE_EXTENSION_NAME; + return VK_EXT_METAL_SURFACE_EXTENSION_NAME; } RenderingContextDriver::SurfaceID RenderingContextDriverVulkanIOS::surface_create(const void *p_platform_data) { const WindowPlatformData *wpd = (const WindowPlatformData *)(p_platform_data); - VkIOSSurfaceCreateInfoMVK create_info = {}; - create_info.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK; - create_info.pView = (__bridge const void *)(*wpd->layer_ptr); + VkMetalSurfaceCreateInfoEXT create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; + create_info.pLayer = *wpd->layer_ptr; VkSurfaceKHR vk_surface = VK_NULL_HANDLE; - VkResult err = vkCreateIOSSurfaceMVK(instance_get(), &create_info, nullptr, &vk_surface); + VkResult err = vkCreateMetalSurfaceEXT(instance_get(), &create_info, nullptr, &vk_surface); ERR_FAIL_COND_V(err != VK_SUCCESS, SurfaceID()); Surface *surface = memnew(Surface); |
