egl/egltest/src/egltest_stress_sgimage.cpp
changeset 85 cdf2f6e5c390
equal deleted inserted replaced
69:3365349494cc 85:cdf2f6e5c390
       
     1 // Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 /**
       
    17  @file
       
    18  @test
       
    19 */
       
    20 
       
    21 #include <s32file.h>
       
    22 #include <test/t_simload.h>
       
    23 #include <test/tefunit.h>    //ASSERT_TRUE
       
    24 #include "egltest_stress_sgimage.h"
       
    25 
       
    26 TVerdict CEglTest_Stress::doTestStepL()
       
    27     {
       
    28     INFO_PRINTF1(_L("CEglTest_Stress:doTestStepL()"));
       
    29     
       
    30     TBuf<100> testCaseId;
       
    31     TestCaseName(testCaseId);
       
    32     SetTestStepID(testCaseId);
       
    33 
       
    34 #ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
       
    35     __UHEAP_MARK;
       
    36     
       
    37     //File server is used to generate simload ini file
       
    38     User::LeaveIfError(iFs.Connect());
       
    39   
       
    40     TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KVG_KHR_EGL_image | KEGL_KHR_image_pixmap);
       
    41     if(!ret)
       
    42         {
       
    43         // The extension is not supported
       
    44         RecordTestResultL();
       
    45         CloseTMSGraphicsStep();
       
    46         return TestStepResult();
       
    47         }
       
    48 
       
    49     //Create a config file and launch the simulated load app
       
    50     ReadIniValuesL();
       
    51     PrintConfigDataL();
       
    52     CreateSimLoadAppL();
       
    53 
       
    54     INFO_PRINTF1(_L("Creating a Semaphore to signal all child processes at once"));
       
    55     RSemaphore sem;
       
    56     User::LeaveIfError(sem.CreateGlobal(KEglStressTest(), iNumberChildProcesses));
       
    57     CleanupClosePushL(sem);
       
    58 
       
    59     //Information to be passed to the child process
       
    60     TSgImageInfo info;
       
    61     TSize size(iRSgImageWidth, iRSgImageHeight);
       
    62     info.iUsage = ESgUsageBitOpenVgImage | ESgUsageBitOpenVgSurface;
       
    63     info.iPixelFormat = iFormat;
       
    64     info.iSizeInPixels = size;
       
    65 
       
    66     //Utilise egl helper functions
       
    67     CreateEglSessionL();
       
    68     
       
    69     //Create a display and initialise it
       
    70     GetDisplayL();
       
    71     iEglSess->InitializeL();
       
    72     
       
    73     //Open RSGImage driver    
       
    74     iEglSess->OpenSgDriverL();
       
    75     
       
    76     EGL_LEAVE_ERROR(eglBindAPI(EGL_OPENVG_API));
       
    77  
       
    78     EGLContext context;
       
    79     for(TInt i=0; i<iNumberRSgImages; i++)
       
    80         {
       
    81         RSgImage image;
       
    82         iSgImageArray.InsertL(image, i);
       
    83         User::LeaveIfError(iSgImageArray[i].Create(info, NULL, NULL));
       
    84 
       
    85         EGLConfig config;
       
    86         if(i == 0)
       
    87             {
       
    88             //Only need to determine a matching configuration once
       
    89             ChooseConfigAndCreateContextL(iDisplay, context, config, iSgImageArray[i], KStressTestMainAppPanic, iAlphaPre);
       
    90             }
       
    91  
       
    92         EGLSurface surface = EGL_NO_SURFACE; //remove arm warning
       
    93         EGL_LEAVE_NULL(surface, CreatePixmapSurfaceL(iDisplay, config, iSgImageArray[i], iAlphaPre));
       
    94 
       
    95         EGL_LEAVE_ERROR(eglMakeCurrent(iDisplay, surface, surface, context));
       
    96          
       
    97         PaintSurfaceL(iDisplay, surface, context);
       
    98         EGL_LEAVE_ERROR(eglSwapBuffers(iDisplay, surface));
       
    99 
       
   100         if(iTestType == EStressVGImage)
       
   101             {
       
   102             EGL_LEAVE_ERROR(eglMakeCurrent(iDisplay, surface, surface, context));
       
   103             
       
   104             EGLImageKHR eglImage = 0; //removes arm compiler warning
       
   105             VGImage vgImage;
       
   106 
       
   107             EGL_LEAVE_NULL(eglImage, iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &iSgImageArray[i], (int*)KEglImageAttribsPreservedTrue));
       
   108             EGL_LEAVE_NULL(vgImage, iEglSess->vgCreateImageTargetKHR(eglImage));
       
   109 
       
   110             //Close the EGLImage
       
   111             EGL_LEAVE_ERROR(iEglSess->DestroyEGLImage(iDisplay, eglImage));
       
   112                         
       
   113             User::LeaveIfError(iVGImageArray.Insert(vgImage, i));
       
   114             }
       
   115 
       
   116         User::LeaveIfError(iSurfaceArray.Insert(surface, i));
       
   117         }
       
   118 
       
   119     /* Create and install the active scheduler */
       
   120     CActiveScheduler* sched = new(ELeave) CActiveScheduler;
       
   121     CActiveScheduler::Install(sched);
       
   122     CleanupStack::PushL(sched);
       
   123 
       
   124     TInt exitCounter = iNumberMainImages;
       
   125     TBool testResult = ETrue;
       
   126 
       
   127     //Create an active object for each RSgImage accessed in the main process
       
   128     CTReadWriteMain* painter = 0;
       
   129     for(TInt i=0; i<iNumberMainImages; i++)
       
   130         {
       
   131         if(iTestType == EStressVGImage)
       
   132             {
       
   133             painter = CTReadWriteMain::NewL(iDisplay, iSurfaceArray[i], context, iRSgImageWidth, iRSgImageHeight, iByteSize, iVgFormat, testResult, exitCounter, iTestType, iVGImageArray[i]);
       
   134             }
       
   135         else
       
   136             {
       
   137             painter = CTReadWriteMain::NewL(iDisplay, iSurfaceArray[i], context, iRSgImageWidth, iRSgImageHeight, iByteSize, iVgFormat, testResult, exitCounter, iTestType);            
       
   138             }
       
   139             
       
   140         CleanupStack::PushL(painter);
       
   141         painter->After(TTimeIntervalMicroSeconds32(0));
       
   142         }
       
   143 
       
   144     CreateChildProcessesL();
       
   145 
       
   146     INFO_PRINTF1(_L("Signaling all child processes at once - starts data access in the child processes"));
       
   147     sem.Signal(iNumberChildProcesses);
       
   148 
       
   149     //Start the active scheduler - starts data access in the main process
       
   150     sched->Start();
       
   151 
       
   152     if(testResult == EFalse)
       
   153         {
       
   154 		if (iTestType == EStressReadWriteSingleImage || iTestType == EStressReadWriteMultiImage)
       
   155 			{
       
   156 			// For GRAPHICS-EGL-0428 and GRAPHICS-EGL-0437 data integrity cannot be guaranteed on 
       
   157 			// all implementations, so the pixel value checking aspects of these tests are regarded as optional   
       
   158 			WARN_PRINTF1(_L("Unexpected pixel colour"));
       
   159 			}
       
   160 		else
       
   161 			{
       
   162 			ERR_PRINTF1(_L("Unexpected pixel colour"));
       
   163 			SetTestStepResult(EFail);
       
   164 			}
       
   165         }
       
   166 
       
   167     //Check that each child process has completed without error
       
   168     for(TInt i=0; i<iNumberChildProcesses; i++)
       
   169        {
       
   170        TRequestStatus status;
       
   171        iProcessArray[i].Logon(status);
       
   172        User::WaitForRequest(status);
       
   173 
       
   174        if(status != KErrNone)
       
   175            {
       
   176 		   if (status == KTestStressUnexpectedPixelError && (iTestType == EStressReadWriteSingleImage || iTestType == EStressReadWriteMultiImage))
       
   177 			   {
       
   178 			   // For GRAPHICS-EGL-0428 and GRAPHICS-EGL-0437 data integrity cannot be guaranteed on 
       
   179 			   // all implementations, so the pixel value checking aspects of these tests are regarded as optional
       
   180 			   // So check that if it fails, it fails for the expected reason of no matching pixel.
       
   181 			   WARN_PRINTF2(_L("Child Process completed with code %d, expected KErrNone"), status.Int());
       
   182 			   }
       
   183 		   else
       
   184 			   {
       
   185 			   ERR_PRINTF2(_L("Child Process completed with code %d, expected KErrNone"), status.Int());
       
   186 			   SetTestStepResult(EFail);
       
   187 			   }
       
   188            }
       
   189        }
       
   190 
       
   191     DestroySimLoadProcess();
       
   192     DeleteConfigData();
       
   193     ClearDownArraysL(iDisplay);
       
   194     EGL_LEAVE_ERROR(eglDestroyContext(iDisplay, context));
       
   195 
       
   196     CleanupStack::PopAndDestroy(iNumberMainImages + 2, &sem); //(iNumberMainImages + 1) active objects, sched, sem
       
   197     iEglSess->CloseSgDriver();
       
   198     
       
   199     CleanAll();
       
   200     iFs.Close();
       
   201 
       
   202     __UHEAP_MARKEND;
       
   203 
       
   204 #else
       
   205     INFO_PRINTF2(_L("%S can only be run with SgImage-Lite"), &testCaseId);
       
   206 #endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
       
   207     
       
   208     //Comply with the terrific TMS
       
   209     RecordTestResultL();
       
   210     CloseTMSGraphicsStep();
       
   211 
       
   212     return TestStepResult();
       
   213     }
       
   214 
       
   215 CEglTest_Stress::~CEglTest_Stress()
       
   216     {
       
   217     //Free memory and close handles in case of panic in the doTestStepL()
       
   218     delete iEglSess;
       
   219     
       
   220     iFs.Close();
       
   221     iSurfaceArray.Close();
       
   222     iProcessArray.Close();
       
   223     iSgImageArray.Close();
       
   224     iVGImageArray.Close();
       
   225     }
       
   226 
       
   227 void CEglTest_Stress::PaintSurfaceL(EGLDisplay aDisplay, EGLSurface aSurface, EGLContext aContext)
       
   228     {
       
   229     //Clear surface background, format of the constant is ARGB
       
   230     //Match the colour to that of the defined constant
       
   231     VGfloat red = 0.0;
       
   232     VGfloat green = 0.0;
       
   233     VGfloat blue = 0.0;
       
   234     VGfloat alpha = 0.0;
       
   235     
       
   236     //Care taken to avoid fixed width -> floating point -> fixed width rounding errors
       
   237     if(iByteSize == 4)
       
   238         {
       
   239         red = 1.0 * ((KColourInitial32 & 0x00FF0000) >> 16)/255;
       
   240         green = 1.0 * ((KColourInitial32 & 0x0000FF00) >> 8)/255;
       
   241         blue = 1.0 * (KColourInitial32 & 0x000000FF)/255;
       
   242         alpha = 1.0 * ((KColourInitial32 & 0xFF000000) >> 24)/255;        
       
   243         }
       
   244     else //iByteSize == 2
       
   245         {
       
   246         red = 1.0 * ((KColourInitial16 & 0x7C00) >> 11)/31;
       
   247         green = 1.0 * ((KColourInitial16 & 0x0480) >> 5)/63;
       
   248         blue = 1.0 * (KColourInitial16 & 0x001F)/31;
       
   249         }
       
   250 
       
   251     //Format of the constant is RGBA (32 bit) 
       
   252     VGfloat bgColor[] = {red, green, blue, alpha};
       
   253 
       
   254     EGL_LEAVE_ERROR(eglMakeCurrent(aDisplay, aSurface, aSurface, aContext));
       
   255  
       
   256     vgSetfv(VG_CLEAR_COLOR, 4, bgColor);
       
   257     ASSERT_VG_TRUE(vgGetError() == VG_NO_ERROR);
       
   258     vgClear(0, 0, iRSgImageWidth, iRSgImageHeight);
       
   259     ASSERT_VG_TRUE(vgGetError() == VG_NO_ERROR);
       
   260     }
       
   261 
       
   262 void CEglTest_Stress::CreateChildProcessL(TInt aProcessNumber, TTestType aTestType, TSgDrawableId aDrawableId)
       
   263     {
       
   264     TRequestStatus status;
       
   265     RProcess client;
       
   266     User::LeaveIfError(client.Create(KStressTestClientApp, KNullDesC));
       
   267 
       
   268     //Pass image and test information to the child process
       
   269     TStressProcessInfo info;
       
   270     info.iTestType = aTestType;
       
   271     info.iSgId = aDrawableId;
       
   272     info.iByteSize = iByteSize;
       
   273     info.iAlphaPre = iAlphaPre;
       
   274 
       
   275     TPckg<TStressProcessInfo> pckgInfo(info);
       
   276     User::LeaveIfError((client.SetParameter(KMultiProcessSlot, pckgInfo)));
       
   277 
       
   278     client.Rendezvous(status);
       
   279     client.Resume();
       
   280     User::WaitForRequest(status);
       
   281     TEST(status == KErrNone);
       
   282 
       
   283     //Store image handle for cleanup
       
   284     iProcessArray.InsertL(client, aProcessNumber);
       
   285     }
       
   286 
       
   287 void CEglTest_Stress::CreateChildProcessesL()
       
   288     {
       
   289     for(TInt i=0; i<iNumberChildProcesses; i++)
       
   290         {
       
   291         switch(iTestType)
       
   292             {
       
   293             case EStressReadWriteMultiImage:
       
   294             case EStressPixmapSurface:
       
   295                 {
       
   296                 //Each child process accesses one SgImage
       
   297                 CreateChildProcessL(i, iTestType, iSgImageArray[i].Id());
       
   298                 break;
       
   299                 }
       
   300             case EStressRead:
       
   301             case EStressReadWriteSingleImage:
       
   302             case EStressVGImage:
       
   303                 {
       
   304                 //All child processes access the same SgImage
       
   305                 CreateChildProcessL(i, iTestType, iSgImageArray[0].Id());
       
   306                 break;
       
   307                 }
       
   308             default:
       
   309                 User::Panic(KStressTestMainAppPanic, KErrNotFound);
       
   310                 break;
       
   311             }
       
   312         }
       
   313     }
       
   314 
       
   315 void CEglTest_Stress::ClearDownArraysL(EGLDisplay aDisplay)
       
   316     {
       
   317     for(TInt i=0; i<iSurfaceArray.Count(); i++)
       
   318         {
       
   319         ASSERT_EGL_TRUE(eglDestroySurface(aDisplay, iSurfaceArray[i]));
       
   320         }
       
   321     
       
   322     for(TInt i=0; i<iVGImageArray.Count(); i++)
       
   323         {
       
   324         vgDestroyImage(iVGImageArray[i]);
       
   325         ASSERT_VG_TRUE(vgGetError() == VG_NO_ERROR);
       
   326         }
       
   327     
       
   328     for(TInt i=0; i<iProcessArray.Count(); i++)
       
   329         {
       
   330         iProcessArray[i].Close();
       
   331         }
       
   332 
       
   333     for(TInt i=0; i<iSgImageArray.Count(); i++)
       
   334         {
       
   335         iSgImageArray[i].Close();
       
   336         }
       
   337     
       
   338     iSurfaceArray.Close();
       
   339     iProcessArray.Close();
       
   340     iSgImageArray.Close();
       
   341     iVGImageArray.Close();
       
   342     }
       
   343 
       
   344 void CEglTest_Stress::CreateSimLoadAppL()
       
   345     {
       
   346     TInt index = 1;
       
   347     TBuf<100> tempStore;
       
   348 
       
   349     //Three simload processes need to be launched t_simloadapp1.exe - t_simloadapp3.exe
       
   350     while(index <= KNumSimLoadApps)
       
   351         {
       
   352         tempStore.Format(KSimLoadApp, index++);
       
   353         CreateSimLoadProcessL(tempStore);
       
   354         }
       
   355     }
       
   356 
       
   357 void CEglTest_Stress::CreateSimLoadProcessL(const TDesC& aApp)
       
   358     {
       
   359     INFO_PRINTF2(_L("Starting App: %S"), &aApp);
       
   360 
       
   361     RProcess process;
       
   362     User::LeaveIfError(process.Create(aApp, KNullDesC));
       
   363 
       
   364     //Give the simulated load high priority to be sure it does its job
       
   365     process.SetPriority(EPriorityHigh);
       
   366     TEST(process.Priority() == EPriorityHigh);
       
   367     INFO_PRINTF3(_L("Process Priority: Actual: %d, Expected: %d"), process.Priority(), EPriorityHigh);
       
   368     process.Resume();
       
   369     
       
   370     iProcessList.AppendL(process);
       
   371     }
       
   372 
       
   373 void CEglTest_Stress::DestroySimLoadProcess()
       
   374     {
       
   375     for (TInt index = 0; index < iProcessList.Count(); index++)
       
   376         {
       
   377         // check process
       
   378         INFO_PRINTF3(_L("Process Check: Actual: %d, Expected: %d"), iProcessList[index].ExitReason(), KErrNone);
       
   379         TEST(iProcessList[index].ExitReason( )== KErrNone);
       
   380 
       
   381         // kill process
       
   382         iProcessList[index].Kill(KErrGeneral);
       
   383         INFO_PRINTF3(_L("Process Exit Reason: Actual: %d, Expected: %d"), iProcessList[index].ExitReason(), KErrGeneral);
       
   384         TEST(iProcessList[index].ExitReason() == KErrGeneral);
       
   385 
       
   386         iProcessList[index].Close();
       
   387         }
       
   388 
       
   389     iProcessList.Close();
       
   390     }
       
   391 
       
   392 void CEglTest_Stress::ReadIniValueL(const TDesC& aSectName, const TDesC& aKeyName, TInt& aResult)
       
   393     {
       
   394     if(!GetIntFromConfig(aSectName, aKeyName, aResult))
       
   395         {
       
   396         ERR_PRINTF2(_L("Error reading %S value from ini file"), &aKeyName);
       
   397         User::Leave(KErrNotFound);
       
   398         }
       
   399 
       
   400     INFO_PRINTF3(_L("Ini file value %S = %d"), &aKeyName, aResult);
       
   401     }
       
   402 
       
   403 void CEglTest_Stress::ReadIniValuesL()
       
   404     {
       
   405     ReadIniValueL(ConfigSection(), KNumberRSgImages, iNumberRSgImages);
       
   406     ReadIniValueL(ConfigSection(), KNumberMainImages, iNumberMainImages);
       
   407     ReadIniValueL(ConfigSection(), KNumberChildProcesses, iNumberChildProcesses);
       
   408     ReadIniValueL(ConfigSection(), KRSgImageWidth, iRSgImageWidth);
       
   409     ReadIniValueL(ConfigSection(), KRSgImageHeight, iRSgImageHeight);
       
   410     ReadIniValueL(ConfigSection(), KConfigSimLoadValue, iSimLoadValue);
       
   411     
       
   412     //Check for erroneous ini values
       
   413     ASSERT_TRUE(iNumberChildProcesses <= iNumberRSgImages);
       
   414     ASSERT_TRUE(iNumberMainImages <= iNumberRSgImages);
       
   415     ASSERT_TRUE(iRSgImageWidth >= 0);
       
   416     ASSERT_TRUE(iRSgImageHeight >= 0);
       
   417     ASSERT_TRUE(iSimLoadValue >= 0);
       
   418     ASSERT_TRUE(iSimLoadValue <= 100);
       
   419     
       
   420     TBuf16<100> buffer;
       
   421     TPtrC16 ptrBuffer(buffer);
       
   422     if(!GetStringFromConfig(ConfigSection(), KPixelFormat, ptrBuffer))
       
   423         {
       
   424         ERR_PRINTF2(_L("Error reading %S value from ini file"), &KPixelFormat);
       
   425         User::Leave(KErrNotFound);
       
   426         }
       
   427 
       
   428     INFO_PRINTF3(_L("Ini file value %S = %S"), &KPixelFormat, &ptrBuffer);
       
   429 
       
   430     //Derive information from the pixel format
       
   431     if(ptrBuffer == KUidPixelFormatARGB_8888)
       
   432         {
       
   433         iFormat = EUidPixelFormatARGB_8888;
       
   434         iVgFormat = VG_sARGB_8888;
       
   435         iAlphaPre = EFalse;
       
   436         iByteSize = 4;
       
   437         }
       
   438     else if(ptrBuffer == KUidPixelFormatARGB_8888_PRE)
       
   439         {
       
   440         iFormat = EUidPixelFormatARGB_8888_PRE;
       
   441         iVgFormat = VG_sARGB_8888_PRE;
       
   442         iAlphaPre = ETrue;
       
   443         iByteSize = 4;
       
   444         }
       
   445     else if(ptrBuffer == KUidPixelFormatRGB_565)
       
   446         {
       
   447         iFormat = EUidPixelFormatRGB_565;
       
   448         iVgFormat = VG_sRGB_565;
       
   449         iAlphaPre = EFalse;
       
   450         iByteSize = 2;
       
   451         }
       
   452     else
       
   453         {
       
   454         ERR_PRINTF2(_L("Unsupported pixel format %S"), &ptrBuffer);
       
   455         User::Leave(KErrNotFound);
       
   456         }
       
   457 
       
   458      //Determine the test type from the ini file section name
       
   459      if(ConfigSection().Find(KStressReadOnly) != KErrNotFound)
       
   460          {
       
   461          iTestType = EStressRead;
       
   462          }
       
   463      else if(ConfigSection().Find(KEStressReadWriteSingleImage) != KErrNotFound)
       
   464          {
       
   465          iTestType = EStressReadWriteSingleImage;
       
   466          }
       
   467      else if(ConfigSection().Find(KStressReadWriteMultiImage) != KErrNotFound)
       
   468          {
       
   469          iTestType = EStressReadWriteMultiImage;
       
   470          }
       
   471      else if(ConfigSection().Find(KStressVGImage) != KErrNotFound)
       
   472          {
       
   473          iTestType = EStressVGImage;
       
   474          }
       
   475      else if(ConfigSection().Find(KStressPixmapSurface) != KErrNotFound)
       
   476          {
       
   477          iTestType = EStressPixmapSurface;
       
   478          }
       
   479      else
       
   480          {
       
   481          ERR_PRINTF2(_L("Unknown test case %S"), &ptrBuffer);
       
   482          User::Leave(KErrNotFound);
       
   483          }
       
   484     }
       
   485 
       
   486 /** 
       
   487  *   This function generates an ini file for the simulated load application
       
   488  *   containing two lines to determine
       
   489  *   1. The type of load (static or spiked, in this case always static)
       
   490  *   2. The simulated load level
       
   491  */
       
   492 void CEglTest_Stress::PrintConfigDataL()
       
   493     {
       
   494     RFileWriteStream writer;
       
   495     writer.PushL();
       
   496 
       
   497     TInt err = iFs.MkDirAll(KSimLoadConfigFile);
       
   498     TEST(err == KErrNone || err == KErrAlreadyExists);
       
   499     INFO_PRINTF2(_L("Create Config File: %S"), &KSimLoadConfigFile);
       
   500     User::LeaveIfError(writer.Replace(iFs, KSimLoadConfigFile, EFileStreamText|EFileWrite));
       
   501     writer.CommitL();
       
   502 
       
   503     CleanupStack::PopAndDestroy(&writer);
       
   504 
       
   505     CIniData* data=CIniData::NewL(KSimLoadConfigFile);
       
   506     CleanupStack::PushL(data);
       
   507 
       
   508     INFO_PRINTF3(_L("Config Name: %S, \t\tConfig Data: %S"), &KConfigSimLoadType, &KConfigSimLoadStatic);
       
   509     err = data->AddValue(KDefaultSectionName, KConfigSimLoadType, KConfigSimLoadStatic);
       
   510     INFO_PRINTF3(_L("AddValue - Expected: %d, Actual: %d"), KErrNone, err);
       
   511     TEST(err == KErrNone);
       
   512 
       
   513     TBuf16<100> buffer;
       
   514     TPtrC16 ptrBuffer(buffer);
       
   515     User::LeaveIfError(GetStringFromConfig(ConfigSection(), KConfigSimLoadValue, ptrBuffer));
       
   516 
       
   517     INFO_PRINTF3(_L("Config Name: %S, \t\tConfig Data: %S"), &KConfigSimLoadValue, &ptrBuffer);
       
   518     err = data->AddValue(KDefaultSectionName, KConfigSimLoadValue, ptrBuffer);
       
   519 
       
   520     INFO_PRINTF3(_L("AddValue - Expected: %d, Actual: %d"), KErrNone, err);
       
   521     TEST(err == KErrNone);
       
   522 
       
   523     data->WriteToFileL();
       
   524     CleanupStack::PopAndDestroy(data);
       
   525     }
       
   526 
       
   527 void CEglTest_Stress::DeleteConfigData()
       
   528     {
       
   529     INFO_PRINTF2(_L("Deleting Config File Name: %S"), &KSimLoadConfigFile);
       
   530     TInt err = iFs.Delete(KSimLoadConfigFile);
       
   531     TEST(err==KErrNone);
       
   532     }
       
   533 
       
   534 /**
       
   535  *    class CTReadWriteMain
       
   536  *    A Child of CTReadWrite which contains member data not included in the base class and 
       
   537  *    implementations of pure virtual functions.
       
   538  *    a) One for each particular test case
       
   539  *    b) Support functions MakeCurrentL() and IsFinished()
       
   540  *    
       
   541  *    The base class is an active object and the implemented virtual functions are invoked
       
   542  *    indirectly from the RunL() function
       
   543  */
       
   544 CTReadWriteMain::CTReadWriteMain(EGLDisplay aDisplay, EGLSurface aSurface, EGLContext aContext, TInt aWidth, TInt aHeight, TInt aByteSize, VGImageFormat aFormat, TBool& aTestPass, TInt& aFinishedCounter, const TTestType& aTestType)
       
   545 : CTReadWrite(aWidth, aHeight, aByteSize, aFormat, aTestType, aTestPass),
       
   546     iDisplay(aDisplay),
       
   547     iSurface(aSurface),
       
   548     iContext(aContext),
       
   549     iFinishedCounter(aFinishedCounter)
       
   550     {
       
   551     }
       
   552 
       
   553 CTReadWriteMain* CTReadWriteMain::NewL(EGLDisplay aDisplay, EGLSurface aSurface, EGLContext aContext, TInt aWidth, TInt aHeight, TInt aByteSize, VGImageFormat aFormat, TBool& aTestPass, TInt& aFinishedCounter, const TTestType& aTestType, VGImage aVGImage)
       
   554     {
       
   555     CTReadWriteMain* self = new (ELeave) CTReadWriteMain(aDisplay, aSurface, aContext, aWidth, aHeight, aByteSize, aFormat, aTestPass, aFinishedCounter, aTestType);
       
   556     CleanupStack::PushL(self);
       
   557     self->ConstructL(aVGImage);
       
   558     CleanupStack::Pop(self);
       
   559     return self;
       
   560     }
       
   561 
       
   562 void CTReadWriteMain::ConstructL(VGImage aVGImage)
       
   563     {
       
   564     //NULL values indicate a programming error
       
   565     if( (iDisplay == EGL_NO_DISPLAY) || (iSurface == EGL_NO_SURFACE) || (iContext == EGL_NO_CONTEXT) || (iFinishedCounter == 0) || ((iTestType == EStressVGImage) && (aVGImage == NULL)) )
       
   566         {
       
   567         User::Leave(KErrArgument);
       
   568         }
       
   569     
       
   570     iVGImage = aVGImage;
       
   571     
       
   572     //Call base class function to complete construction
       
   573      CTReadWrite::ConstructL();
       
   574     }
       
   575 
       
   576 void CTReadWriteMain::MakeCurrentL() const
       
   577     {
       
   578     EGL_LEAVE_ERROR(eglMakeCurrent(iDisplay, iSurface, iSurface, iContext));
       
   579     }
       
   580 
       
   581 void CTReadWriteMain::ReadImageFuncL()
       
   582     {
       
   583     vgReadPixels(iData, iWidth*iByteSize, iFormat, 0, 0, iWidth, iHeight);
       
   584     VgLeaveIfErrorL();
       
   585     }
       
   586 
       
   587 void CTReadWriteMain::ReadFuncL()
       
   588     {
       
   589     ReadImageFuncL();
       
   590     }
       
   591 
       
   592 void CTReadWriteMain::WriteImageFuncL()
       
   593     {
       
   594     vgWritePixels(iData, iWidth*iByteSize, iFormat, 0, 0, iWidth, iHeight);
       
   595     VgLeaveIfErrorL();
       
   596     }
       
   597 
       
   598 TBool CTReadWriteMain::IsFinished()
       
   599     {
       
   600     iFinishedCounter--;
       
   601 
       
   602     if(iFinishedCounter <= 0)
       
   603         {
       
   604         return ETrue;
       
   605         }
       
   606 
       
   607     return EFalse;
       
   608     }
       
   609 
       
   610 void CTReadWriteMain::VgImageFuncL()
       
   611     {
       
   612     //Alter the image data, actual pixel values are not important
       
   613     for(TInt i=0; i<iBufferSize; i++)
       
   614         {
       
   615         const TUint32 temp = iBufferSize % iFrameNumber;
       
   616         iData[i] = temp + (temp << 8) + (temp << 16) + (temp << 24);
       
   617         }
       
   618     
       
   619     //Currently panics as context->scanlinebuffer is NULL
       
   620     vgImageSubData(iVGImage, iData, iWidth*iByteSize, iFormat, 0, 0, iWidth, iHeight);
       
   621     VgLeaveIfErrorL();
       
   622     
       
   623     EGL_LEAVE_ERROR(eglSwapBuffers(iDisplay, iSurface));
       
   624     }
       
   625 
       
   626 void CTReadWriteMain::PixmapSurfaceFuncL()
       
   627     {
       
   628     // clear surface background to an arbitrary colour
       
   629     VGfloat arbitraryColour = (1.0*iFrameNumber)/KNumberOfFrames;
       
   630     VGfloat backgroundColour[] = {1.0 - arbitraryColour/2, arbitraryColour/2, 1.0 - arbitraryColour, arbitraryColour};
       
   631     vgSetfv(VG_CLEAR_COLOR, 4, backgroundColour);
       
   632     VgLeaveIfErrorL();
       
   633     vgClear(0, 0, iWidth, iHeight);
       
   634     VgLeaveIfErrorL();
       
   635 
       
   636     EGL_LEAVE_ERROR(eglSwapBuffers(iDisplay, iSurface));
       
   637     }