VirtualBox

Changeset 54638 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 5, 2015 12:33:47 AM (10 years ago)
Author:
vboxsync
Message:

Looks like we have to do glFlush() before changing GL context on mac os x.

Location:
trunk/src/VBox
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-cocoa.m

    r54167 r54638  
    735735    DEBUG_MSG(("cocoaViewMakeCurrentContext(%p, %p)\n", (void*)pView, (void*)pCtx));
    736736
     737    /* Always flush before flush. glXMakeCurrent and wglMakeCurrent does this
     738       implicitly, seemingly NSOpenGLContext::makeCurrentContext doesn't. */
     739    if ([NSOpenGLContext currentContext] != 0)
     740        glFlush();
     741
    737742    if (pView)
    738743    {
  • trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m

    r54632 r54638  
    193193    } while (0)
    194194
    195 #ifdef DEBUG_poetzsch
    196 # define DEBUG_CHECK_GL_ERROR() do { checkGLError(__FILE__, __LINE__); } while (0);
    197 static void checkGLError(char *pszFile, int iLine)
    198 {
    199     GLenum uGlErr = glGetError();
    200     if (uGlErr != GL_NO_ERROR)
    201     {
    202         const char *errStr;
    203         switch (uGlErr)
    204         {
    205             case GL_INVALID_ENUM:      errStr = "GL_INVALID_ENUM"; break;
    206             case GL_INVALID_VALUE:     errStr = "GL_INVALID_VALUE"; break;
    207             case GL_INVALID_OPERATION: errStr = "GL_INVALID_OPERATION"; break;
    208             case GL_STACK_OVERFLOW:    errStr = "GL_STACK_OVERFLOW"; break;
    209             case GL_STACK_UNDERFLOW:   errStr = "GL_STACK_UNDERFLOW"; break;
    210             case GL_OUT_OF_MEMORY:     errStr = "GL_OUT_OF_MEMORY"; break;
    211             case GL_TABLE_TOO_LARGE:   errStr = "GL_TABLE_TOO_LARGE"; break;
    212             default:                   errStr = "UNKNOWN"; break;
    213         }
    214         DEBUG_MSG(("%s:%d: glError %d (%s)\n", pszFile, iLine, uGlErr, errStr));
    215     }
    216 }
     195#ifdef VBOX_STRICT
     196# define DEBUG_CLEAR_GL_ERRORS() \
     197    do { \
     198        while (glGetError() != GL_NO_ERROR) \
     199        { /* nothing */ } \
     200    } while (0)
     201# define DEBUG_CHECK_GL_ERROR(a_szOp) \
     202    do { \
     203        GLenum iGlCheckErr = glGetError(); \
     204        if (RT_UNLIKELY(iGlCheckErr != GL_NO_ERROR)) \
     205            AssertMsgFailed((a_szOp ": iGlCheckErr=%#x\n", iGlCheckErr)); \
     206    } while (0)
    217207#else
    218 # define DEBUG_CHECK_GL_ERROR() do {} while (0)
     208# define DEBUG_CLEAR_GL_ERRORS()        do {} while (0)
     209# define DEBUG_CHECK_GL_ERROR(a_szOp)   do {} while (0)
    219210#endif
    220211
     
    389380            glFlush();
    390381       
     382        DEBUG_CLEAR_GL_ERRORS();
    391383        [pNewCtx makeCurrentContext];
     384        DEBUG_CHECK_GL_ERROR("makeCurrentContext");
    392385       
    393386        pCtxInfo->fIsValid = true;
     
    420413            if ([pOldCtx view] != pOldView)
    421414            {
     415                DEBUG_CLEAR_GL_ERRORS();
    422416                [pOldCtx setView: pOldView];
     417                DEBUG_CHECK_GL_ERROR("setView");
    423418            }
    424419       
     420            DEBUG_CLEAR_GL_ERRORS();
    425421            [pOldCtx makeCurrentContext];
     422            DEBUG_CHECK_GL_ERROR("makeCurrentContext");
    426423           
    427424#ifdef VBOX_STRICT
     
    14971494        if (m_pGLCtx)
    14981495        {
     1496#ifdef IN_VMSVGA3D
     1497            Assert(!pCtx);
     1498#endif
    14991499            [m_pGLCtx clearDrawable];
    15001500            [m_pGLCtx release];
     
    20002000- (void)makeCurrentFBO
    20012001{
    2002     COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self));
     2002    COCOA_LOG_FLOW(("%s: self=%p - m_pGLCtx=%p m_fNeedCtxUpdate=%d\n", __PRETTY_FUNCTION__, (void *)self,
     2003                    (void *)m_pGLCtx, m_fNeedCtxUpdate));
    20032004
    20042005    if (m_pGLCtx)
    20052006    {
     2007        NSOpenGLContext *pPrevCtx = [NSOpenGLContext currentContext];
     2008
     2009#ifdef IN_VMSVGA3D
     2010        /* Always flush before flush. glXMakeCurrent and wglMakeCurrent does this
     2011           implicitly, seemingly NSOpenGLContext::makeCurrentContext doesn't. */
     2012        if (pPrevCtx != nil)
     2013        {
     2014            DEBUG_CLEAR_GL_ERRORS();
     2015            glFlush();
     2016            DEBUG_CHECK_GL_ERROR("glFlush");
     2017        }
     2018#endif
     2019
    20062020        if ([m_pGLCtx view] != self)
    20072021        {
     2022#ifndef IN_VMSVGA3D
    20082023            /* We change the active view, so flush first */
    2009             if ([NSOpenGLContext currentContext] != 0)
     2024            if (pPrevCtx != nil)
    20102025                glFlush();
     2026#endif
     2027            DEBUG_CLEAR_GL_ERRORS();
    20112028            [m_pGLCtx setView: self];
    2012             DEBUG_CHECK_GL_ERROR();
     2029            DEBUG_CHECK_GL_ERROR("setView");
    20132030        }
    20142031
    2015         /*
    2016         if ([NSOpenGLContext currentContext] != m_pGLCtx)
    2017         */
     2032#if 0
     2033        if (pPrevCtx != m_pGLCtx)
     2034#endif
    20182035        {
     2036            DEBUG_CLEAR_GL_ERRORS();
    20192037            [m_pGLCtx makeCurrentContext];
    2020             DEBUG_CHECK_GL_ERROR();
    2021             if (m_fNeedCtxUpdate == true)
    2022             {
    2023                 [m_pGLCtx update];
    2024                 m_fNeedCtxUpdate = false;
    2025             }
     2038            DEBUG_CHECK_GL_ERROR("makeCurrentContext");
     2039            Assert([NSOpenGLContext currentContext] == m_pGLCtx);
     2040            Assert([m_pGLCtx view] == self);
     2041        }
     2042
     2043        if (m_fNeedCtxUpdate == true)
     2044        {
     2045            [m_pGLCtx update];
     2046            m_fNeedCtxUpdate = false;
    20262047        }
    20272048       
     
    28512872
    28522873    [pPool release];
    2853     COCOA_LOG_FLOW(("cocoaGLCtxDestroy: returns *ppCtx=%p\n", (void *)*ppCtx));
     2874    COCOA_LOG_FLOW(("cocoaGLCtxCreate: returns *ppCtx=%p\n", (void *)*ppCtx));
    28542875}
    28552876
     
    31313152    else
    31323153    {
     3154#ifdef IN_VMSVGA3D
     3155        /* Always flush before flush. glXMakeCurrent and wglMakeCurrent does this
     3156           implicitly, seemingly NSOpenGLContext::makeCurrentContext doesn't. */
     3157        if ([NSOpenGLContext currentContext] != nil)
     3158        {
     3159            DEBUG_CLEAR_GL_ERRORS();
     3160            glFlush();
     3161            DEBUG_CHECK_GL_ERROR("glFlush");
     3162        }
     3163#endif
    31333164        [NSOpenGLContext clearCurrentContext];
    31343165    }
     
    32073238VMSVGA3D_DECL(void) vmsvga3dCocoaViewMakeCurrentContext(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx)
    32083239{
     3240    Assert(!pView || [(OverlayView *)pView glCtx] == pCtx || [(OverlayView *)pView glCtx] == nil);
    32093241    cocoaViewMakeCurrentContext(pView, pCtx);
    32103242}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette