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

Latest commit

 

History

History
205 lines (164 loc) · 6.83 KB

SDL_uikitopenglview.m

File metadata and controls

205 lines (164 loc) · 6.83 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
31
32
33
34
35
36
37
/*
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"
@interface SDL_uikitopenglview (privateMethods)
- (BOOL) createFramebuffer;
- (void) destroyFramebuffer;
@end
@implementation SDL_uikitopenglview
@synthesize context;
Sep 27, 2011
Sep 27, 2011
38
39
+ (Class)layerClass
{
Jun 22, 2011
Jun 22, 2011
40
41
42
return [CAEAGLLayer class];
}
Sep 27, 2011
Sep 27, 2011
43
44
45
46
47
48
49
50
- (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
51
{
Sep 27, 2011
Sep 27, 2011
52
NSString *colorFormat = nil;
Jun 22, 2011
Jun 22, 2011
53
BOOL useDepthBuffer;
Sep 27, 2011
Sep 27, 2011
54
Jun 22, 2011
Jun 22, 2011
55
56
57
58
59
60
61
62
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
63
Jun 22, 2011
Jun 22, 2011
64
65
66
67
68
69
70
71
72
73
74
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
75
/*
Jun 22, 2011
Jun 22, 2011
76
77
78
79
80
81
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
82
Jun 22, 2011
Jun 22, 2011
83
84
85
if ((self = [super initWithFrame:frame])) {
// Get the layer
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
Sep 27, 2011
Sep 27, 2011
86
Jun 22, 2011
Jun 22, 2011
87
88
89
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool: retained], kEAGLDrawablePropertyRetainedBacking, colorFormat, kEAGLDrawablePropertyColorFormat, nil];
Sep 27, 2011
Sep 27, 2011
90
Jun 22, 2011
Jun 22, 2011
91
92
93
94
95
96
97
98
99
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
100
Jun 22, 2011
Jun 22, 2011
101
102
103
/* create the buffers */
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
Sep 27, 2011
Sep 27, 2011
104
Jun 22, 2011
Jun 22, 2011
105
106
107
108
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
109
Jun 22, 2011
Jun 22, 2011
110
111
112
113
114
115
116
117
118
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
119
Sep 27, 2011
Sep 27, 2011
120
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
Jun 22, 2011
Jun 22, 2011
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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
135
136
- (void)updateFrame
{
Jun 22, 2011
Jun 22, 2011
137
138
139
140
141
142
143
144
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
145
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
Jun 22, 2011
Jun 22, 2011
146
147
148
149
150
151
152
153
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
154
Jun 22, 2011
Jun 22, 2011
155
156
157
158
159
160
// !!! 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
161
162
- (void)setCurrentContext
{
Jun 22, 2011
Jun 22, 2011
163
164
165
166
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
167
168
- (void)swapBuffers
{
Jun 22, 2011
Jun 22, 2011
169
170
171
172
173
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
Sep 27, 2011
Sep 27, 2011
174
175
- (void)layoutSubviews
{
Jun 22, 2011
Jun 22, 2011
176
177
178
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
179
180
- (void)destroyFramebuffer
{
Jun 22, 2011
Jun 22, 2011
181
182
183
184
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;
Sep 27, 2011
Sep 27, 2011
185
Jun 22, 2011
Jun 22, 2011
186
187
188
189
190
191
192
if (depthRenderbuffer) {
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}
Sep 27, 2011
Sep 27, 2011
193
194
- (void)dealloc
{
Jun 22, 2011
Jun 22, 2011
195
196
197
198
[self destroyFramebuffer];
if ([EAGLContext currentContext] == context) {
[EAGLContext setCurrentContext:nil];
}
Sep 27, 2011
Sep 27, 2011
199
[context release];
Jun 22, 2011
Jun 22, 2011
200
201
202
203
204
205
[super dealloc];
}
@end
/* vi: set ts=4 sw=4 expandtab: */