This commit is contained in:
Juan Linietsky 2015-10-25 20:09:18 -03:00
commit bd736e5af2
7 changed files with 80 additions and 85 deletions

View file

@ -236,6 +236,8 @@ static int frame_count = 0;
view_controller.view = glView; view_controller.view = glView;
window.rootViewController = view_controller; window.rootViewController = view_controller;
glView.useCADisplayLink = bool(GLOBAL_DEF("display.iOS/use_cadisplaylink",true)) ? YES : NO;
printf("cadisaplylink: %d", glView.useCADisplayLink);
glView.animationInterval = 1.0 / kRenderingFrequency; glView.animationInterval = 1.0 / kRenderingFrequency;
[glView startAnimation]; [glView startAnimation];

View file

@ -34,8 +34,6 @@
#import <MediaPlayer/MediaPlayer.h> #import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVFoundation.h>
#define USE_CADISPLAYLINK 0 //iOS version 3.1+ is required
@protocol GLViewDelegate; @protocol GLViewDelegate;
@interface GLView : UIView<UIKeyInput> @interface GLView : UIView<UIKeyInput>
@ -53,13 +51,13 @@
// OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) // OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist)
GLuint depthRenderbuffer; GLuint depthRenderbuffer;
#if USE_CADISPLAYLINK BOOL useCADisplayLink;
// CADisplayLink available on 3.1+ synchronizes the animation timer & drawing with the refresh rate of the display, only supports animation intervals of 1/60 1/30 & 1/15 // CADisplayLink available on 3.1+ synchronizes the animation timer & drawing with the refresh rate of the display, only supports animation intervals of 1/60 1/30 & 1/15
CADisplayLink *displayLink; CADisplayLink *displayLink;
#else
// An animation timer that, when animation is started, will periodically call -drawView at the given rate. // An animation timer that, when animation is started, will periodically call -drawView at the given rate.
// Only used if CADisplayLink is not
NSTimer *animationTimer; NSTimer *animationTimer;
#endif
NSTimeInterval animationInterval; NSTimeInterval animationInterval;
@ -104,6 +102,7 @@
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification; - (void)audioRouteChangeListenerCallback:(NSNotification*)notification;
@property NSTimeInterval animationInterval; @property NSTimeInterval animationInterval;
@property(nonatomic, assign) BOOL useCADisplayLink;
@end @end

View file

