Index: third_party/gles_book_examples/Common/Source/esUtil.c |
=================================================================== |
--- third_party/gles_book_examples/Common/Source/esUtil.c (revision 35503) |
+++ third_party/gles_book_examples/Common/Source/esUtil.c (working copy) |
@@ -20,21 +20,96 @@ |
// |
#include <stdio.h> |
#include <stdlib.h> |
-#include <stdarg.h> |
-#include <string.h> |
- |
#include <GLES2/gl2.h> |
- |
+#include <EGL/egl.h> |
#include "esUtil.h" |
#include "esUtil_win.h" |
+ |
+ |
+ |
/// |
+// CreateEGLContext() |
+// |
+// Creates an EGL rendering context and all associated elements |
+// |
+EGLBoolean CreateEGLContext ( EGLNativeWindowType hWnd, EGLDisplay* eglDisplay, |
+ EGLContext* eglContext, EGLSurface* eglSurface, |
+ EGLint attribList[]) |
+{ |
+ EGLint numConfigs; |
+ EGLint majorVersion; |
+ EGLint minorVersion; |
+ EGLDisplay display; |
+ EGLContext context; |
+ EGLSurface surface; |
+ EGLConfig config; |
+ EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE }; |
+ |
+ // Get Display |
+ display = eglGetDisplay(GetDC(hWnd)); |
+ if ( display == EGL_NO_DISPLAY ) |
+ { |
+ return EGL_FALSE; |
+ } |
+ |
+ // Initialize EGL |
+ if ( !eglInitialize(display, &majorVersion, &minorVersion) ) |
+ { |
+ return EGL_FALSE; |
+ } |
+ |
+ // Get configs |
+ if ( !eglGetConfigs(display, NULL, 0, &numConfigs) ) |
+ { |
+ return EGL_FALSE; |
+ } |
+ |
+ // Choose config |
+ if ( !eglChooseConfig(display, attribList, &config, 1, &numConfigs) ) |
+ { |
+ return EGL_FALSE; |
+ } |
+ |
+ // Create a surface |
+ surface = eglCreateWindowSurface(display, config, (EGLNativeWindowType)hWnd, NULL); |
+ if ( surface == EGL_NO_SURFACE ) |
+ { |
+ return EGL_FALSE; |
+ } |
+ |
+ // Create a GL context |
+ context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs ); |
+ if ( context == EGL_NO_CONTEXT ) |
+ { |
+ return EGL_FALSE; |
+ } |
+ |
+ // Make the context current |
+ if ( !eglMakeCurrent(display, surface, surface, context) ) |
+ { |
+ return EGL_FALSE; |
+ } |
+ |
+ *eglDisplay = display; |
+ *eglSurface = surface; |
+ *eglContext = context; |
+ return EGL_TRUE; |
+} |
+ |
+////////////////////////////////////////////////////////////////// |
+// |
+// Public Functions |
+// |
+// |
+ |
+/// |
// esInitContext() |
// |
// Initialize ES utility context. This must be called before calling any other |
// functions. |
// |
-void esInitContext ( ESContext *esContext ) |
+void ESUTIL_API esInitContext ( ESContext *esContext ) |
{ |
if ( esContext != NULL ) |
{ |
@@ -43,11 +118,103 @@ |
} |
/// |
+// esCreateWindow() |
+// |
+// title - name for title bar of window |
+// width - width of window to create |
+// height - height of window to create |
+// flags - bitwise or of window creation flags |
+// ES_WINDOW_ALPHA - specifies that the framebuffer should have alpha |
+// ES_WINDOW_DEPTH - specifies that a depth buffer should be created |
+// ES_WINDOW_STENCIL - specifies that a stencil buffer should be created |
+// ES_WINDOW_MULTISAMPLE - specifies that a multi-sample buffer should be created |
+// |
+GLboolean ESUTIL_API esCreateWindow ( ESContext *esContext, const char* title, GLint width, GLint height, GLuint flags ) |
+{ |
+ EGLint attribList[] = |
+ { |
+ EGL_RED_SIZE, 5, |
+ EGL_GREEN_SIZE, 6, |
+ EGL_BLUE_SIZE, 5, |
+ EGL_ALPHA_SIZE, (flags & ES_WINDOW_ALPHA) ? 8 : EGL_DONT_CARE, |
+ EGL_DEPTH_SIZE, (flags & ES_WINDOW_DEPTH) ? 8 : EGL_DONT_CARE, |
+ EGL_STENCIL_SIZE, (flags & ES_WINDOW_STENCIL) ? 8 : EGL_DONT_CARE, |
+ EGL_SAMPLE_BUFFERS, (flags & ES_WINDOW_MULTISAMPLE) ? 1 : 0, |
+ EGL_NONE |
+ }; |
+ |
+ if ( esContext == NULL ) |
+ { |
+ return GL_FALSE; |
+ } |
+ |
+ esContext->width = width; |
+ esContext->height = height; |
+ |
+ if ( !WinCreate ( esContext, title) ) |
+ { |
+ return GL_FALSE; |
+ } |
+ |
+ |
+ if ( !CreateEGLContext ( esContext->hWnd, |
+ &esContext->eglDisplay, |
+ &esContext->eglContext, |
+ &esContext->eglSurface, |
+ attribList) ) |
+ { |
+ return GL_FALSE; |
+ } |
+ |
+ |
+ return GL_TRUE; |
+} |
+ |
+/// |
+// esMainLoop() |
+// |
+// Start the main loop for the OpenGL ES application |
+// |
+void ESUTIL_API esMainLoop ( ESContext *esContext ) |
+{ |
+ WinLoop ( esContext ); |
+} |
+ |
+ |
+/// |
+// esRegisterDrawFunc() |
+// |
+void ESUTIL_API esRegisterDrawFunc ( ESContext *esContext, void (ESCALLBACK *drawFunc) (ESContext* ) ) |
+{ |
+ esContext->drawFunc = drawFunc; |
+} |
+ |
+ |
+/// |
+// esRegisterUpdateFunc() |
+// |
+void ESUTIL_API esRegisterUpdateFunc ( ESContext *esContext, void (ESCALLBACK *updateFunc) ( ESContext*, float ) ) |
+{ |
+ esContext->updateFunc = updateFunc; |
+} |
+ |
+ |
+/// |
+// esRegisterKeyFunc() |
+// |
+void ESUTIL_API esRegisterKeyFunc ( ESContext *esContext, |
+ void (ESCALLBACK *keyFunc) (ESContext*, unsigned char, int, int ) ) |
+{ |
+ esContext->keyFunc = keyFunc; |
+} |
+ |
+ |
+/// |
// esLogMessage() |
// |
// Log an error message to the debug output for the platform |
// |
-void esLogMessage ( const char *formatStr, ... ) |
+void ESUTIL_API esLogMessage ( const char *formatStr, ... ) |
{ |
va_list params; |
char buf[BUFSIZ]; |
@@ -60,12 +227,13 @@ |
va_end ( params ); |
} |
+ |
/// |
// esLoadTGA() |
// |
// Loads a 24-bit TGA image from a file |
// |
-char* esLoadTGA ( char *fileName, int *width, int *height ) |
+char* ESUTIL_API esLoadTGA ( char *fileName, int *width, int *height ) |
{ |
char *buffer; |
@@ -75,4 +243,4 @@ |
} |
return NULL; |
-} |
+} |