EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw) { if (!EglValidate::surfaceTarget(readdraw)) { return EGL_NO_SURFACE; } ThreadInfo* thread = getThreadInfo(); EglDisplay* dpy = static_cast<EglDisplay*>(thread->eglDisplay); ContextPtr ctx = thread->eglContext; if(dpy && ctx.Ptr()) { SurfacePtr surface = readdraw == EGL_READ ? ctx->read() : ctx->draw(); if(surface.Ptr()) { // This double check is required because a surface might still be // current after it is destroyed - in which case its handle should // be invalid, that is EGL_NO_SURFACE should be returned even // though the surface is current. EGLSurface s = (EGLSurface)SafePointerFromUInt(surface->getHndl()); surface = dpy->getSurface(s); if(surface.Ptr()) { return s; } } } return EGL_NO_SURFACE; }
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay display, EGLSurface surface) { VALIDATE_DISPLAY(display); SurfacePtr srfc = dpy->getSurface(surface); if(!srfc.Ptr()) { RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE); } dpy->removeSurface(surface); return EGL_TRUE; }
EGLSurface EglDisplay::addSurface(SurfacePtr s ) { android::Mutex::Autolock mutex(m_lock); unsigned int hndl = s.Ptr()->getHndl(); EGLSurface ret =reinterpret_cast<EGLSurface> (hndl); if(m_surfaces.find(hndl) != m_surfaces.end()) { return ret; } m_surfaces[hndl] = s; return ret; }
bool EglDisplay::removeSurface(SurfacePtr s) { android::Mutex::Autolock mutex(m_lock); SurfacesHndlMap::iterator it; for(it = m_surfaces.begin(); it!= m_surfaces.end(); it++) { if((*it).second.Ptr() == s.Ptr()) { break; } } if(it != m_surfaces.end()) { m_surfaces.erase(it); return true; } return false; }
bool EglContext::usingSurface(SurfacePtr surface) { return surface.Ptr() == m_read.Ptr() || surface.Ptr() == m_draw.Ptr(); }