@ -334,13 +334,15 @@ static void clear_touches() {
delegateSetup = ![delegate respondsToSelector:@selector(setupView:)]; delegateSetup = ![delegate respondsToSelector:@selector(setupView:)];
} }
@synthesize useCADisplayLink;
// If our view is resized, we'll be asked to layout subviews. // If our view is resized, we'll be asked to layout subviews.
// This is the perfect opportunity to also update the framebuffer so that it is // This is the perfect opportunity to also update the framebuffer so that it is
// the same size as our display area. // the same size as our display area.
-(void)layoutSubviews -(void)layoutSubviews
{ {
printf("HERE\n"); //printf("HERE\n");
[EAGLContext setCurrentContext:context]; [EAGLContext setCurrentContext:context];
[self destroyFramebuffer]; [self destroyFramebuffer];
[self createFramebuffer]; [self createFramebuffer];
@ -418,7 +420,8 @@ static void clear_touches() {
return; return;
active = TRUE; active = TRUE;
printf("start animation!\n"); printf("start animation!\n");
#if USE_CADISPLAYLINK if (useCADisplayLink) {
// Approximate frame rate // Approximate frame rate
// assumes device refreshes at 60 fps // assumes device refreshes at 60 fps
int frameInterval = (int) floor(animationInterval * 60.0f); int frameInterval = (int) floor(animationInterval * 60.0f);
@ -428,9 +431,10 @@ static void clear_touches() {
// Setup DisplayLink in main thread // Setup DisplayLink in main thread
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
#else }
else {
animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES]; animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES];
#endif }
if (video_playing) if (video_playing)
{ {
@ -444,13 +448,16 @@ static void clear_touches() {
return; return;
active = FALSE; active = FALSE;
printf("******** stop animation!\n"); printf("******** stop animation!\n");
#if USE_CADISPLAYLINK
if (useCADisplayLink) {
[displayLink invalidate]; [displayLink invalidate];
displayLink = nil; displayLink = nil;
#else }
else {
[animationTimer invalidate]; [animationTimer invalidate];
animationTimer = nil; animationTimer = nil;
#endif }
clear_touches(); clear_touches();
if (video_playing) if (video_playing)
@ -462,13 +469,7 @@ static void clear_touches() {
- (void)setAnimationInterval:(NSTimeInterval)interval - (void)setAnimationInterval:(NSTimeInterval)interval
{ {
animationInterval = interval; animationInterval = interval;
if ( (useCADisplayLink && displayLink) || ( !useCADisplayLink && animationTimer ) ) {
#if USE_CADISPLAYLINK
if(displayLink)
#else
if(animationTimer)
#endif
{
[self stopAnimation]; [self stopAnimation];
[self startAnimation]; [self startAnimation];
} }
@ -477,7 +478,7 @@ static void clear_touches() {
// Updates the OpenGL view when the timer fires // Updates the OpenGL view when the timer fires
- (void)drawView - (void)drawView
{ {
#if USE_CADISPLAYLINK if (useCADisplayLink) {
// Pause the CADisplayLink to avoid recursion // Pause the CADisplayLink to avoid recursion
[displayLink setPaused: YES]; [displayLink setPaused: YES];
@ -486,7 +487,7 @@ static void clear_touches() {
// We are good to go, resume the CADisplayLink // We are good to go, resume the CADisplayLink
[displayLink setPaused: NO]; [displayLink setPaused: NO];
#endif }
if (!active) { if (!active) {
printf("draw view not active!\n"); printf("draw view not active!\n");
@ -632,7 +633,7 @@ static void clear_touches() {
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable: case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
NSLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable"); NSLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
NSLog(@"Headphone/Line was pulled. Resuming video play...."); NSLog(@"Headphone/Line was pulled. Resuming video play....");
if (_is_video_playing) { if (_is_video_playing()) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[_instance.avPlayer play]; // NOTE: change this line according your current player implementation [_instance.avPlayer play]; // NOTE: change this line according your current player implementation

1
platform/iphone/globals/global_defaults.cpp Normal file → Executable file
View file

@ -9,4 +9,5 @@ void register_iphone_global_defaults() {
GLOBAL_DEF("rasterizer.iOS/fp16_framebuffer",false); GLOBAL_DEF("rasterizer.iOS/fp16_framebuffer",false);
GLOBAL_DEF("display.iOS/driver","GLES2"); GLOBAL_DEF("display.iOS/driver","GLES2");
Globals::get_singleton()->set_custom_property_info("display.iOS/driver",PropertyInfo(Variant::STRING,"display.iOS/driver",PROPERTY_HINT_ENUM,"GLES1,GLES2")); Globals::get_singleton()->set_custom_property_info("display.iOS/driver",PropertyInfo(Variant::STRING,"display.iOS/driver",PROPERTY_HINT_ENUM,"GLES1,GLES2"));
GLOBAL_DEF("display.iOS/use_cadisplaylink",true);
} }

View file

@ -46,7 +46,6 @@ struct ContextGL_X11_Private {
::GLXContext glx_context; ::GLXContext glx_context;
}; };
void ContextGL_X11::release_current() { void ContextGL_X11::release_current() {
glXMakeCurrent(x11_display, None, NULL); glXMakeCurrent(x11_display, None, NULL);
@ -56,10 +55,12 @@ void ContextGL_X11::make_current() {
glXMakeCurrent(x11_display, x11_window, p->glx_context); glXMakeCurrent(x11_display, x11_window, p->glx_context);
} }
void ContextGL_X11::swap_buffers() { void ContextGL_X11::swap_buffers() {
glXSwapBuffers(x11_display,x11_window); glXSwapBuffers(x11_display,x11_window);
} }
/* /*
static GLWrapperFuncPtr wrapper_get_proc_address(const char* p_function) { static GLWrapperFuncPtr wrapper_get_proc_address(const char* p_function) {
@ -154,6 +155,9 @@ Error ContextGL_X11::initialize() {
*/ */
//glXMakeCurrent(x11_display, None, NULL); //glXMakeCurrent(x11_display, None, NULL);
XFree( vi );
XFree( fbc );
return OK; return OK;
} }
@ -164,12 +168,12 @@ int ContextGL_X11::get_window_width() {
return xwa.width; return xwa.width;
} }
int ContextGL_X11::get_window_height() { int ContextGL_X11::get_window_height() {
XWindowAttributes xwa; XWindowAttributes xwa;
XGetWindowAttributes(x11_display,x11_window,&xwa); XGetWindowAttributes(x11_display,x11_window,&xwa);
return xwa.height; return xwa.height;
} }
@ -189,6 +193,8 @@ ContextGL_X11::ContextGL_X11(::Display *p_x11_display,::Window &p_x11_window,con
ContextGL_X11::~ContextGL_X11() { ContextGL_X11::~ContextGL_X11() {
release_current();
glXDestroyContext( x11_display, p->glx_context );
memdelete( p ); memdelete( p );
} }

View file

@ -73,20 +73,18 @@
#undef CursorShape #undef CursorShape
int OS_X11::get_video_driver_count() const { int OS_X11::get_video_driver_count() const {
return 1; return 1;
} }
const char * OS_X11::get_video_driver_name(int p_driver) const {
const char * OS_X11::get_video_driver_name(int p_driver) const {
return "GLES2"; return "GLES2";
} }
OS::VideoMode OS_X11::get_default_video_mode() const {
OS::VideoMode OS_X11::get_default_video_mode() const {
return OS::VideoMode(800,600,false); return OS::VideoMode(800,600,false);
} }
int OS_X11::get_audio_driver_count() const { int OS_X11::get_audio_driver_count() const {
return AudioDriverManagerSW::get_driver_count(); return AudioDriverManagerSW::get_driver_count();
} }
@ -153,6 +151,7 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
XFree (xim_styles); XFree (xim_styles);
} }
XFree( imvalret );
} }
/* /*
@ -256,7 +255,6 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
} }
#endif #endif
AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton(); AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton();
audio_driver_index=p_audio_driver; audio_driver_index=p_audio_driver;
@ -351,6 +349,7 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
for(int i=0;i<CURSOR_MAX;i++) { for(int i=0;i<CURSOR_MAX;i++) {
cursors[i]=None; cursors[i]=None;
img[i]=NULL;
} }
current_cursor=CURSOR_ARROW; current_cursor=CURSOR_ARROW;
@ -379,16 +378,15 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
"question_arrow" "question_arrow"
}; };
XcursorImage *img = XcursorLibraryLoadImage(cursor_file[i],cursor_theme,cursor_size); img[i] = XcursorLibraryLoadImage(cursor_file[i],cursor_theme,cursor_size);
if (img) { if (img[i]) {
cursors[i]=XcursorImageLoadCursor(x11_display,img); cursors[i]=XcursorImageLoadCursor(x11_display,img[i]);
//print_line("found cursor: "+String(cursor_file[i])+" id "+itos(cursors[i])); //print_line("found cursor: "+String(cursor_file[i])+" id "+itos(cursors[i]));
} else { } else {
if (OS::is_stdout_verbose()) if (OS::is_stdout_verbose())
print_line("failed cursor: "+String(cursor_file[i])); print_line("failed cursor: "+String(cursor_file[i]));
} }
} }
} }
@ -437,14 +435,8 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
probe_joystick(); probe_joystick();
_ensure_data_dir(); _ensure_data_dir();
net_wm_icon = XInternAtom(x11_display, "_NET_WM_ICON", False);
//printf("got map notify\n");
} }
void OS_X11::finalize() { void OS_X11::finalize() {
if(main_loop) if(main_loop)
@ -476,15 +468,27 @@ void OS_X11::finalize() {
memdelete(input); memdelete(input);
XUnmapWindow( x11_display, x11_window );
XDestroyWindow( x11_display, x11_window );
#if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED) #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
memdelete(context_gl); memdelete(context_gl);
#endif #endif
for(int i=0;i<CURSOR_MAX;i++) {
if( cursors[i] != None )
XFreeCursor( x11_display, cursors[i] );
if( img[i] != NULL )
XcursorImageDestroy( img[i] );
};
XDestroyIC( xic );
XCloseIM( xim );
XCloseDisplay(x11_display); XCloseDisplay(x11_display);
if (xmbstring) if (xmbstring)
memfree(xmbstring); memfree(xmbstring);
args.clear(); args.clear();
} }
@ -559,37 +563,29 @@ void OS_X11::warp_mouse_pos(const Point2& p_to) {
} }
OS::MouseMode OS_X11::get_mouse_mode() const { OS::MouseMode OS_X11::get_mouse_mode() const {
return mouse_mode; return mouse_mode;
} }
int OS_X11::get_mouse_button_state() const { int OS_X11::get_mouse_button_state() const {
return last_button_state; return last_button_state;
} }
Point2 OS_X11::get_mouse_pos() const { Point2 OS_X11::get_mouse_pos() const {
return last_mouse_pos; return last_mouse_pos;
} }
void OS_X11::set_window_title(const String& p_title) { void OS_X11::set_window_title(const String& p_title) {
XStoreName(x11_display,x11_window,p_title.utf8().get_data()); XStoreName(x11_display,x11_window,p_title.utf8().get_data());
} }
void OS_X11::set_video_mode(const VideoMode& p_video_mode,int p_screen) { void OS_X11::set_video_mode(const VideoMode& p_video_mode,int p_screen) {
} }
OS::VideoMode OS_X11::get_video_mode(int p_screen) const {
OS::VideoMode OS_X11::get_video_mode(int p_screen) const {
return current_videomode; return current_videomode;
} }
void OS_X11::get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) const { void OS_X11::get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) const {
} }
//#ifdef NEW_WM_API //#ifdef NEW_WM_API
@ -672,7 +668,6 @@ void OS_X11::set_current_screen(int p_screen) {
} }
Point2 OS_X11::get_screen_position(int p_screen) const { Point2 OS_X11::get_screen_position(int p_screen) const {
// Using Xinerama Extension // Using Xinerama Extension
int event_base, error_base; int event_base, error_base;
const Bool ext_okay = XineramaQueryExtension(x11_display, &event_base, &error_base); const Bool ext_okay = XineramaQueryExtension(x11_display, &event_base, &error_base);
@ -708,7 +703,6 @@ Size2 OS_X11::get_screen_size(int p_screen) const {
return size; return size;
} }
Point2 OS_X11::get_window_position() const { Point2 OS_X11::get_window_position() const {
int x,y; int x,y;
Window child; Window child;
@ -896,7 +890,6 @@ void OS_X11::set_window_maximized(bool p_enabled) {
current_videomode.height = xwa.height; current_videomode.height = xwa.height;
*/ */
maximized = p_enabled; maximized = p_enabled;
} }
bool OS_X11::is_window_maximized() const { bool OS_X11::is_window_maximized() const {
@ -993,7 +986,6 @@ unsigned int OS_X11::get_mouse_button_state(unsigned int p_x11_state) {
void OS_X11::handle_key_event(XKeyEvent *p_event, bool p_echo) { void OS_X11::handle_key_event(XKeyEvent *p_event, bool p_echo) {
// X11 functions don't know what const is // X11 functions don't know what const is
XKeyEvent *xkeyevent = p_event; XKeyEvent *xkeyevent = p_event;
@ -1158,8 +1150,6 @@ void OS_X11::handle_key_event(XKeyEvent *p_event, bool p_echo) {
//printf("key: %x\n",event.key.scancode); //printf("key: %x\n",event.key.scancode);
input->parse_input_event( event); input->parse_input_event( event);
} }
void OS_X11::process_xevents() { void OS_X11::process_xevents() {
@ -1861,7 +1851,6 @@ void OS_X11::set_cursor_shape(CursorShape p_shape) {
XDefineCursor(x11_display,x11_window,cursors[CURSOR_ARROW]); XDefineCursor(x11_display,x11_window,cursors[CURSOR_ARROW]);
} }
current_cursor=p_shape; current_cursor=p_shape;
} }
@ -1894,6 +1883,8 @@ void OS_X11::alert(const String& p_alert,const String& p_title) {
} }
void OS_X11::set_icon(const Image& p_icon) { void OS_X11::set_icon(const Image& p_icon) {
Atom net_wm_icon = XInternAtom(x11_display, "_NET_WM_ICON", False);
if (!p_icon.empty()) { if (!p_icon.empty()) {
Image img=p_icon; Image img=p_icon;
img.convert(Image::FORMAT_RGBA); img.convert(Image::FORMAT_RGBA);
@ -1926,7 +1917,6 @@ void OS_X11::set_icon(const Image& p_icon) {
XDeleteProperty(x11_display, x11_window, net_wm_icon); XDeleteProperty(x11_display, x11_window, net_wm_icon);
} }
XFlush(x11_display); XFlush(x11_display);
} }

View file

@ -119,6 +119,7 @@ class OS_X11 : public OS_Unix {
const char *cursor_theme; const char *cursor_theme;
int cursor_size; int cursor_size;
XcursorImage *img[CURSOR_MAX];
Cursor cursors[CURSOR_MAX]; Cursor cursors[CURSOR_MAX];
Cursor null_cursor; Cursor null_cursor;
CursorShape current_cursor; CursorShape current_cursor;
@ -155,12 +156,7 @@ class OS_X11 : public OS_Unix {
}; };
}; };
}; };
Atom net_wm_icon;
int joystick_count; int joystick_count;
Joystick joysticks[JOYSTICKS_MAX]; Joystick joysticks[JOYSTICKS_MAX];
int audio_driver_index; int audio_driver_index;