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

Latest commit

 

History

History
207 lines (169 loc) · 7.33 KB

SDL_uikitopenglview.m

File metadata and controls

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