void PreparePresentSurfaceGLES(EAGLSurfaceDesc* surface) { #if GL_APPLE_framebuffer_multisample if( surface->msaaSamples > 0 && _supportsMSAA ) { Profiler_StartMSAAResolve(); UNITY_DBG_LOG (" ResolveMSAA: samples=%i msaaFBO=%i destFBO=%i\n", surface->msaaSamples, surface->msaaFramebuffer, surface->framebuffer); GLES_CHK( glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, surface->msaaFramebuffer) ); GLES_CHK( glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, surface->framebuffer) ); GLES_CHK( glResolveMultisampleFramebufferAPPLE() ); Profiler_EndMSAAResolve(); } #endif // update screenshot here if( UnityIsCaptureScreenshotRequested() ) { GLint curfb = 0; GLES_CHK( glGetIntegerv(GL_FRAMEBUFFER_BINDING, &curfb) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->framebuffer) ); UnityCaptureScreenshot(); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, curfb) ); } #if GL_EXT_discard_framebuffer if( _supportsDiscard ) { GLenum attachments[3]; int discardCount = 0; if (surface->msaaSamples > 1 && _supportsMSAA) attachments[discardCount++] = GL_COLOR_ATTACHMENT0_OES; if (surface->depthFormat) attachments[discardCount++] = GL_DEPTH_ATTACHMENT_OES; attachments[discardCount++] = GL_STENCIL_ATTACHMENT_OES; GLenum target = (surface->msaaSamples > 1 && _supportsMSAA) ? GL_READ_FRAMEBUFFER_APPLE: GL_FRAMEBUFFER_OES; if (discardCount > 0) { GLES_CHK( glDiscardFramebufferEXT(target, discardCount, attachments) ); } } #endif }
void PreparePresentSurfaceGLES(EAGLSurfaceDesc* surface) { #if GL_APPLE_framebuffer_multisample if( surface->msaaSamples > 1 && _supportsMSAA ) { Profiler_StartMSAAResolve(); GLuint drawFB = surface->targetFramebuffer ? surface->targetFramebuffer : surface->systemFramebuffer; GLES_CHK( glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, surface->msaaFramebuffer) ); GLES_CHK( glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, drawFB) ); GLES_CHK( glResolveMultisampleFramebufferAPPLE() ); Profiler_EndMSAAResolve(); } #endif // update screenshot from target FBO to get requested resolution if( UnityIsCaptureScreenshotRequested() ) { GLint target = surface->targetFramebuffer ? surface->targetFramebuffer : surface->systemFramebuffer; GLint curfb = 0; GLES_CHK( glGetIntegerv(GL_FRAMEBUFFER_BINDING, &curfb) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, target) ); UnityCaptureScreenshot(); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, curfb) ); } if( surface->targetFramebuffer ) { gDefaultFBO = surface->systemFramebuffer; GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, gDefaultFBO) ); UnityBlitToSystemFB(surface->targetRT, surface->targetW, surface->targetH, surface->systemW, surface->systemH); gDefaultFBO = surface->msaaFramebuffer ? surface->msaaFramebuffer : surface->targetFramebuffer; GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, gDefaultFBO) ); } #if GL_EXT_discard_framebuffer if( _supportsDiscard ) { GLenum discardAttach[] = {GL_COLOR_ATTACHMENT0_OES, GL_DEPTH_ATTACHMENT_OES, GL_STENCIL_ATTACHMENT_OES}; if( surface->msaaFramebuffer ) GLES_CHK( glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 3, discardAttach) ); if(surface->targetFramebuffer) { GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->targetFramebuffer) ); GLES_CHK( glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, 3, discardAttach) ); } GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, surface->systemFramebuffer) ); GLES_CHK( glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, 2, &discardAttach[1]) ); GLES_CHK( glBindFramebufferOES(GL_FRAMEBUFFER_OES, gDefaultFBO) ); } #endif }