Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
195 lines (157 loc) · 6.99 KB

SDL_uikitopenglview.m

File metadata and controls

195 lines (157 loc) · 6.99 KB
 
Jun 22, 2011
Jun 22, 2011
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
Simple DirectMedia Layer
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/EAGLDrawable.h>
#import "SDL_uikitopenglview.h"
@implementation SDL_uikitopenglview
@synthesize context;
Sep 27, 2011
Sep 27, 2011
31
32
+ (Class)layerClass
{
Jun 22, 2011
Jun 22, 2011
33
34
35
return [CAEAGLLayer class];
}
Sep 27, 2011
Sep 27, 2011
36
37
38
39
40
41
42
- (id)initWithFrame:(CGRect)frame
retainBacking:(BOOL)retained
rBits:(int)rBits
gBits:(int)gBits
bBits:(int)bBits
aBits:(int)aBits
depthBits:(int)depthBits
Oct 22, 2011
Oct 22, 2011
43
stencilBits:(int)stencilBits
Sep 27, 2011
Sep 27, 2011
44
majorVersion:(int)majorVersion
Jun 22, 2011
Jun 22, 2011
45
46
47
{
depthBufferFormat = 0;
Oct 24, 2011
Oct 24, 2011
48
49
50
51
52
53
54
55
56
57
58
if ((self = [super initWithFrame:frame])) {
const BOOL useStencilBuffer = (stencilBits != 0);
const BOOL useDepthBuffer = (depthBits != 0);
NSString *colorFormat = nil;
if (rBits == 8 && gBits == 8 && bBits == 8) {
/* if user specifically requests rbg888 or some color format higher than 16bpp */
colorFormat = kEAGLColorFormatRGBA8;
} else {
/* default case (faster) */
colorFormat = kEAGLColorFormatRGB565;
Oct 22, 2011
Oct 22, 2011
59
}
Sep 27, 2011
Sep 27, 2011
60
Oct 24, 2011
Oct 24, 2011
61
/* Get the layer */
Jun 22, 2011
Jun 22, 2011
62
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
Sep 27, 2011
Sep 27, 2011
63
Jun 22, 2011
Jun 22, 2011
64
65
66
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool: retained], kEAGLDrawablePropertyRetainedBacking, colorFormat, kEAGLDrawablePropertyColorFormat, nil];
Sep 27, 2011
Sep 27, 2011
67
Jun 22, 2011
Jun 22, 2011
68
69
70
71
72
73
74
75
76
if (majorVersion > 1) {
context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
} else {
context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
}
if (!context || ![EAGLContext setCurrentContext:context]) {
[self release];
return nil;
}
Sep 27, 2011
Sep 27, 2011
77
Jun 22, 2011
Jun 22, 2011
78
79
80
/* create the buffers */
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
Sep 27, 2011
Sep 27, 2011
81
Jun 22, 2011
Jun 22, 2011
82
83
84
85
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
Sep 27, 2011
Sep 27, 2011
86
Jun 22, 2011
Jun 22, 2011
87
88
89
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
Oct 22, 2011
Oct 22, 2011
90
91
if ((useDepthBuffer) || (useStencilBuffer)) {
if (useStencilBuffer) {
Oct 24, 2011
Oct 24, 2011
92
/* Apparently you need to pack stencil and depth into one buffer. */
Oct 22, 2011
Oct 22, 2011
93
depthBufferFormat = GL_DEPTH24_STENCIL8_OES;
Oct 24, 2011
Oct 24, 2011
94
95
96
} else if (useDepthBuffer) {
/* iOS only has 24-bit depth buffers, even with GL_DEPTH_COMPONENT16_OES */
depthBufferFormat = GL_DEPTH_COMPONENT24_OES;
Oct 22, 2011
Oct 22, 2011
97
}
Oct 24, 2011
Oct 24, 2011
98
Jun 22, 2011
Jun 22, 2011
99
100
101
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthBufferFormat, backingWidth, backingHeight);
Oct 22, 2011
Oct 22, 2011
102
103
104
105
106
107
if (useDepthBuffer) {
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
if (useStencilBuffer) {
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
Jun 22, 2011
Jun 22, 2011
108
}
Sep 27, 2011
Sep 27, 2011
109
Sep 27, 2011
Sep 27, 2011
110
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
Jun 22, 2011
Jun 22, 2011
111
112
113
114
115
116
117
118
119
120
121
122
123
124
return NO;
}
/* end create buffers */
// !!! FIXME: use the screen this is on!
/* Use the main screen scale (for retina display support) */
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
self.contentScaleFactor = [UIScreen mainScreen].scale;
self.autoresizingMask = 0; // don't allow autoresize, since we need to do some magic in -(void)updateFrame.
}
return self;
}
Sep 27, 2011
Sep 27, 2011
125
126
- (void)updateFrame
{
Jun 22, 2011
Jun 22, 2011
127
128
129
130
131
132
133
134
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, 0);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, 0);
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
Sep 27, 2011
Sep 27, 2011
135
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
Jun 22, 2011
Jun 22, 2011
136
137
138
139
140
141
142
143
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
if (depthRenderbuffer != 0) {
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthBufferFormat, backingWidth, backingHeight);
}
Sep 27, 2011
Sep 27, 2011
144
Jun 22, 2011
Jun 22, 2011
145
146
147
148
149
150
// !!! FIXME: use the screen this is on!
/* Use the main screen scale (for retina display support) */
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
self.contentScaleFactor = [UIScreen mainScreen].scale;
}
Sep 27, 2011
Sep 27, 2011
151
152
- (void)setCurrentContext
{
Jun 22, 2011
Jun 22, 2011
153
154
155
156
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
157
158
- (void)swapBuffers
{
Jun 22, 2011
Jun 22, 2011
159
160
161
162
163
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
Sep 27, 2011
Sep 27, 2011
164
165
- (void)layoutSubviews
{
Jun 22, 2011
Jun 22, 2011
166
167
168
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
169
170
- (void)destroyFramebuffer
{
Jun 22, 2011
Jun 22, 2011
171
172
173
174
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;
Sep 27, 2011
Sep 27, 2011
175
Jun 22, 2011
Jun 22, 2011
176
177
178
179
180
181
182
if (depthRenderbuffer) {
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}
Sep 27, 2011
Sep 27, 2011
183
184
- (void)dealloc
{
Jun 22, 2011
Jun 22, 2011
185
186
187
188
[self destroyFramebuffer];
if ([EAGLContext currentContext] == context) {
[EAGLContext setCurrentContext:nil];
}
Sep 27, 2011
Sep 27, 2011
189
[context release];
Jun 22, 2011
Jun 22, 2011
190
191
192
193
194
195
[super dealloc];
}
@end
/* vi: set ts=4 sw=4 expandtab: */