diff -r 000000000000 -r 5d03bc08d59c graphicstest/uibench/s60/src/eglenvironment.cpp --- /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 + + +_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; + }