Name
eglCreateWindowSurface
- create a new EGL window surfaceC Specification
EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config, NativeWindowType native_window, EGLint const * attrib_list)
Parameters
display
- Specifies the EGL display connection.
config
- Specifies the EGL frame buffer configuration that defines the frame buffer resource available to the surface.
native_window
- Specifies the native window.
attrib_list
- Specifies window surface attributes. Must be
NULL
or empty (first attribute isEGL_NONE
).
Description
eglCreateWindowSurface
creates an EGL window surface and returns its handle. If eglCreateWindowSurface
fails to create a window surface, EGL_NO_SURFACE
is returned.Any EGL rendering context that was created with respect to
config
can be used to render into the surface. Use eglMakeCurrent
to attach an EGL rendering context to the surface.Use
eglQuerySurface
to retrieve the ID of config
.Use
eglDestroySurface
to destroy the surface.Errors
EGL_NO_SURFACE
is returned if creation of the context fails.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_CONFIG
is generated if config
is not an EGL frame buffer configuration.EGL_BAD_NATIVE_WINDOW
may be generated if native_window
is not a valid native window.EGL_BAD_ATTRIBUTE
is generated if attrib_list
contains an invalid window attribute or if an attribute value is not recognized or is out of range.EGL_BAD_ALLOC
is generated if there are not enough resources to allocate the new surface.EGL_BAD_MATCH
is generated if the attributes of native_window
do not correspond to config
or if config
does not support rendering to windows (the EGL_SURFACE_TYPE
attribute does not contain EGL_WINDOW_BIT
).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
eglDestroySurface
, eglChooseConfig
, eglGetConfigs
, eglMakeCurrent
, eglQuerySurface
Example of eglCreateWindowSurface
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;
}