[iOS] Restore OpenGLES3 renderer support.

This commit is contained in:
bruvzg 2023-01-21 00:20:30 +02:00
parent cd031fd31a
commit 1cc5524b81
No known key found for this signature in database
GPG key ID: 7960FCF39844EC38
9 changed files with 84 additions and 42 deletions

View file

@ -1596,9 +1596,13 @@ void TextureStorage::_update_render_target(RenderTarget *rt) {
glTexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
} }
#ifndef IOS_ENABLED
if (use_multiview) { if (use_multiview) {
glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, rt->color, 0, 0, rt->view_count); glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, rt->color, 0, 0, rt->view_count);
} else { } else {
#else
{
#endif
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rt->color, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rt->color, 0);
} }
@ -1623,9 +1627,13 @@ void TextureStorage::_update_render_target(RenderTarget *rt) {
glTexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
} }
#ifndef IOS_ENABLED
if (use_multiview) { if (use_multiview) {
glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, rt->depth, 0, 0, rt->view_count); glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, rt->depth, 0, 0, rt->view_count);
} else { } else {
#else
{
#endif
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0);
} }

View file

@ -99,8 +99,8 @@ def configure(env: "Environment"):
if env["ios_simulator"]: if env["ios_simulator"]:
detect_darwin_sdk_path("iossimulator", env) detect_darwin_sdk_path("iossimulator", env)
env.Append(ASFLAGS=["-mios-simulator-version-min=13.0"]) env.Append(ASFLAGS=["-mios-simulator-version-min=11.0"])
env.Append(CCFLAGS=["-mios-simulator-version-min=13.0"]) env.Append(CCFLAGS=["-mios-simulator-version-min=11.0"])
env.extra_suffix = ".simulator" + env.extra_suffix env.extra_suffix = ".simulator" + env.extra_suffix
else: else:
detect_darwin_sdk_path("ios", env) detect_darwin_sdk_path("ios", env)
@ -153,3 +153,11 @@ def configure(env: "Environment"):
if env["vulkan"]: if env["vulkan"]:
env.Append(CPPDEFINES=["VULKAN_ENABLED"]) env.Append(CPPDEFINES=["VULKAN_ENABLED"])
if env["opengl3"]:
env.Append(CPPDEFINES=["GLES3_ENABLED"])
env.Prepend(
CPPPATH=[
"$IOS_SDK_PATH/System/Library/Frameworks/OpenGLES.framework/Headers",
]
)

View file

@ -33,7 +33,8 @@
@protocol DisplayLayer <NSObject> @protocol DisplayLayer <NSObject>
- (void)renderDisplayLayer; - (void)startRenderDisplayLayer;
- (void)stopRenderDisplayLayer;
- (void)initializeDisplayLayer; - (void)initializeDisplayLayer;
- (void)layoutDisplayLayer; - (void)layoutDisplayLayer;

View file

@ -60,7 +60,10 @@
- (void)layoutDisplayLayer { - (void)layoutDisplayLayer {
} }
- (void)renderDisplayLayer { - (void)startRenderDisplayLayer {
}
- (void)stopRenderDisplayLayer {
} }
@end @end
@ -76,8 +79,6 @@
} }
- (void)initializeDisplayLayer { - (void)initializeDisplayLayer {
// Get our backing layer
// Configure it so that it is opaque, does not retain the contents of the backbuffer when displayed, and uses RGBA8888 color. // Configure it so that it is opaque, does not retain the contents of the backbuffer when displayed, and uses RGBA8888 color.
self.opaque = YES; self.opaque = YES;
self.drawableProperties = [NSDictionary self.drawableProperties = [NSDictionary
@ -87,8 +88,6 @@
kEAGLDrawablePropertyColorFormat, kEAGLDrawablePropertyColorFormat,
nil]; nil];
// FIXME: Add Vulkan support via MoltenVK. Add fallback code back?
// Create GL ES 3 context // Create GL ES 3 context
if (GLOBAL_GET("rendering/renderer/rendering_method") == "gl_compatibility") { if (GLOBAL_GET("rendering/renderer/rendering_method") == "gl_compatibility") {
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
@ -115,8 +114,22 @@
[self createFramebuffer]; [self createFramebuffer];
} }
- (void)renderDisplayLayer { - (void)startRenderDisplayLayer {
[EAGLContext setCurrentContext:context]; [EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
}
- (void)stopRenderDisplayLayer {
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
#ifdef DEBUG_ENABLED
GLenum err = glGetError();
if (err) {
NSLog(@"DrawView: %x error", err);
}
#endif
} }
- (void)dealloc { - (void)dealloc {
@ -154,11 +167,15 @@
return NO; return NO;
} }
GLES3::TextureStorage::system_fbo = viewFramebuffer;
return YES; return YES;
} }
// Clean up any buffers we have allocated. // Clean up any buffers we have allocated.
- (void)destroyFramebuffer { - (void)destroyFramebuffer {
GLES3::TextureStorage::system_fbo = 0;
glDeleteFramebuffersOES(1, &viewFramebuffer); glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0; viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer); glDeleteRenderbuffersOES(1, &viewRenderbuffer);

View file

@ -47,6 +47,10 @@
#endif #endif
#endif #endif
#if defined(GLES3_ENABLED)
#include "drivers/gles3/rasterizer_gles3.h"
#endif // GLES3_ENABLED
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <QuartzCore/CAMetalLayer.h> #import <QuartzCore/CAMetalLayer.h>
@ -216,6 +220,7 @@ public:
virtual bool screen_is_kept_on() const override; virtual bool screen_is_kept_on() const override;
void resize_window(CGSize size); void resize_window(CGSize size);
virtual void swap_buffers() override {}
}; };
#endif // DISPLAY_SERVER_IOS_H #endif // DISPLAY_SERVER_IOS_H

