mirror of
https://github.com/godotengine/godot
synced 2024-09-16 01:59:35 +00:00
[iOS] Restore OpenGLES3 renderer support.
This commit is contained in:
parent
cd031fd31a
commit
1cc5524b81
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
|
|
||||||
@protocol DisplayLayer <NSObject>
|
@protocol DisplayLayer <NSObject>
|
||||||
|
|
||||||
- (void)renderDisplayLayer;
|
- (void)startRenderDisplayLayer;
|
||||||
|
- (void)stopRenderDisplayLayer;
|
||||||
- (void)initializeDisplayLayer;
|
- (void)initializeDisplayLayer;
|
||||||
- (void)layoutDisplayLayer;
|
- (void)layoutDisplayLayer;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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"])
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue