-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c6c5963
commit c89de67
Showing
70 changed files
with
7,967 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcworkspace/xcuserdata/iosDev.xcuserdatad/UserInterfaceState.xcuserstate |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// | ||
// SKAsyncGLView.h | ||
// SKAsyncGLViewController | ||
// | ||
// Created by Stephen Kopylov - Home on 27/04/16. | ||
// Copyright © 2016 test. All rights reserved. | ||
// | ||
|
||
#import <UIKit/UIKit.h> | ||
#import <GLKit/GLKit.h> | ||
|
||
@class SKAsyncGLView; | ||
|
||
@protocol SKAsyncGLViewDelegate <NSObject> | ||
|
||
- (void)createBuffersForView:(SKAsyncGLView *)asyncView; | ||
|
||
- (void)drawInRect:(CGRect)rect; | ||
|
||
- (void)removeBuffersForView:(SKAsyncGLView *)asyncView; | ||
|
||
@end | ||
|
||
@interface SKAsyncGLView : UIView | ||
|
||
@property (nonatomic, strong) dispatch_queue_t renderQueue; | ||
@property (nonatomic) GLuint renderbuffer; | ||
@property (nonatomic) GLuint framebuffer; | ||
|
||
@property (nonatomic, weak) id<SKAsyncGLViewDelegate> delegate; | ||
|
||
- (void)render; | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
// | ||
// SKAsyncGLView.m | ||
// SKAsyncGLViewController | ||
// | ||
// Created by Stephen Kopylov - Home on 27/04/16. | ||
// Copyright © 2016 test. All rights reserved. | ||
// | ||
|
||
#import "SKAsyncGLView.h" | ||
|
||
@interface SKAsyncGLView () | ||
@property (nonatomic, strong) EAGLContext *mainContext; | ||
@property (nonatomic, strong) EAGLContext *renderContext; | ||
@property (nonatomic, getter = isRenderable) BOOL renderable; | ||
@property (nonatomic) BOOL rendering; | ||
@property (nonatomic) BOOL removing; | ||
@end | ||
|
||
@implementation SKAsyncGLView | ||
|
||
+ (Class)layerClass | ||
{ | ||
return [CAEAGLLayer class]; | ||
} | ||
|
||
|
||
- (instancetype)init | ||
{ | ||
self = [super init]; | ||
|
||
if ( self ) { | ||
self.renderQueue = dispatch_queue_create("Render-Queue", DISPATCH_QUEUE_SERIAL); | ||
|
||
((CAEAGLLayer *)self.layer).opaque = NO; | ||
((CAEAGLLayer *)self.layer).contentsScale = [UIScreen mainScreen].scale; | ||
|
||
[self createContexts]; | ||
} | ||
|
||
return self; | ||
} | ||
|
||
|
||
- (void)createContexts | ||
{ | ||
self.mainContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; | ||
dispatch_async(self.renderQueue, ^{ | ||
self.renderContext = [[EAGLContext alloc] initWithAPI:self.mainContext.API sharegroup:self.mainContext.sharegroup]; | ||
dispatch_async(dispatch_get_main_queue(), ^{ | ||
[self createBuffers]; | ||
}); | ||
}); | ||
} | ||
|
||
|
||
- (void)createBuffers | ||
{ | ||
[EAGLContext setCurrentContext:self.mainContext]; | ||
|
||
glGenRenderbuffers(1, &_renderbuffer); | ||
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); | ||
|
||
[self.mainContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; | ||
|
||
dispatch_async(self.renderQueue, ^{ | ||
[EAGLContext setCurrentContext:self.renderContext]; | ||
|
||
glGenFramebuffers(1, &_framebuffer); | ||
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer); | ||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _framebuffer); | ||
|
||
if ( [_delegate respondsToSelector:@selector(createBuffersForView:)] ) { | ||
[_delegate createBuffersForView:self]; | ||
} | ||
|
||
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); | ||
|
||
if ( status == GL_FRAMEBUFFER_COMPLETE ) { | ||
NSLog(@"framebuffer complete"); | ||
} | ||
else if ( status == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT ) { | ||
NSLog(@"incomplete framebuffer attachments"); | ||
} | ||
else if ( status == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT ) { | ||
NSLog(@"incomplete missing framebuffer attachments"); | ||
} | ||
else if ( status == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS ) { | ||
NSLog(@"incomplete framebuffer attachments dimensions"); | ||
} | ||
else if ( status == GL_FRAMEBUFFER_UNSUPPORTED ) { | ||
NSLog(@"combination of internal formats used by attachments in thef ramebuffer results in a nonrednerable target"); | ||
} | ||
}); | ||
} | ||
|
||
|
||
- (void)render | ||
{ | ||
if ( _rendering ) { | ||
return; | ||
} | ||
|
||
if ( !self.renderable ) { | ||
return; | ||
} | ||
|
||
CGFloat width = self.frame.size.width * [UIScreen mainScreen].scale; | ||
CGFloat height = self.frame.size.height * [UIScreen mainScreen].scale; | ||
|
||
dispatch_async(self.renderQueue, ^{ | ||
if ( _rendering ) { | ||
return; | ||
} | ||
|
||
if ( !self.renderable ) { | ||
return; | ||
} | ||
|
||
@synchronized(self) { | ||
_rendering = YES; | ||
} | ||
|
||
[EAGLContext setCurrentContext:self.renderContext]; | ||
|
||
glViewport(0, 0, width, height); | ||
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer); | ||
|
||
CGRect rect = CGRectMake(0, 0, width, height); | ||
|
||
if ( [_delegate respondsToSelector:@selector(drawInRect:)] ) { | ||
[_delegate drawInRect:rect]; | ||
} | ||
|
||
dispatch_async(dispatch_get_main_queue(), ^{ | ||
if ( !self.renderable ) { | ||
return; | ||
} | ||
|
||
[EAGLContext setCurrentContext:self.mainContext]; | ||
glBindFramebuffer(GL_FRAMEBUFFER, _renderbuffer); | ||
glViewport(0, 0, width, height); | ||
|
||
[self.mainContext presentRenderbuffer:_renderbuffer]; | ||
glFlush(); | ||
}); | ||
@synchronized(self) { | ||
_rendering = NO; | ||
} | ||
}); | ||
} | ||
|
||
|
||
- (BOOL)isRenderable | ||
{ | ||
if ( _removing || self.frame.size.width == 0.0f || self.frame.size.height == 0.0f || self.isHidden || [UIApplication sharedApplication].applicationState != UIApplicationStateActive || !self.superview || self.layer.frame.size.width == 0.0f || self.layer.frame.size.height == 0.0f ) { | ||
@synchronized(self) { | ||
_rendering = NO; | ||
} | ||
return NO; | ||
} | ||
|
||
return YES; | ||
} | ||
|
||
|
||
- (void)removeFromSuperview | ||
{ | ||
[super removeFromSuperview]; | ||
|
||
@synchronized(self) { | ||
_removing = YES; | ||
} | ||
|
||
dispatch_async(self.renderQueue, ^{ | ||
[EAGLContext setCurrentContext:self.renderContext]; | ||
|
||
if ( _framebuffer != 0 ) { | ||
glDeleteFramebuffers(1, &_framebuffer); | ||
_framebuffer = 0; | ||
} | ||
|
||
if ( [_delegate respondsToSelector:@selector(removeBuffersForView:)] ) { | ||
[_delegate removeBuffersForView:self]; | ||
} | ||
|
||
_renderContext = nil; | ||
|
||
dispatch_async(dispatch_get_main_queue(), ^{ | ||
[EAGLContext setCurrentContext:self.mainContext]; | ||
|
||
if ( _renderbuffer != 0 ) { | ||
glDeleteRenderbuffers(1, &_renderbuffer); | ||
_renderbuffer = 0; | ||
} | ||
|
||
_mainContext = nil; | ||
}); | ||
}); | ||
} | ||
|
||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// | ||
// SKAsyncGLViewController.h | ||
// SKAsyncGLViewController | ||
// | ||
// Created by Stephen Kopylov - Home on 27/04/16. | ||
// Copyright © 2016 test. All rights reserved. | ||
// | ||
|
||
#import <UIKit/UIKit.h> | ||
#import "SKAsyncGLView.h" | ||
|
||
@class SKAsyncGLViewController; | ||
|
||
@protocol SKAsyncGLViewControllerDelegate <NSObject> | ||
|
||
- (void)setupGL:(SKAsyncGLViewController *)viewController; | ||
|
||
- (void)drawGL:(CGRect)rect; | ||
|
||
- (void)clearGL:(SKAsyncGLViewController *)viewController; | ||
|
||
@end | ||
|
||
@interface SKAsyncGLViewController : UIViewController<SKAsyncGLViewDelegate, SKAsyncGLViewControllerDelegate> | ||
|
||
@property (strong, nonatomic) SKAsyncGLView *view; | ||
|
||
@property (nonatomic) CADisplayLink *displayLink; | ||
|
||
@property (nonatomic) BOOL paused; | ||
|
||
@property (nonatomic, weak) id<SKAsyncGLViewControllerDelegate> delegate; | ||
|
||
@end |
Oops, something went wrong.