diff -r 000000000000 -r bde4ae8d615e os/graphics/egl/egltest/src/egltest_stress_process_sgimage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/graphics/egl/egltest/src/egltest_stress_process_sgimage.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,198 @@ +// Copyright (c) 2010 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: +// + +/** + @file + @test +*/ + +#include "egltest_stress_process_sgimage.h" + +GLDEF_C TInt E32Main() + { + RDebug::Print(_L("Stress test client process::E32Main - entry")); + CTrapCleanup* TheTrapCleanup = CTrapCleanup::New(); + + TRAPD(err, LaunchClientProcessL()); + if (err) + { + User::Panic(KStressTestChildAppPanic, err); + } + + delete TheTrapCleanup; + + RDebug::Print(_L("Stress test client process::E32Main - exit")); + return KErrNone; + } + +LOCAL_C void LaunchClientProcessL() + { + __UHEAP_MARK; + RProcess::Rendezvous(KErrNone); + + RSemaphore sem; + User::LeaveIfError(sem.OpenGlobal(KEglStressTest)); + CleanupClosePushL(sem); + + //Access data passed from the main process + TStressProcessInfo info; + TPckg pckgInfo(info); + User::LeaveIfError(User::GetDesParameter(KMultiProcessSlot, pckgInfo)); + + //Create RSgDriver and open the image + RSgDriver driver; + User::LeaveIfError(driver.Open()); + CleanupClosePushL(driver); + + RSgImage image; + User::LeaveIfError(image.Open(info.iSgId)); + CleanupClosePushL(image); + + EGLDisplay display; + EGL_LEAVE_NULL(display, eglGetDisplay(EGL_DEFAULT_DISPLAY)); + EGL_LEAVE_ERROR(eglInitialize(display, NULL, NULL)); + EGL_LEAVE_ERROR(eglBindAPI(EGL_OPENVG_API)); + + //Initialise to remove arm compiler warnings + EGLConfig config = 0; + EGLContext context = EGL_NO_CONTEXT; + EGLSurface surface = EGL_NO_SURFACE; + + if(info.iTestType == EStressRead) + { + TSgImageInfo sginfo; + User::LeaveIfError(image.GetInfo(sginfo)); + + //Create an independant pixmap surface on which to copy the vgimage + RSgImage image2; + User::LeaveIfError(image2.Create(sginfo, NULL, NULL)); + CleanupClosePushL(image2); + ChooseConfigAndCreateContextL(display, context, config, image2, KStressTestChildAppPanic, info.iAlphaPre); + EGL_LEAVE_NULL(surface, CreatePixmapSurfaceL(display, config, image2, info.iAlphaPre)); + CleanupStack::PopAndDestroy(&image2); + } + else + { + ChooseConfigAndCreateContextL(display, context, config, image, KStressTestChildAppPanic, info.iAlphaPre); + EGL_LEAVE_NULL(surface, CreatePixmapSurfaceL(display, config, image, info.iAlphaPre)); + } + + EGL_LEAVE_ERROR(eglMakeCurrent(display, surface, surface, context)); + + VGImage vgImage; + GenerateVgImageL(display, &image, vgImage); + + /* Create and install the active scheduler */ + CActiveScheduler* sched = new(ELeave) CActiveScheduler; + CActiveScheduler::Install(sched); + CleanupStack::PushL(sched); + + TInt width = vgGetParameteri(vgImage, VG_IMAGE_WIDTH); + VgLeaveIfErrorL(); + + TInt height = vgGetParameteri(vgImage, VG_IMAGE_HEIGHT); + VgLeaveIfErrorL(); + + VGImageFormat format = static_cast(vgGetParameteri(vgImage, VG_IMAGE_FORMAT)); + VgLeaveIfErrorL(); + + TBool testPass = ETrue; + + CTReadWriteChild* painter = CTReadWriteChild::NewL(vgImage, width, height, info.iByteSize, format, info.iTestType, testPass); + CleanupStack::PushL(painter); + painter->After(TTimeIntervalMicroSeconds32(0)); + + //Data access is synchronised from the main process + sem.Wait(); + sched->Start(); + + if(testPass == EFalse) + { + // Leave with a 'known' test error so that we can catch this particular failure + User::Leave(KTestStressUnexpectedPixelError); + } + + CleanupStack::PopAndDestroy(5, &sem); //painter, sched, image, driver, sem + + __UHEAP_MARKEND; + } + +/** + * class CTReadWriteChild + * A Child of CTReadWrite which contains member data not included in the base class and + * implementations of pure virtual functions. + * a) One for each particular test case + * b) Support functions MakeCurrentL() and IsFinished() + * + * The base class is an active object and the implemented virtual functions are invoked + * indirectly from the RunL() function + */ +CTReadWriteChild::CTReadWriteChild(VGImage aImage, TInt aWidth, TInt aHeight, TInt aByteSize, VGImageFormat aFormat, const TTestType& aTestType, TBool& aTestPass) +: CTReadWrite(aWidth, aHeight, aByteSize, aFormat, aTestType, aTestPass), + iImage(aImage) + { + } + +CTReadWriteChild* CTReadWriteChild::NewL(VGImage aImage, TInt aWidth, TInt aHeight, TInt aByteSize, VGImageFormat aFormat, const TTestType& aTestType, TBool& aTestPass) + { + CTReadWriteChild* self = new (ELeave) CTReadWriteChild(aImage, aWidth, aHeight, aByteSize, aFormat, aTestType, aTestPass); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CTReadWriteChild::MakeCurrentL() const + { + } + +void CTReadWriteChild::ReadImageFuncL() + { + vgGetImageSubData(iImage, iData, iWidth*iByteSize, iFormat, 0, 0, iWidth, iHeight); + VgLeaveIfErrorL(); + } + +void CTReadWriteChild::ReadFuncL() + { + vgDrawImage(iImage); + vgReadPixels(iData, iWidth*iByteSize, iFormat, 0, 0, iWidth, iHeight); + VgLeaveIfErrorL(); + + //Small delay to aid pixel access sharing between processes + User::After(TTimeIntervalMicroSeconds32(1000)); + } + +void CTReadWriteChild::WriteImageFuncL() + { + vgImageSubData(iImage, iData, iWidth*iByteSize, iFormat, 0, 0, iWidth, iHeight); + VgLeaveIfErrorL(); + } + +TBool CTReadWriteChild::IsFinished() + { + return ETrue; + } + +void CTReadWriteChild::VgImageFuncL() + { + vgDrawImage(iImage); + VgLeaveIfErrorL(); + } + +void CTReadWriteChild::PixmapSurfaceFuncL() + { + vgDrawImage(iImage); + VgLeaveIfErrorL(); + }