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;
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)");
98 colorFormat = kEAGLColorFormatSRGBA8;
104 }
else if (rBits >= 8 || gBits >= 8 || bBits >= 8) {
106 colorFormat = kEAGLColorFormatRGBA8;
110 colorFormat = kEAGLColorFormatRGB565;
114 CAEAGLLayer *eaglLayer = (CAEAGLLayer *)
self.
layer;
116 eaglLayer.opaque = YES;
117 eaglLayer.drawableProperties = @{
118 kEAGLDrawablePropertyRetainedBacking:@(retained),
119 kEAGLDrawablePropertyColorFormat:colorFormat
123 self.contentScaleFactor =
scale;
129 if (![context renderbufferStorage:
GL_RENDERBUFFER fromDrawable:eaglLayer]) {
163 if (useDepthBuffer || useStencilBuffer) {
164 if (useStencilBuffer) {
167 }
else if (useDepthBuffer) {
182 if (useDepthBuffer) {
185 if (useStencilBuffer) {
197 [
self setDebugLabels];
205 return viewRenderbuffer;
211 if (msaaFramebuffer) {
212 return msaaFramebuffer;
214 return viewFramebuffer;
222 if (msaaFramebuffer) {
223 return viewFramebuffer;
231 GLint prevRenderbuffer = 0;
235 [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
240 if (msaaRenderbuffer != 0) {
245 if (depthRenderbuffer != 0) {
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) {
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);
331 EAGLContext *prevContext = [EAGLContext currentContext];
332 if (prevContext != context) {
333 [EAGLContext setCurrentContext:context];
338 if (prevContext != 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;
374 if (context && context == [EAGLContext currentContext]) {
375 [
self destroyFramebuffer];
376 [EAGLContext setCurrentContext:nil];
GLenum GLenum GLenum GLenum GLenum scale
SDL_bool UIKit_IsSystemVersionAtLeast(double version)
GL_APICALL void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
#define GL_DEPTH24_STENCIL8_OES
GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target)
GLuint drawableRenderbuffer
#define GL_COLOR_ATTACHMENT0
#define GL_DEPTH_ATTACHMENT
GL_APICALL void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer)
GL_APICALL void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer)
GLfloat GLfloat GLfloat GLfloat h
GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
GLenum GLuint GLint GLint layer
GLuint drawableFramebuffer
GLuint msaaResolveFramebuffer
GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
#define GL_FRAMEBUFFER_COMPLETE
GLenum GLenum colorFormat
GLint GLint GLsizei width
#define GL_RENDERBUFFER_HEIGHT
#define GL_STENCIL_ATTACHMENT
GL_APICALL void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
#define GL_DRAW_FRAMEBUFFER
GLubyte GLubyte GLubyte GLubyte w
#define GL_RENDERBUFFER_WIDTH
#define GL_COLOR_BUFFER_BIT
#define GL_READ_FRAMEBUFFER
#define GL_RENDERBUFFER_BINDING
GLAPI void GLAPIENTRY glGetIntegerv(GLenum pname, GLint *params)
GL_APICALL void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
GLint GLint GLsizei GLsizei height
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
GL_APICALL void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint *framebuffers)
#define GL_DEPTH_COMPONENT24_OES
GL_APICALL void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
GLsizei const GLenum * attachments