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
, eglInitialize
Example 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.cpp
BOOL
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.cpp
BEGIN_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;
}