View file

@ -55,28 +55,7 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode
// Init TTS // Init TTS
tts = [[TTS_IOS alloc] init]; tts = [[TTS_IOS alloc] init];
#if defined(GLES3_ENABLED)
if (rendering_driver == "opengl3") {
bool gl_initialization_error = false;
if (RasterizerGLES3::is_viable() == OK) {
RasterizerGLES3::register_config();
RasterizerGLES3::make_current();
} else {
gl_initialization_error = true;
}
if (gl_initialization_error) {
OS::get_singleton()->alert(
"Your device seems not to support the required OpenGL ES 3.0 version.\n\n",
"Unable to initialize OpenGL video driver");
}
}
#endif
#if defined(VULKAN_ENABLED) #if defined(VULKAN_ENABLED)
rendering_driver = "vulkan";
context_vulkan = nullptr; context_vulkan = nullptr;
rendering_device_vulkan = nullptr; rendering_device_vulkan = nullptr;
@ -91,13 +70,14 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode
CALayer *layer = [AppDelegate.viewController.godotView initializeRenderingForDriver:@"vulkan"]; CALayer *layer = [AppDelegate.viewController.godotView initializeRenderingForDriver:@"vulkan"];
if (!layer) { if (!layer) {
ERR_FAIL_MSG("Failed to create iOS rendering layer."); ERR_FAIL_MSG("Failed to create iOS Vulkan rendering layer.");
} }
Size2i size = Size2i(layer.bounds.size.width, layer.bounds.size.height) * screen_get_max_scale(); Size2i size = Size2i(layer.bounds.size.width, layer.bounds.size.height) * screen_get_max_scale();
if (context_vulkan->window_create(MAIN_WINDOW_ID, p_vsync_mode, layer, size.width, size.height) != OK) { if (context_vulkan->window_create(MAIN_WINDOW_ID, p_vsync_mode, layer, size.width, size.height) != OK) {
memdelete(context_vulkan); memdelete(context_vulkan);
context_vulkan = nullptr; context_vulkan = nullptr;
r_error = ERR_UNAVAILABLE;
ERR_FAIL_MSG("Failed to create Vulkan window."); ERR_FAIL_MSG("Failed to create Vulkan window.");
} }
@ -108,6 +88,18 @@ DisplayServerIOS::DisplayServerIOS(const String &p_rendering_driver, WindowMode
} }
#endif #endif
#if defined(GLES3_ENABLED)
if (rendering_driver == "opengl3") {
CALayer *layer = [AppDelegate.viewController.godotView initializeRenderingForDriver:@"opengl3"];
if (!layer) {
ERR_FAIL_MSG("Failed to create iOS OpenGLES rendering layer.");
}
RasterizerGLES3::make_current();
}
#endif
bool keep_screen_on = bool(GLOBAL_GET("display/window/energy_saving/keep_screen_on")); bool keep_screen_on = bool(GLOBAL_GET("display/window/energy_saving/keep_screen_on"));
screen_set_keep_on(keep_screen_on); screen_set_keep_on(keep_screen_on);
@ -670,15 +662,18 @@ void DisplayServerIOS::resize_window(CGSize viewSize) {
void DisplayServerIOS::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) { void DisplayServerIOS::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) {
_THREAD_SAFE_METHOD_ _THREAD_SAFE_METHOD_
#if defined(VULKAN_ENABLED) #if defined(VULKAN_ENABLED)
context_vulkan->set_vsync_mode(p_window, p_vsync_mode); if (context_vulkan) {
context_vulkan->set_vsync_mode(p_window, p_vsync_mode);
}
#endif #endif
} }
DisplayServer::VSyncMode DisplayServerIOS::window_get_vsync_mode(WindowID p_window) const { DisplayServer::VSyncMode DisplayServerIOS::window_get_vsync_mode(WindowID p_window) const {
_THREAD_SAFE_METHOD_ _THREAD_SAFE_METHOD_
#if defined(VULKAN_ENABLED) #if defined(VULKAN_ENABLED)
return context_vulkan->get_vsync_mode(p_window); if (context_vulkan) {
#else return context_vulkan->get_vsync_mode(p_window);
return DisplayServer::VSYNC_ENABLED; }
#endif #endif
return DisplayServer::VSYNC_ENABLED;
} }

