graphicstest/uibench/s60/src/eglenvironment.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/s60/src/eglenvironment.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,153 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+#include "eglenvironment.h"
+#include "egldefs.h"
+#include "eglerror.h"
+
+#include <gdi.h>
+
+
+_LIT(KErrEgl, "EGL error");
+//_LIT(KErrDisplayMode, "Unsupported display mode");
+
+
+/** 
+ * Report any error that occurs.
+ */
+void ProcessEglError()
+	{
+	User::Panic(KErrEgl, eglGetError());
+	}
+
+CEglEnvironment* CEglEnvironment::NewL(RWindow& aWindow)
+	{
+	CEglEnvironment* self = new(ELeave) CEglEnvironment(aWindow);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CEglEnvironment::CEglEnvironment(RWindow& aWindow) : iWindow(aWindow)
+	{
+	// empty
+	}
+
+CEglEnvironment::~CEglEnvironment()
+	{
+	// Make sure that this egl status is active
+    eglMakeCurrent(iDisplay, iSurface, iSurface, iContext);
+    if (iContext != EGL_NO_CONTEXT)
+        {
+        eglDestroyContext(iDisplay,iContext);
+        }
+    if (iSurface != EGL_NO_SURFACE)
+        {
+        eglDestroySurface(iDisplay,iSurface);
+        }   
+    // Call eglMakeCurrent() to ensure the surfaces and contexts are truly destroyed. 
+    eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+    //eglTerminate(iDisplay);
+    eglReleaseThread();
+	}
+
+void CEglEnvironment::ConstructL()
+	{
+	// Create display object
+	iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+	if (iDisplay == EGL_NO_DISPLAY)
+		{
+		ProcessEglError();
+		}
+
+	// Initialize display object
+	if (!eglInitialize(iDisplay, NULL, NULL))
+		{
+		ProcessEglError();
+		}
+
+	// Query number of configs available
+	EGLint numConfigs;
+	if (!eglGetConfigs(iDisplay, iConfig, KMaxConfigs, &numConfigs))
+		{
+		ProcessEglError();
+		}
+
+	const TDisplayMode dispMode = iWindow.DisplayMode();
+	const EGLint* attribList = NULL;
+	// Select attribs based on current display mode
+	switch (dispMode)
+		{
+    case EColor4K:	
+        attribList = KColor4KAttribList;
+        break;
+    case EColor64K:	
+         attribList = KColor64KAttribList;
+        break;
+    case EColor16M:	
+        attribList = KColor16MAttribList;
+        break;
+    case EColor16MA: 
+        attribList = KColor16MAAttribList;
+        break;
+    default:
+        attribList = KColor16MAAttribList;
+        //todo: check why this can panic (which displaymode is used)
+        //User::Panic(KErrDisplayMode, KErrNotSupported);
+		}
+	// Choose the config to use
+	if (!eglChooseConfig(iDisplay, attribList, iConfig, 1, &numConfigs))
+		{
+		ProcessEglError();
+		}
+	
+	// Create window surface to draw direct to
+	iSurface = eglCreateWindowSurface(iDisplay, iConfig[0], &iWindow, NULL);
+	if (iSurface == EGL_NO_SURFACE)
+		{
+		ProcessEglError();
+		}
+	
+	iContext = eglCreateContext(iDisplay, iConfig[0], EGL_NO_CONTEXT, NULL);
+	if(!iContext)
+        {
+        ProcessEglError();
+        }
+	}
+
+void CEglEnvironment::DrawToWindow() const
+    {
+    if(!eglMakeCurrent(iDisplay, iSurface, iSurface, iContext))
+        {
+        ProcessEglError();
+        }
+    // Flush colour buffer to the window surface
+    if(!eglSwapBuffers(iDisplay, iSurface))
+        {
+        ProcessEglError();
+        }
+    }
+
+EGLSurface CEglEnvironment::Surface() const
+	{
+	return iSurface;
+	}
+
+EGLDisplay CEglEnvironment::Display() const
+	{
+	return iDisplay;
+	}