egl/egltest/src/egltest_stress_common_sgimage.cpp
branchRCL_3
changeset 19 bbf46f59e123
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/src/egltest_stress_common_sgimage.cpp	Tue Aug 31 16:31:06 2010 +0300
@@ -0,0 +1,283 @@
+// 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:
+//
+
+/**
+ @file
+ @test
+*/
+
+#include "egltest_stress_common_sgimage.h"
+
+void ChooseConfigAndCreateContextL(EGLDisplay& aDisplay, EGLContext& aContext, EGLConfig& aConfig, const RSgImage& aSgImage, const TDesC& aPanicString, TBool aPreMultAlpha)
+    {
+    EGLConfig configs[KMaxEglConfigs];
+    EGLint numConfigs = 0;
+
+    //If the aPixmap argument is ETrue, then the attributes are for a pixmap surface
+    //Otherwise, the surface will be of type pbuffer. Note assumption on the position
+    //of the EGL_MATCH_NATIVE_PIXMAP and EGL_SURFACE_TYPE attribute/value pair
+    EGLint KAttrib_list_RSgImage[] = { EGL_MATCH_NATIVE_PIXMAP,    (TInt)&aSgImage,
+                                       EGL_RENDERABLE_TYPE,       EGL_OPENVG_BIT,
+                                       EGL_SURFACE_TYPE,          EGL_PIXMAP_BIT,
+                                       EGL_NONE };
+    
+    if(aPreMultAlpha != EFalse)
+        {
+        KAttrib_list_RSgImage[5] |= EGL_VG_ALPHA_FORMAT_PRE_BIT;
+        }
+
+    EGL_LEAVE_ERROR(eglChooseConfig(aDisplay, KAttrib_list_RSgImage, configs, KMaxEglConfigs, &numConfigs));
+    
+    if(numConfigs > 0)
+        {
+        //Choose an arbitrary config
+        aConfig = configs[0];        
+        }
+    else
+        {
+        User::Panic(aPanicString , KErrNotSupported);      
+        }
+    
+    //One context is sufficient for all surfaces
+    EGL_LEAVE_NULL(aContext, eglCreateContext(aDisplay, aConfig, EGL_NO_CONTEXT, NULL));
+    }
+
+EGLSurface CreatePixmapSurfaceL(EGLDisplay aDisplay, EGLConfig aConfig, const RSgImage& aSgImage, TBool aAlphaPre)
+    {
+    EGLSurface surface = EGL_NO_SURFACE;
+
+    if(aAlphaPre == EFalse)
+        {
+        EGL_LEAVE_NULL(surface, eglCreatePixmapSurface(aDisplay, aConfig, (void*)&aSgImage, KPixmapAttribsVgAlphaFormatNonPre));
+        }
+    else
+        {
+        EGL_LEAVE_NULL(surface, eglCreatePixmapSurface(aDisplay, aConfig, (void*)&aSgImage, KPixmapAttribsVgAlphaFormatPre));
+        }
+    
+    return surface;
+    }
+
+void GenerateVgImageL(const EGLDisplay aDisplay, RSgImage* aImage, VGImage& aVgImage)
+    {
+    EGLImageKHR eglImage = 0;
+
+    TFPtrEglCreateImageKhr ipfnEglCreateImageKHR = reinterpret_cast<TFPtrEglCreateImageKhr>(eglGetProcAddress("eglCreateImageKHR"));
+    EGL_LEAVE_ERROR(ipfnEglCreateImageKHR);
+
+    TFPtrVgCreateEglImageTargetKhr ipfnvgCreateImageTargetKHR = reinterpret_cast<TFPtrVgCreateEglImageTargetKhr>(eglGetProcAddress("vgCreateEGLImageTargetKHR"));
+    EGL_LEAVE_ERROR(ipfnvgCreateImageTargetKHR);
+
+    TFPtrEglDestroyImageKhr ipfnEglDestroyImageKHR = reinterpret_cast<TFPtrEglDestroyImageKhr>(eglGetProcAddress("eglDestroyImageKHR"));
+    EGL_LEAVE_ERROR(ipfnEglDestroyImageKHR);
+
+    EGL_LEAVE_NULL(eglImage, ipfnEglCreateImageKHR(aDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, reinterpret_cast<EGLClientBuffer>(aImage), (int*)KEglImageAttribsPreservedTrue));
+    EGL_LEAVE_NULL(aVgImage, ipfnvgCreateImageTargetKHR((VGeglImageKHR)eglImage));
+
+    //Close the EGLImage
+    EGL_LEAVE_ERROR(ipfnEglDestroyImageKHR(aDisplay, eglImage));
+    }
+
+void VgLeaveIfErrorL()
+    {
+    VGErrorCode ret = vgGetError();
+    if(ret != VG_NO_ERROR)
+        {
+        User::Leave(ret);
+        }
+    }
+
+/**
+ *    class CTReadWrite
+ *    A base class for use by both the main process and the child processes. Contains common
+ *    data and functions that both children use. Caters for all stress test cases. The children 
+ *    provide implementations of pure virtual functions, one for each test case. The function
+ *    particular to each test case are called in the base class RunL() and these
+ *    call the implemented virtual functions in either the main or the child process.
+ *    The virtual functions read from and write to objects derived from a shared SgImage
+ */
+CTReadWrite::CTReadWrite(TInt aWidth, TInt aHeight, TInt aByteSize, VGImageFormat aFormat, const TTestType& aTestType, TBool& aTestPass)
+: CTimer(CActive::EPriorityHigh),
+    iWidth(aWidth),
+    iHeight(aHeight),
+    iByteSize(aByteSize),
+    iFormat(aFormat),
+    iTestType(aTestType),
+    iTestPass(aTestPass)
+    {
+    }
+
+CTReadWrite::~CTReadWrite()
+    {
+    delete[] iData;
+    }
+
+void CTReadWrite::ConstructL()
+    {
+    if(iByteSize == 2)
+        {
+        //Pack two bytes into a four byte value and halve the buffer size
+        iInitialColour = (KColourInitial16 << 16) + KColourInitial16;
+        iFinalColour = (KColourFinal16 << 16) + KColourFinal16;
+        iBufferSize = iWidth*iHeight/2;
+        }
+    else
+        {
+        iInitialColour = KColourInitial32;
+        iFinalColour = KColourFinal32;
+        iBufferSize = iWidth*iHeight;
+        }
+
+    //Buffer must cater for an odd (as in not even) buffer size
+    iData = new(ELeave) TUint32[iBufferSize + 1];
+
+    CTimer::ConstructL();
+    CActiveScheduler::Add(this);
+    }
+
+void CTReadWrite::RunL()
+    {
+    MakeCurrentL();
+
+    switch(iTestType)
+        {
+        case EStressRead:
+            {
+            ReadL();
+            break;
+            }
+        case EStressReadWriteSingleImage:
+        case EStressReadWriteMultiImage:
+            {
+            ReadWriteImageL();
+            break;
+            }
+        case EStressVGImage:
+            {
+            VgImageL();
+            break;
+            }
+        case EStressPixmapSurface:
+            {
+            PixmapSurfaceL();
+            break;
+            }
+        default:
+            //Error
+            User::Leave(KErrArgument);
+            break;
+        }
+    }
+
+void CTReadWrite::ReadL()
+    {
+    ReadFuncL();
+
+    if(iFrameNumber != KNumberOfFrames)
+         {
+         iFrameNumber++;
+
+         for(TInt i=0; i<iBufferSize; i++)
+             {
+             if(iData[i] != iInitialColour)
+                 {
+                 RDebug::Print(_L("Unexpected pixel colour %x"), iData[i]);
+                 CActiveScheduler::Stop();
+                 iTestPass = EFalse;
+                 return;
+                 }
+             }
+         //Re-issue the request
+         After(TTimeIntervalMicroSeconds32(0));
+         }
+     else
+         {
+         //Stop the active scheduler and process with test termination
+         CActiveScheduler::Stop();
+         }
+    }
+
+void CTReadWrite::ReadWriteImageL()
+    {
+    ReadImageFuncL();
+
+    TBool ret = EFalse; 
+    for(TInt i=0; i<iBufferSize; i++)
+        {
+        if(iData[i] == iInitialColour)
+            {
+            iData[i] = iFinalColour;
+            WriteImageFuncL();
+
+            //Re-issue the request
+            After(TTimeIntervalMicroSeconds32(0));
+            
+            ret = ETrue;
+            break;
+            }
+        else if(iData[i] != iFinalColour)
+            {
+            CActiveScheduler::Stop();
+            iTestPass = EFalse;
+            
+            ret = ETrue;
+            break;
+            }
+        }
+
+    //If no pixels have been modified, check to see if the test should finish
+    if( (IsFinished() != EFalse) && (ret == EFalse) )
+        {
+        //Stop the active scheduler and process with test termination
+        CActiveScheduler::Stop();
+        }
+    }
+
+void CTReadWrite::VgImageL()
+    {
+    if(iFrameNumber != KNumberOfFrames)
+          {
+          iFrameNumber++;
+          VgImageFuncL();
+
+          //Re-issue the request
+          After(TTimeIntervalMicroSeconds32(0));
+          }
+      else
+          {
+          //Stop the active scheduler and process with test termination
+          CActiveScheduler::Stop();
+          }
+    }
+
+void CTReadWrite::PixmapSurfaceL()
+    {
+    if(iFrameNumber != KNumberOfFrames)
+          {
+          iFrameNumber++;
+
+          PixmapSurfaceFuncL();
+
+          //Re-issue the request
+          After(TTimeIntervalMicroSeconds32(0));
+          return;
+          }
+
+    if(IsFinished() != EFalse)
+        {
+        //Stop the active scheduler and process with test termination
+        CActiveScheduler::Stop();
+        }
+    }