summaryrefslogtreecommitdiff
path: root/Source/3rdParty/SDL2/src/video/uikit/SDL_uikitopenglview.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/3rdParty/SDL2/src/video/uikit/SDL_uikitopenglview.m')
-rw-r--r--Source/3rdParty/SDL2/src/video/uikit/SDL_uikitopenglview.m384
1 files changed, 0 insertions, 384 deletions
diff --git a/Source/3rdParty/SDL2/src/video/uikit/SDL_uikitopenglview.m b/Source/3rdParty/SDL2/src/video/uikit/SDL_uikitopenglview.m
deleted file mode 100644
index 9024376..0000000
--- a/Source/3rdParty/SDL2/src/video/uikit/SDL_uikitopenglview.m
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2018 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.
-*/
-#include "../../SDL_internal.h"
-
-#if SDL_VIDEO_DRIVER_UIKIT
-
-#include <OpenGLES/EAGLDrawable.h>
-#include <OpenGLES/ES2/glext.h>
-#import "SDL_uikitopenglview.h"
-#include "SDL_uikitwindow.h"
-
-@implementation SDL_uikitopenglview {
- /* The renderbuffer and framebuffer used to render to this layer. */
- GLuint viewRenderbuffer, viewFramebuffer;
-
- /* The depth buffer that is attached to viewFramebuffer, if it exists. */
- GLuint depthRenderbuffer;
-
- GLenum colorBufferFormat;
-
- /* format of depthRenderbuffer */
- GLenum depthBufferFormat;
-
- /* The framebuffer and renderbuffer used for rendering with MSAA. */
- GLuint msaaFramebuffer, msaaRenderbuffer;
-
- /* The number of MSAA samples. */
- int samples;
-
- BOOL retainedBacking;
-}
-
-@synthesize context;
-@synthesize backingWidth;
-@synthesize backingHeight;
-
-+ (Class)layerClass
-{
- return [CAEAGLLayer class];
-}
-
-- (instancetype)initWithFrame:(CGRect)frame
- scale:(CGFloat)scale
- retainBacking:(BOOL)retained
- rBits:(int)rBits
- gBits:(int)gBits
- bBits:(int)bBits
- aBits:(int)aBits
- depthBits:(int)depthBits
- stencilBits:(int)stencilBits
- sRGB:(BOOL)sRGB
- multisamples:(int)multisamples
- context:(EAGLContext *)glcontext
-{
- if ((self = [super initWithFrame:frame])) {
- const BOOL useStencilBuffer = (stencilBits != 0);
- const BOOL useDepthBuffer = (depthBits != 0);
- NSString *colorFormat = nil;
-
- context = glcontext;
- samples = multisamples;
- retainedBacking = retained;
-
- if (!context || ![EAGLContext setCurrentContext:context]) {
- SDL_SetError("Could not create OpenGL ES drawable (could not make context current)");
- return nil;
- }
-
- if (samples > 0) {
- GLint maxsamples = 0;
- glGetIntegerv(GL_MAX_SAMPLES, &maxsamples);
-
- /* Clamp the samples to the max supported count. */
- samples = MIN(samples, maxsamples);
- }
-
- if (sRGB) {
- /* sRGB EAGL drawable support was added in iOS 7. */
- if (UIKit_IsSystemVersionAtLeast(7.0)) {
- colorFormat = kEAGLColorFormatSRGBA8;
- colorBufferFormat = GL_SRGB8_ALPHA8;
- } else {
- SDL_SetError("sRGB drawables are not supported.");
- return nil;
- }
- } else if (rBits >= 8 || gBits >= 8 || bBits >= 8 || aBits > 0) {
- /* if user specifically requests rbg888 or some color format higher than 16bpp */
- colorFormat = kEAGLColorFormatRGBA8;
- colorBufferFormat = GL_RGBA8;
- } else {
- /* default case (potentially faster) */
- colorFormat = kEAGLColorFormatRGB565;
- colorBufferFormat = GL_RGB565;
- }
-
- CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
-
- eaglLayer.opaque = YES;
- eaglLayer.drawableProperties = @{
- kEAGLDrawablePropertyRetainedBacking:@(retained),
- kEAGLDrawablePropertyColorFormat:colorFormat
- };
-
- /* Set the appropriate scale (for retina display support) */
- self.contentScaleFactor = scale;
-
- /* Create the color Renderbuffer Object */
- glGenRenderbuffers(1, &viewRenderbuffer);
- glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
-
- if (![context renderbufferStorage:GL_RENDERBUFFER fromDrawable:eaglLayer]) {
- SDL_SetError("Failed to create OpenGL ES drawable");
- return nil;
- }
-
- /* Create the Framebuffer Object */
- glGenFramebuffers(1, &viewFramebuffer);
- glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);
-
- /* attach the color renderbuffer to the FBO */
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);
-
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);
-
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
- SDL_SetError("Failed creating OpenGL ES framebuffer");
- return nil;
- }
-
- /* When MSAA is used we'll use a separate framebuffer for rendering to,
- * since we'll need to do an explicit MSAA resolve before presenting. */
- if (samples > 0) {
- glGenFramebuffers(1, &msaaFramebuffer);
- glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer);
-
- glGenRenderbuffers(1, &msaaRenderbuffer);
- glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer);
-
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, colorBufferFormat, backingWidth, backingHeight);
-
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaaRenderbuffer);
- }
-
- if (useDepthBuffer || useStencilBuffer) {
- if (useStencilBuffer) {
- /* Apparently you need to pack stencil and depth into one buffer. */
- depthBufferFormat = GL_DEPTH24_STENCIL8_OES;
- } else if (useDepthBuffer) {
- /* iOS only uses 32-bit float (exposed as fixed point 24-bit)
- * depth buffers. */
- depthBufferFormat = GL_DEPTH_COMPONENT24_OES;
- }
-
- glGenRenderbuffers(1, &depthRenderbuffer);
- glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
-
- if (samples > 0) {
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, depthBufferFormat, backingWidth, backingHeight);
- } else {
- glRenderbufferStorage(GL_RENDERBUFFER, depthBufferFormat, backingWidth, backingHeight);
- }
-
- if (useDepthBuffer) {
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
- }
- if (useStencilBuffer) {
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
- }
- }
-
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
- SDL_SetError("Failed creating OpenGL ES framebuffer");
- return nil;
- }
-
- glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
-
- [self setDebugLabels];
- }
-
- return self;
-}
-
-- (GLuint)drawableRenderbuffer
-{
- return viewRenderbuffer;
-}
-
-- (GLuint)drawableFramebuffer
-{
- /* When MSAA is used, the MSAA draw framebuffer is used for drawing. */
- if (msaaFramebuffer) {
- return msaaFramebuffer;
- } else {
- return viewFramebuffer;
- }
-}
-
-- (GLuint)msaaResolveFramebuffer
-{
- /* When MSAA is used, the MSAA draw framebuffer is used for drawing and the
- * view framebuffer is used as a MSAA resolve framebuffer. */
- if (msaaFramebuffer) {
- return viewFramebuffer;
- } else {
- return 0;
- }
-}
-
-- (void)updateFrame
-{
- GLint prevRenderbuffer = 0;
- glGetIntegerv(GL_RENDERBUFFER_BINDING, &prevRenderbuffer);
-
- glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
- [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
-
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);
-
- if (msaaRenderbuffer != 0) {
- glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer);
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, colorBufferFormat, backingWidth, backingHeight);
- }
-
- if (depthRenderbuffer != 0) {
- glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
-
- if (samples > 0) {
- glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, depthBufferFormat, backingWidth, backingHeight);
- } else {
- glRenderbufferStorage(GL_RENDERBUFFER, depthBufferFormat, backingWidth, backingHeight);
- }
- }
-
- glBindRenderbuffer(GL_RENDERBUFFER, prevRenderbuffer);
-}
-
-- (void)setDebugLabels
-{
- if (viewFramebuffer != 0) {
- glLabelObjectEXT(GL_FRAMEBUFFER, viewFramebuffer, 0, "context FBO");
- }
-
- if (viewRenderbuffer != 0) {
- glLabelObjectEXT(GL_RENDERBUFFER, viewRenderbuffer, 0, "context color buffer");
- }
-
- if (depthRenderbuffer != 0) {
- if (depthBufferFormat == GL_DEPTH24_STENCIL8_OES) {
- glLabelObjectEXT(GL_RENDERBUFFER, depthRenderbuffer, 0, "context depth-stencil buffer");
- } else {
- glLabelObjectEXT(GL_RENDERBUFFER, depthRenderbuffer, 0, "context depth buffer");
- }
- }
-
- if (msaaFramebuffer != 0) {
- glLabelObjectEXT(GL_FRAMEBUFFER, msaaFramebuffer, 0, "context MSAA FBO");
- }
-
- if (msaaRenderbuffer != 0) {
- glLabelObjectEXT(GL_RENDERBUFFER, msaaRenderbuffer, 0, "context MSAA renderbuffer");
- }
-}
-
-- (void)swapBuffers
-{
- if (msaaFramebuffer) {
- const GLenum attachments[] = {GL_COLOR_ATTACHMENT0};
-
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, viewFramebuffer);
-
- /* OpenGL ES 3+ provides explicit MSAA resolves via glBlitFramebuffer.
- * In OpenGL ES 1 and 2, MSAA resolves must be done via an extension. */
- if (context.API >= kEAGLRenderingAPIOpenGLES3) {
- int w = backingWidth;
- int h = backingHeight;
- glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
-
- if (!retainedBacking) {
- /* Discard the contents of the MSAA drawable color buffer. */
- glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 1, attachments);
- }
- } else {
- glResolveMultisampleFramebufferAPPLE();
-
- if (!retainedBacking) {
- glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER, 1, attachments);
- }
- }
-
- /* We assume the "drawable framebuffer" (MSAA draw framebuffer) was
- * previously bound... */
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, msaaFramebuffer);
- }
-
- /* viewRenderbuffer should always be bound here. Code that binds something
- * else is responsible for rebinding viewRenderbuffer, to reduce duplicate
- * state changes. */
- [context presentRenderbuffer:GL_RENDERBUFFER];
-}
-
-- (void)layoutSubviews
-{
- [super layoutSubviews];
-
- int width = (int) (self.bounds.size.width * self.contentScaleFactor);
- int height = (int) (self.bounds.size.height * self.contentScaleFactor);
-
- /* Update the color and depth buffer storage if the layer size has changed. */
- if (width != backingWidth || height != backingHeight) {
- EAGLContext *prevContext = [EAGLContext currentContext];
- if (prevContext != context) {
- [EAGLContext setCurrentContext:context];
- }
-
- [self updateFrame];
-
- if (prevContext != context) {
- [EAGLContext setCurrentContext:prevContext];
- }
- }
-}
-
-- (void)destroyFramebuffer
-{
- if (viewFramebuffer != 0) {
- glDeleteFramebuffers(1, &viewFramebuffer);
- viewFramebuffer = 0;
- }
-
- if (viewRenderbuffer != 0) {
- glDeleteRenderbuffers(1, &viewRenderbuffer);
- viewRenderbuffer = 0;
- }
-
- if (depthRenderbuffer != 0) {
- glDeleteRenderbuffers(1, &depthRenderbuffer);
- depthRenderbuffer = 0;
- }
-
- if (msaaFramebuffer != 0) {
- glDeleteFramebuffers(1, &msaaFramebuffer);
- msaaFramebuffer = 0;
- }
-
- if (msaaRenderbuffer != 0) {
- glDeleteRenderbuffers(1, &msaaRenderbuffer);
- msaaRenderbuffer = 0;
- }
-}
-
-- (void)dealloc
-{
- if (context && context == [EAGLContext currentContext]) {
- [self destroyFramebuffer];
- [EAGLContext setCurrentContext:nil];
- }
-}
-
-@end
-
-#endif /* SDL_VIDEO_DRIVER_UIKIT */
-
-/* vi: set ts=4 sw=4 expandtab: */