bool FrameBuffer::setupSubWindow(FBNativeWindowType p_window, int p_x, int p_y, int p_width, int p_height, float zRot) { bool success = false; if (s_theFrameBuffer) { s_theFrameBuffer->m_lock.lock(); FrameBuffer *fb = s_theFrameBuffer; if (!fb->m_subWin) { // create native subwindow for FB display output fb->m_subWin = createSubWindow(p_window, &fb->m_subWinDisplay, p_x,p_y,p_width,p_height); if (fb->m_subWin) { fb->m_nativeWindow = p_window; // create EGLSurface from the generated subwindow fb->m_eglSurface = s_egl.eglCreateWindowSurface(fb->m_eglDisplay, fb->m_eglConfig, fb->m_subWin, NULL); if (fb->m_eglSurface == EGL_NO_SURFACE) { ERR("Failed to create surface\n"); destroySubWindow(fb->m_subWinDisplay, fb->m_subWin); fb->m_subWin = (EGLNativeWindowType)0; } else if (fb->bindSubwin_locked()) { // Subwin creation was successfull, // update viewport and z rotation and draw // the last posted color buffer. s_gl.glViewport(0, 0, p_width, p_height); fb->m_zRot = zRot; fb->post( fb->m_lastPostedColorBuffer, false ); fb->unbind_locked(); success = true; } } } s_theFrameBuffer->m_lock.unlock(); } return success; }
bool FrameBuffer::removeSubWindow() { bool removed = false; if (s_theFrameBuffer) { s_theFrameBuffer->m_lock.lock(); if (s_theFrameBuffer->m_subWin) { s_egl.eglMakeCurrent(s_theFrameBuffer->m_eglDisplay, NULL, NULL, NULL); s_egl.eglDestroySurface(s_theFrameBuffer->m_eglDisplay, s_theFrameBuffer->m_eglSurface); destroySubWindow(s_theFrameBuffer->m_subWin); s_theFrameBuffer->m_eglSurface = EGL_NO_SURFACE; s_theFrameBuffer->m_subWin = (EGLNativeWindowType)0; removed = true; } s_theFrameBuffer->m_lock.unlock(); } return removed; }