Skip to content

Commit

Permalink
initial commit #2
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenkopylov committed Apr 28, 2016
1 parent c6c5963 commit c89de67
Show file tree
Hide file tree
Showing 70 changed files with 7,967 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcworkspace/xcuserdata/iosDev.xcuserdatad/UserInterfaceState.xcuserstate
34 changes: 34 additions & 0 deletions Classes/SKAsyncGLView.h
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
202 changes: 202 additions & 0 deletions Classes/SKAsyncGLView.m
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
34 changes: 34 additions & 0 deletions Classes/SKAsyncGLViewController.h
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
Loading

0 comments on commit c89de67

Please sign in to comment.