21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_UIKIT
25 #include <OpenGLES/EAGLDrawable.h>
26 #include <OpenGLES/ES2/glext.h>
32 GLuint viewRenderbuffer, viewFramebuffer;
43 GLuint msaaFramebuffer, msaaRenderbuffer;
52 @synthesize backingWidth;
53 @synthesize backingHeight;
57 return [CAEAGLLayer class];
60 - (instancetype)initWithFrame:(CGRect)frame
62 retainBacking:(BOOL)retained
67 depthBits:(
int)depthBits
68 stencilBits:(
int)stencilBits
70 multisamples:(
int)multisamples
71 context:(EAGLContext *)glcontext
73 if ((
self = [super initWithFrame:
frame])) {
74 const BOOL useStencilBuffer = (stencilBits != 0);
75 const BOOL useDepthBuffer = (depthBits != 0);
80 retainedBacking = retained;
83 SDL_SetError(
"Could not create OpenGL ES drawable (could not make context current)");
104 }
else if (rBits >= 8 || gBits >= 8 || bBits >= 8 || aBits > 0) {
114 CAEAGLLayer *eaglLayer = (CAEAGLLayer *)
self.
layer;
116 eaglLayer.opaque = YES;
117 eaglLayer.drawableProperties = @{
118 kEAGLDrawablePropertyRetainedBacking:@(retained),
123 self.contentScaleFactor =
scale;
158 glRenderbufferStorageMultisample(
GL_RENDERBUFFER,
samples, colorBufferFormat, backingWidth, backingHeight);
163 if (useDepthBuffer || useStencilBuffer) {
164 if (useStencilBuffer) {
167 }
else if (useDepthBuffer) {
177 glRenderbufferStorageMultisample(
GL_RENDERBUFFER,
samples, depthBufferFormat, backingWidth, backingHeight);
182 if (useDepthBuffer) {
185 if (useStencilBuffer) {
197 [
self setDebugLabels];
203 - (
GLuint)drawableRenderbuffer
205 return viewRenderbuffer;
208 - (
GLuint)drawableFramebuffer
211 if (msaaFramebuffer) {
212 return msaaFramebuffer;
214 return viewFramebuffer;
218 - (
GLuint)msaaResolveFramebuffer
222 if (msaaFramebuffer) {
223 return viewFramebuffer;
231 GLint prevRenderbuffer = 0;
235 [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
240 if (msaaRenderbuffer != 0) {
242 glRenderbufferStorageMultisample(
GL_RENDERBUFFER,
samples, colorBufferFormat, backingWidth, backingHeight);
245 if (depthRenderbuffer != 0) {
249 glRenderbufferStorageMultisample(
GL_RENDERBUFFER,
samples, depthBufferFormat, backingWidth, backingHeight);
258 - (
void)setDebugLabels
260 if (viewFramebuffer != 0) {
261 glLabelObjectEXT(
GL_FRAMEBUFFER, viewFramebuffer, 0,
"context FBO");
264 if (viewRenderbuffer != 0) {
265 glLabelObjectEXT(
GL_RENDERBUFFER, viewRenderbuffer, 0,
"context color buffer");
268 if (depthRenderbuffer != 0) {
270 glLabelObjectEXT(
GL_RENDERBUFFER, depthRenderbuffer, 0,
"context depth-stencil buffer");
272 glLabelObjectEXT(
GL_RENDERBUFFER, depthRenderbuffer, 0,
"context depth buffer");
276 if (msaaFramebuffer != 0) {
277 glLabelObjectEXT(
GL_FRAMEBUFFER, msaaFramebuffer, 0,
"context MSAA FBO");
280 if (msaaRenderbuffer != 0) {
281 glLabelObjectEXT(
GL_RENDERBUFFER, msaaRenderbuffer, 0,
"context MSAA renderbuffer");
287 if (msaaFramebuffer) {
294 if (
context.API >= kEAGLRenderingAPIOpenGLES3) {
295 int w = backingWidth;
296 int h = backingHeight;
299 if (!retainedBacking) {
304 glResolveMultisampleFramebufferAPPLE();
306 if (!retainedBacking) {
319 [context presentRenderbuffer:GL_RENDERBUFFER];
322 - (
void)layoutSubviews
324 [
super layoutSubviews];
326 int width = (int) (
self.bounds.size.width *
self.contentScaleFactor);
327 int height = (int) (
self.bounds.size.height *
self.contentScaleFactor);
330 if (
width != backingWidth ||
height != backingHeight) {
331 EAGLContext *prevContext = [EAGLContext currentContext];
333 [EAGLContext setCurrentContext:context];
339 [EAGLContext setCurrentContext:prevContext];
344 - (
void)destroyFramebuffer
346 if (viewFramebuffer != 0) {
351 if (viewRenderbuffer != 0) {
353 viewRenderbuffer = 0;
356 if (depthRenderbuffer != 0) {
358 depthRenderbuffer = 0;
361 if (msaaFramebuffer != 0) {
366 if (msaaRenderbuffer != 0) {
368 msaaRenderbuffer = 0;
375 [
self destroyFramebuffer];
376 [EAGLContext setCurrentContext:nil];