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
·
195 lines (156 loc) · 6.84 KB

SDL_uikitopenglview.m

File metadata and controls

executable file
·
195 lines (156 loc) · 6.84 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
40
41
42
43
44
45
- (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
46
stencilBits:(int)stencilBits
Sep 27, 2011
Sep 27, 2011
47
majorVersion:(int)majorVersion
Jun 22, 2011
Jun 22, 2011
48
49
50
{
depthBufferFormat = 0;
Oct 24, 2011
Oct 24, 2011
51
52
53
54
55
56
57
58
59
60
61
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
62
}
Sep 27, 2011
Sep 27, 2011
63
Oct 24, 2011
Oct 24, 2011
64
/* Get the layer */
Jun 22, 2011
Jun 22, 2011
65
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
Sep 27, 2011
Sep 27, 2011
66
Jun 22, 2011
Jun 22, 2011
67
68
69
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool: retained], kEAGLDrawablePropertyRetainedBacking, colorFormat, kEAGLDrawablePropertyColorFormat, nil];
Sep 27, 2011
Sep 27, 2011
70
Jun 22, 2011
Jun 22, 2011
71
72
73
74
75
76
77
78
79
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
80
Nov 17, 2011
Nov 17, 2011
81
82
83
84
85
// !!! 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;
Jun 22, 2011
Jun 22, 2011
86
87
88
/* create the buffers */
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
Sep 27, 2011
Sep 27, 2011
89
Jun 22, 2011
Jun 22, 2011
90
91
92
93
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
94
Jun 22, 2011
Jun 22, 2011
95
96
97
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
Oct 22, 2011
Oct 22, 2011
98
99
if ((useDepthBuffer) || (useStencilBuffer)) {
if (useStencilBuffer) {
Oct 24, 2011
Oct 24, 2011
100
/* Apparently you need to pack stencil and depth into one buffer. */
Oct 22, 2011
Oct 22, 2011
101
depthBufferFormat = GL_DEPTH24_STENCIL8_OES;
Oct 24, 2011
Oct 24, 2011
102
103
104
} 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
105
}
Oct 24, 2011
Oct 24, 2011
106
Jun 22, 2011
Jun 22, 2011
107
108
109
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthBufferFormat, backingWidth, backingHeight);
Oct 22, 2011
Oct 22, 2011
110
111
112
113
114
115
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
116
}
Sep 27, 2011
Sep 27, 2011
117
Sep 27, 2011
Sep 27, 2011
118
if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
Jun 22, 2011
Jun 22, 2011
119
120
121
122
123
124
125
126
127
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
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
147
148
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
149
150
- (void)setCurrentContext
{
Jun 22, 2011
Jun 22, 2011
151
152
153
154
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
155
156
- (void)swapBuffers
{
Jun 22, 2011
Jun 22, 2011
157
158
159
160
161
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
Sep 27, 2011
Sep 27, 2011
162
163
- (void)layoutSubviews
{
Jun 22, 2011
Jun 22, 2011
164
165
166
[EAGLContext setCurrentContext:context];
}
Sep 27, 2011
Sep 27, 2011
167
168
- (void)destroyFramebuffer
{
Jun 22, 2011
Jun 22, 2011
169
170
171
172
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;
Sep 27, 2011
Sep 27, 2011
173
Jun 22, 2011
Jun 22, 2011
174
175
176
177
178
179
180
if (depthRenderbuffer) {
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}
Sep 27, 2011
Sep 27, 2011
181
182
- (void)dealloc
{
Jun 22, 2011
Jun 22, 2011
183
184
185
186
[self destroyFramebuffer];
if ([EAGLContext currentContext] == context) {
[EAGLContext setCurrentContext:nil];
}
Sep 27, 2011
Sep 27, 2011
187
[context release];
Jun 22, 2011
Jun 22, 2011
188
189
190
191
192
[super dealloc];
}
@end
Oct 31, 2011
Oct 31, 2011
193
194
#endif /* SDL_VIDEO_DRIVER_UIKIT */
Jun 22, 2011
Jun 22, 2011
195
/* vi: set ts=4 sw=4 expandtab: */