View file

@ -74,16 +74,20 @@ static const float earth_gravity = 9.80665;
CALayer<DisplayLayer> *layer; CALayer<DisplayLayer> *layer;
if ([driverName isEqualToString:@"vulkan"]) { if ([driverName isEqualToString:@"vulkan"]) {
#if defined(TARGET_OS_SIMULATOR) && TARGET_OS_SIMULATOR
if (@available(iOS 13, *)) {
layer = [GodotMetalLayer layer];
} else {
return nil;
}
#else
layer = [GodotMetalLayer layer]; layer = [GodotMetalLayer layer];
#endif
} else if ([driverName isEqualToString:@"opengl3"]) { } else if ([driverName isEqualToString:@"opengl3"]) {
if (@available(iOS 13, *)) { if (@available(iOS 13, *)) {
NSLog(@"OpenGL ES is deprecated on iOS 13"); NSLog(@"OpenGL ES is deprecated on iOS 13");
} }
#if defined(TARGET_OS_SIMULATOR) && TARGET_OS_SIMULATOR
return nil;
#else
layer = [GodotOpenGLLayer layer]; layer = [GodotOpenGLLayer layer];
#endif
} else { } else {
return nil; return nil;
} }
@ -238,7 +242,7 @@ static const float earth_gravity = 9.80665;
[self.displayLink setPaused:NO]; [self.displayLink setPaused:NO];
} }
[self.renderingLayer renderDisplayLayer]; [self.renderingLayer startRenderDisplayLayer];
if (!self.renderer) { if (!self.renderer) {
return; return;
@ -258,6 +262,8 @@ static const float earth_gravity = 9.80665;
[self handleMotion]; [self handleMotion];
[self.renderer renderOnView:self]; [self.renderer renderOnView:self];
[self.renderingLayer stopRenderDisplayLayer];
} }
- (BOOL)canRender { - (BOOL)canRender {

View file

@ -230,7 +230,7 @@ def configure(env: "Environment"):
env.Append(LIBS=["pthread", "z"]) env.Append(LIBS=["pthread", "z"])
if env["opengl3"]: if env["opengl3"]:
env.Append(CPPDEFINES=["GLES_ENABLED", "GLES3_ENABLED"]) env.Append(CPPDEFINES=["GLES3_ENABLED"])
env.Append(LINKFLAGS=["-framework", "OpenGL"]) env.Append(LINKFLAGS=["-framework", "OpenGL"])
env.Append(LINKFLAGS=["-rpath", "@executable_path/../Frameworks", "-rpath", "@executable_path"]) env.Append(LINKFLAGS=["-rpath", "@executable_path/../Frameworks", "-rpath", "@executable_path"])

View file

@ -3142,7 +3142,9 @@ ObjectID DisplayServerMacOS::window_get_attached_instance_id(WindowID p_window)
void DisplayServerMacOS::gl_window_make_current(DisplayServer::WindowID p_window_id) { void DisplayServerMacOS::gl_window_make_current(DisplayServer::WindowID p_window_id) {
#if defined(GLES3_ENABLED) #if defined(GLES3_ENABLED)
gl_manager->window_make_current(p_window_id); if (gl_manager) {
gl_manager->window_make_current(p_window_id);
}
#endif #endif
} }