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

Latest commit

 

History

History
executable file
·
196 lines (157 loc) · 6.86 KB

SDL_uikitopenglview.m

File metadata and controls

executable file
·
196 lines (157 loc) · 6.86 KB
 
Jun 22, 2011
Jun 22, 2011
1
2
/*
Simple DirectMedia Layer
Dec 31, 2011
Dec 31, 2011
3
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
Jun 22, 2011
Jun 22, 2011
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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.
*/
Oct 31, 2011
Oct 31, 2011
21
22
23
#include "SDL_config.h"
#if SDL_VIDEO_DRIVER_UIKIT
Jun 22, 2011
Jun 22, 2011
24
25
26
27
28
29
30
31
32
33
#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/EAGLDrawable.h>
#import "SDL_uikitopenglview.h"
@implementation SDL_uikitopenglview
@synthesize context;
Sep 27, 2011
Sep 27, 2011
34
35
+ (Class)layerClass
{
Jun 22, 2011
Jun 22, 2011
36
37
38
return [CAEAGLLayer class];
}
Sep 27, 2011
Sep 27, 2011
39
- (id)initWithFrame:(CGRect)frame
Jan 25, 2012
Jan 25, 2012
40
scale:(CGFloat)scale
Sep 27, 2011
Sep 27, 2011
41
42
43
44
45
46
retainBacking:(BOOL)retained
rBits:(int)rBits
gBits:(int)gBits
bBits:(int)bBits
aBits:(int)aBits
depthBits:(int)depthBits
Oct 22, 2011
Oct 22, 2011
47
stencilBits:(int)stencilBits
Sep 27, 2011
Sep 27, 2011
48
majorVersion:(int)majorVersion
Jun 22, 2011
Jun 22, 2011
49
50
51
{
depthBufferFormat = 0;
Oct 24, 2011
Oct 24, 2011
52
53
54
55
56
57
58
59
60
61
62
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
63
}
Sep 27, 2011
Sep 27, 2011
64
Oct 24, 2011
Oct 24, 2011
65
/* Get the layer */
Jun 22, 2011
Jun 22, 2011
66
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
Sep 27, 2011
Sep 27, 2011
67
Jun 22, 2011
Jun 22, 2011
68
69
70
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool: retained], kEAGLDrawablePropertyRetainedBacking, colorFormat, kEAGLDrawablePropertyColorFormat, nil];
Sep 27, 2011
Sep 27, 2011
71
Jun 22, 2011
Jun 22, 2011
72
73
74
75
76
77
78
if (majorVersion > 1) {
context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
} else {
context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
}
if (!context || ![EAGLContext setCurrentContext:context]) {
[self release];
Jan 8, 2012
Jan 8, 2012
79
SDL_SetError("OpenGL ES %d not supported", majorVersion);
Jun 22, 2011
Jun 22, 2011
80
81
return nil;
}
Sep 27, 2011
Sep 27, 2011
82
Jan 25, 2012
Jan 25, 2012
83
/* Set the appropriate scale (for retina display support) */
Jan 7, 2012
Jan 7, 2012
84
if ([self respondsToSelector:@selector(contentScaleFactor)])
Jan 25, 2012
Jan 25, 2012
85
self.contentScaleFactor = scale;
Nov 17, 2011
Nov 17, 2011
86
Jun 22, 2011
Jun 22, 2011
87
88
89
/* create the buffers */
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
Sep 27, 2011
Sep 27, 2011
90
Jun 22, 2011
Jun 22, 2011
91
92
93
94
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
95
Jun 22, 2011
Jun 22, 2011
96
97
98
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
Oct 22, 2011
Oct 22, 2011
99
100
if ((useDepthBuffer) || (useStencilBuffer)) {
if (useStencilBuffer) {
Oct 24, 2011
Oct 24, 2011
101
/* Apparently you need to pack stencil and depth into one buffer. */
Oct 22, 2011
Oct 22, 2011
102
depthBufferFormat = GL_DEPTH24_STENCIL8_OES;
Oct 24, 2011
Oct 24, 2011
103
104
105
} 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
106
}
Oct 24, 2011
Oct 24, 2011
107
Jun 22, 2011
Jun 22, 2011
108
109
110
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthBufferFormat, backingWidth, backingHeight);
Oct 22, 2011
Oct 22, 2011
111
112
113
114
115
116
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
117
}
Sep 27, 2011
Sep 27, 2011
118
Sep 27, 2011
Sep 27, 2011
119
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
Jun 22, 2011
Jun 22, 2011
120
121
122
123
124
125
126
127
128
return NO;
}
/* end create buffers */
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
129
130
- (void)updateFrame
{
Jun 22, 2011
Jun 22, 2011
131
132
133
134
135
136
137
138
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
139
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
Jun 22, 2011
Jun 22, 2011
140
141
142
143
144
145
146
147
148
149
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
150
151
- (void)setCurrentContext
{
Jun 22, 2011
Jun 22, 2011
152
153
154
155
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
156
157
- (void)swapBuffers
{
Jun 22, 2011
Jun 22, 2011
158
159
160
161
162
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
Sep 27, 2011
Sep 27, 2011
163
164
- (void)layoutSubviews
{
Jun 22, 2011
Jun 22, 2011
165
166
167
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
168
169
- (void)destroyFramebuffer
{
Jun 22, 2011
Jun 22, 2011
170
171
172
173
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;
Sep 27, 2011
Sep 27, 2011
174
Jun 22, 2011
Jun 22, 2011
175
176
177
178
179
180
181
if (depthRenderbuffer) {
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}
Sep 27, 2011
Sep 27, 2011
182
183
- (void)dealloc
{
Jun 22, 2011
Jun 22, 2011
184
185
186
187
[self destroyFramebuffer];
if ([EAGLContext currentContext] == context) {
[EAGLContext setCurrentContext:nil];
}
Sep 27, 2011
Sep 27, 2011
188
[context release];
Jun 22, 2011
Jun 22, 2011
189
190
191
192
193
[super dealloc];
}
@end
Oct 31, 2011
Oct 31, 2011
194
195
#endif /* SDL_VIDEO_DRIVER_UIKIT */
Jun 22, 2011
Jun 22, 2011
196
/* vi: set ts=4 sw=4 expandtab: */