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

Latest commit

 

History

History
198 lines (160 loc) · 6.72 KB

SDL_uikitopenglview.m

File metadata and controls

198 lines (160 loc) · 6.72 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
43
- (id)initWithFrame:(CGRect)frame
retainBacking:(BOOL)retained
rBits:(int)rBits
gBits:(int)gBits
bBits:(int)bBits
aBits:(int)aBits
depthBits:(int)depthBits
majorVersion:(int)majorVersion
Jun 22, 2011
Jun 22, 2011
44
{
Sep 27, 2011
Sep 27, 2011
45
NSString *colorFormat = nil;
Jun 22, 2011
Jun 22, 2011
46
BOOL useDepthBuffer;
Sep 27, 2011
Sep 27, 2011
47
Jun 22, 2011
Jun 22, 2011
48
49
50
51
52
53
54
55
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;
}
Sep 27, 2011
Sep 27, 2011
56
Jun 22, 2011
Jun 22, 2011
57
58
59
60
61
62
63
64
65
66
67
depthBufferFormat = 0;
if (depthBits == 24) {
useDepthBuffer = YES;
depthBufferFormat = GL_DEPTH_COMPONENT24_OES;
}
else if (depthBits == 0) {
useDepthBuffer = NO;
}
else {
/* default case when depth buffer is not disabled */
Sep 27, 2011
Sep 27, 2011
68
/*
Jun 22, 2011
Jun 22, 2011
69
70
71
72
73
74
strange, even when we use this, we seem to get a 24 bit depth buffer on iPhone.
perhaps that's the only depth format iPhone actually supports
*/
useDepthBuffer = YES;
depthBufferFormat = GL_DEPTH_COMPONENT16_OES;
}
Sep 27, 2011
Sep 27, 2011
75
Jun 22, 2011
Jun 22, 2011
76
77
78
if ((self = [super initWithFrame:frame])) {
// Get the layer
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
Sep 27, 2011
Sep 27, 2011
79
Jun 22, 2011
Jun 22, 2011
80
81
82
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool: retained], kEAGLDrawablePropertyRetainedBacking, colorFormat, kEAGLDrawablePropertyColorFormat, nil];
Sep 27, 2011
Sep 27, 2011
83
Jun 22, 2011
Jun 22, 2011
84
85
86
87
88
89
90
91
92
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
93
Jun 22, 2011
Jun 22, 2011
94
95
96
/* create the buffers */
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
Sep 27, 2011
Sep 27, 2011
97
Jun 22, 2011
Jun 22, 2011
98
99
100
101
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
102
Jun 22, 2011
Jun 22, 2011
103
104
105
106
107
108
109
110
111
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
if (useDepthBuffer) {
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthBufferFormat, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
Sep 27, 2011
Sep 27, 2011
112
Sep 27, 2011
Sep 27, 2011
113
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
Jun 22, 2011
Jun 22, 2011
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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
128
129
- (void)updateFrame
{
Jun 22, 2011
Jun 22, 2011
130
131
132
133
134
135
136
137
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
138
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
Jun 22, 2011
Jun 22, 2011
139
140
141
142
143
144
145
146
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
147
Jun 22, 2011
Jun 22, 2011
148
149
150
151
152
153
// !!! 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
154
155
- (void)setCurrentContext
{
Jun 22, 2011
Jun 22, 2011
156
157
158
159
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
160
161
- (void)swapBuffers
{
Jun 22, 2011
Jun 22, 2011
162
163
164
165
166
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
Sep 27, 2011
Sep 27, 2011
167
168
- (void)layoutSubviews
{
Jun 22, 2011
Jun 22, 2011
169
170
171
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
172
173
- (void)destroyFramebuffer
{
Jun 22, 2011
Jun 22, 2011
174
175
176
177
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;
Sep 27, 2011
Sep 27, 2011
178
Jun 22, 2011
Jun 22, 2011
179
180
181
182
183
184
185
if (depthRenderbuffer) {
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}
Sep 27, 2011
Sep 27, 2011
186
187
- (void)dealloc
{
Jun 22, 2011
Jun 22, 2011
188
189
190
191
[self destroyFramebuffer];
if ([EAGLContext currentContext] == context) {
[EAGLContext setCurrentContext:nil];
}
Sep 27, 2011
Sep 27, 2011
192
[context release];
Jun 22, 2011
Jun 22, 2011
193
194
195
196
197
198
[super dealloc];
}
@end
/* vi: set ts=4 sw=4 expandtab: */