Name
eglMakeCurrent - attach an EGL rendering context to EGL surfacesC Specification
EGLBoolean eglMakeCurrent(EGLDisplay display,
EGLSurface draw,
EGLSurface read,
EGLContext context)
Parameters
display- Specifies the EGL display connection.
draw- Specifies the EGL draw surface.
read- Specifies the EGL read surface.
context- Specifies the EGL rendering context to be attached to the surfaces.
Description
eglMakeCurrent binds context to the current rendering thread and to the draw and read surfaces. draw is used for all GL operations except for any pixel data read back (glReadPixels, glCopyTexImage2D, and glCopyTexSubImage2D), which is taken from the frame buffer values of read.If the calling thread has already a current rendering context, that context is flushed and marked as no longer current.
The first time that
context is made current, the viewport and scissor dimensions are set to the size of the draw surface. The viewport and scissor are not modified when context is subsequently made current.To release the current context without assigning a new one, call
eglMakeCurrent with draw and read set to EGL_NO_SURFACE and context set to EGL_NO_CONTEXT.Use
eglGetCurrentContext, eglGetCurrentDisplay, and eglGetCurrentSurface to query the current rendering context and associated display connection and surfaces.Errors
EGL_FALSE is returned on failure, EGL_TRUE otherwise. If EGL_FALSE is returned, the previously current rendering context and surfaces (if any) remain unchanged.EGL_BAD_DISPLAY is generated if display is not an EGL display connection.EGL_NOT_INITIALIZED is generated if display has not been initialized.EGL_BAD_SURFACE is generated if draw or read is not an EGL surface.EGL_BAD_CONTEXT is generated if context is not an EGL rendering context.EGL_BAD_MATCH is generated if draw or read are not compatible with context, or if context is set to EGL_NO_CONTEXT and draw or read are not set to EGL_NO_SURFACE, or if draw or read are set to EGL_NO_SURFACE and context is not set to EGL_NO_CONTEXT.EGL_BAD_ACCESS is generated if context is current to some other thread.EGL_BAD_NATIVE_PIXMAP may be generated if a native pixmap underlying either draw or read is no longer valid.EGL_BAD_NATIVE_WINDOW may be generated if a native window underlying either draw or read is no longer valid.EGL_BAD_CURRENT_SURFACE is generated if the previous context has unflushed commands and the previous surface is no longer valid.EGL_BAD_ALLOC may be generated if allocation of ancillary buffers for draw or read were delayed until eglMakeCurrent is called, and there are not enough resources to allocate them.Copyright
Copyright © 2003 Silicon Graphics, Inc.This document is licensed under the SGI Free Software B License. For details, see http://oss.sgi.com/projects/FreeB/.
See Also
glReadPixels, glCopyTexImage2D, glCopyTexSubImage2D, eglCreateContext, eglCreatePbufferSurface, eglCreatePixmapSurface, eglCreateWindowSurface, eglGetCurrentContext, eglGetCurrentDisplay, eglGetCurrentSurface, eglGetDisplay, eglInitializeExample of eglMakeCurrent
void CXXXView::OnInitialUpdate(){ CView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class if (m_eglDisplay != EGL_NO_DISPLAY) return; const EGLint attrs[] = { EGL_LEVEL, 0, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NATIVE_RENDERABLE, EGL_FALSE, EGL_DEPTH_SIZE, EGL_DONT_CARE, EGL_NONE }; EGLint numConfig =0; m_eglDisplay = eglGetDisplay(GetDC()->GetSafeHdc()); if (m_eglDisplay == EGL_NO_DISPLAY) if ((m_eglDisplay = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY) return; // Initialize the display EGLint major = 0; EGLint minor = 0; if (!eglInitialize(m_eglDisplay, &major, &minor)) return; if (major < 1 || minor < 3) { // Does not support EGL 1.3 printf("System does not support at least EGL 1.3 \n"); return; } EGLConfig eglConfig; // Obtain the first configuration with a depth buffer if (!eglChooseConfig(m_eglDisplay, attrs, &eglConfig, 1, &numConfig)) return; // Create a surface for the main window if ((m_eglSurface = eglCreateWindowSurface(m_eglDisplay, eglConfig, (EGLNativeWindowType) GetSafeHwnd(), NULL)) == EGL_NO_SURFACE) return; // Bind the API (It could be OpenGLES or OpenVG) // eglBindAPI(EGL_OPENGL_ES_API); EGLint ai32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; // Create an OpenGL ES context if ((m_eglContext = eglCreateContext(m_eglDisplay, eglConfig, EGL_NO_CONTEXT, ai32ContextAttribs)) == EGL_NO_CONTEXT) return; // Make the context and surface current if (!eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext)) return; /// glClearColor(0.5f, 0.5f, 0.5f, 0.0f);}void CXXXView::PostNcDestroy(){ // TODO: Add your specialized code here and/or call the base class eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroyContext(m_eglDisplay, m_eglContext); eglDestroySurface(m_eglDisplay, m_eglSurface); eglTerminate(m_eglDisplay); CView::PostNcDestroy();}void CXXXView::onDraw(void){ glClear(GL_COLOR_BUFFER_BIT); /// IGameImporter * gameImport = NULL; auto pDoc = GetDocument(); if (pDoc && pDoc->IsKindOf(RUNTIME_CLASS(CXXXDoc))) gameImport = dynamic_cast<cxxxdoc *=""> (pDoc)->getGameImport(); /// eglSwapBuffers(m_eglDisplay, m_eglSurface);}BOOL CXXXView::OnEraseBkgnd(CDC* pDC){ // TODO: Add your message handler code here and/or call default /// return CView::OnEraseBkgnd(pDC); return FALSE;}void CXXXView::OnSize(UINT nType, int cx, int cy){ CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here glViewport(0, 0, cx, cy);}/// CXXXApp.cppBOOL CXXXApp::OnIdle(LONG lCount){ // TODO: Add your specialized code here and/or call the base class// return CWinAppEx::OnIdle(lCount); CMainFrame * pFrame = (CMainFrame *) AfxGetMainWnd(); CView * pView = pFrame->GetActiveView(); if (pView && pView->IsKindOf(RUNTIME_CLASS(CXXXView))) dynamic_cast<cxxxview *=""> (pView)->onDraw(); return TRUE;}/// CViewTree.h#define WM_TVN_SELCHANGED (WM_USER+3)class CViewTree : public CTreeCtrl{public: afx_msg void OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult);};/// CViewTree.cppBEGIN_MESSAGE_MAP(CViewTree, CTreeCtrl) ON_NOTIFY_REFLECT(TVN_SELCHANGED, &CViewTree::OnTvnSelchanged)END_MESSAGE_MAP()void CViewTree::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult){ LPNMTREEVIEW pNMTreeView = reinterpret_cast<lpnmtreeview>(pNMHDR); // TODO: Add your control notification handler code here GetParent()->SendNotifyMessage(WM_TVN_SELCHANGED, (WPARAM) pNMTreeView, (LPARAM) pResult); *pResult = 0;}