diff -r 000000000000 -r 5d03bc08d59c egl/egltest/inc/egltestcommonsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/egl/egltest/inc/egltestcommonsession.h Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,276 @@ +// Copyright (c) 2007-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 +*/ +#ifndef EGLTESTCOMMONSESSION_H +#define EGLTESTCOMMONSESSION_H + +#include +#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE +#include +#else +#include +#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE +#include + + +#include + +//pointer to function for eglimage +typedef EGLImageKHR (*TFPtrEglCreateImageKhr) (EGLDisplay dpy, EGLContext ctx, EGLenum aTarget, EGLClientBuffer buffer, EGLint*attrib_list); +typedef EGLBoolean (*TFPtrEglDestroyImageKhr) (EGLDisplay dpy, EGLImageKHR image); +typedef EGLBoolean (*TFPtrVgCreateEglImageTargetKhr) (VGeglImageKHR image); +typedef EGLBoolean (*TFPtrEglSwapBuffersRegionNok) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint* rects); + +//pointer to function for sync object +typedef EGLSyncKHR (*TFPtrEglCreateSyncKhr) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (*TFPtrEglDestroySyncKhr) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (*TFPtrEglClientWaitSyncKhr) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (*TFPtrEglSignalSyncKhr) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +typedef EGLint (*TFPtrEglSignalSyncImpl) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +typedef EGLBoolean (*TFPtrEglGetSyncAttribKhr) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +typedef EGLint (*TFPtrEglPrivateSignalSyncNok) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); + +const TUint KImagesArrayGranularity = 4; + +// forward declarations +class CFbsBitmap; +class TRgb; +class CTestExecuteLogger; +class TMapEglConfigToPixelFormat; + +// consts used by this class - use #define to avoid global temporary constructors +#define KPixmapSize TSize(100,100) +#define KPixmapSizeBigger TSize(200,200) +#define KPixmapSquare TRect(25,25, 75,75) + +#define KRgbReddish TRgb(200, 100, 50, 255) // 0xC8, 0x64, 0x32 0xFF +#define KRgbGreenish TRgb(70, 220, 120, 255) // 0x46, 0xDC, 0x78 0xFF +#define KRgbBlueish TRgb(150, 30, 240, 255) // 0x96, 0x1E, 0xF0 0xFF +#define KRgbDummy TRgb(0, 0, 0) // 0x00, 0x00, 0x00 + + +NONSHARABLE_CLASS(TMapEglConfigToPixelFormat) + { +public: + EGLint iBufferSize; + EGLint iAlphaSize; + EGLint iRedSize; + EGLint iGreenSize; + EGLint iBlueSize; + EGLint iSurfaceTypeFlags; + EGLint iColorBufferType; + TUidPixelFormat iPixelFormat; + TDisplayMode iDisplayMode; + }; + +/** +Provides a single thread with the fields and methods necessary to +create and use an EGL surface and context +*/ +class CTestEglSession : public CBase + { +public: + enum TResourceCloseRule + { + EResourceCloseSgImageLate, + EResourceCloseSgImageEarly, + EResourceCloseSgDriverAndImageEarly + }; + +public: + inline CTestExecuteLogger& Logger() { return iLogger; } + + IMPORT_C static CTestEglSession* NewL(CTestExecuteLogger& aLogger, EGLDisplay& aDisplay, TInt aThreadIdx); + IMPORT_C static CTestEglSession* NewLC(CTestExecuteLogger& aLogger, EGLDisplay& aDisplay, TInt aThreadIdx); + IMPORT_C ~CTestEglSession(); + +public: + // + //Compound functions that construct surface + // + IMPORT_C void CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1); + IMPORT_C void CreatePixmapSurfaceAndMakeCurrentAndMatchL(const TSgImageInfo& aImageInfo, TResourceCloseRule aResourceCloseRule, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1); + IMPORT_C void CreatePixmapSurfaceAndMakeCurrentAndMatchL(const TSize& aSize, TDisplayMode displayMode, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1); + IMPORT_C void CreatePbufferSurfaceAndMakeCurrentL(EGLConfig aConfig, const TSize& aSize, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1); + + // + //the following two functions are not recommended to use + // + IMPORT_C void CreatePixmapSurfaceAndMakeCurrentL(EGLConfig aConfig, const TSgImageInfo& aImageInfo, TResourceCloseRule aResourceCloseRule, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1); + IMPORT_C void CreatePixmapSurfaceAndMakeCurrentL(EGLConfig aConfig, const TSize& aSize, TDisplayMode displayMode, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1); + IMPORT_C EGLConfig GetConfigExactMatchL(TEglTestConfig aConfigAttribIndex, TEglConfigMatchRule aMatchRule = EConfigMatchStandard); + + // + //function to check whether a particular extension is supported + // + IMPORT_C TBool CheckNeededExtensionL(TInt aExtension, const TDesC& aExtensionName); + + // + // TODO: delete these and don't use them again + // + IMPORT_C void SetExpectedError(EGLint aExpectedErrorCode); + IMPORT_C TBool CheckExpectedError(EGLint aFunctionReturnValue); + IMPORT_C void CheckExpectedErrorL(EGLint aExpectedErrorCode); + IMPORT_C void ResetExpectedError(); + + + IMPORT_C void TryUsePixmapCFbsBitmapL(); + IMPORT_C void TryUsePixmapCFbsBitmapOpenVgL(EGLConfig aConfig, const TSize& aSize, TDisplayMode aDisplayMode); + IMPORT_C void TryUsePixmapCFbsBitmapOpenGlesL(EGLConfig aConfig, const TSize& aSize, TDisplayMode aDisplayMode, TInt aRenderVersion); + IMPORT_C void TryUsePixmapRSgImageL(); + IMPORT_C TBool TryUsePixmapRSgImageOpenVgL(EGLConfig aConfig, const TSgImageInfo& aImageInfo, TResourceCloseRule aResourceCloseRule); + IMPORT_C TBool TryUsePixmapRSgImageOpenGlesL(EGLConfig aConfig, const TSgImageInfo& aImageInfo, TResourceCloseRule aResourceCloseRule, TInt aRenderVersion); + + IMPORT_C const TMapEglConfigToPixelFormat* GetPixelFormatFromEglConfigL(EGLConfig aConfig); + + IMPORT_C void ViewConfigsL(); + IMPORT_C TBool IsACompatibleConfig(EGLConfig aConfig,RSgImage& aImage,TBool aLog); + IMPORT_C CFbsBitmap* NativeFbsBitmap(); + IMPORT_C RSgImage& NativeSgImage(); + IMPORT_C EGLSurface Surface() const; + IMPORT_C EGLContext Context() const; + + IMPORT_C TInt CreateBitmap(CFbsBitmap* aFbsBitmap, const TSize& aSize, TDisplayMode aDisplayMode); + IMPORT_C TBool CongfigSupportsOpenVgL(EGLConfig aConfig); + + + // + //image extension utils + // + IMPORT_C TBool FetchProcEglCreateImageKhr(); + IMPORT_C TBool FetchProcEglDestroyImageKhr(); + IMPORT_C TBool FetchProcvgCreateImageTargetKhr(); + IMPORT_C EGLImageKHR eglCreateImageKhrL(EGLDisplay aDisplay,EGLContext aContext,EGLenum aTarget,RSgImage* aSgImage,const EGLint *aAttr_List); + IMPORT_C EGLImageKHR eglCreateImageKhrL(EGLDisplay aDisplay,EGLContext aContext,EGLenum aTarget,CFbsBitmap &aCFbsBitmap,const EGLint *aAttr_List); + IMPORT_C TBool DestroyEGLImage(); + IMPORT_C TBool DestroyEGLImage(EGLDisplay aDisplay, EGLImageKHR aEGLImageKHR); + IMPORT_C VGImage vgCreateImageTargetKHR(VGeglImageKHR aImage); + + IMPORT_C void DrawOpenVgL(); + IMPORT_C void DrawOpenGLesL(); + + IMPORT_C void CheckImageDataL(CFbsBitmap* aFbsBitmap); + IMPORT_C void CheckImageDataFullRedishL(CFbsBitmap* aFbsBitmap); + IMPORT_C void CheckImageDataVgL(VGImageFormat aDataFormat); + IMPORT_C void CheckImageDataGLesL(); + + IMPORT_C void CleanupSurfaceAndContextL(); + IMPORT_C void CleanupSurfaceFbsBitmapL(); + IMPORT_C void CleanupSurfaceSgImageL(); + IMPORT_C void ResetSurfaceAndContextSgImageL(); + + IMPORT_C void SwapChannels(TUint32 &aSwapMe); + + IMPORT_C static void ConvertColor(const TRgb& aSource, VGfloat* aTarget); + IMPORT_C TBool PixelsMatch(const TRgb& aExpected, const TRgb& aActual, TBool aCheckAlpha); + + IMPORT_C void CheckVgDrawingL(VGImageFormat aDataFormat, const CFbsBitmap* aReferenceBitmap); + + IMPORT_C CFbsBitmap* CreateReferenceBitmapL(TDisplayMode aMode); + IMPORT_C CFbsBitmap* CreateReferenceBitmapL(TDisplayMode aMode, const TRgb& aColour); + IMPORT_C CFbsBitmap* CreateReferenceBitmapL(TDisplayMode aMode, const TSize& aSize, const TInt aIndex); + IMPORT_C CFbsBitmap* CreateReferenceMaskedBitmapL(TDisplayMode aRefBitmapMode, const TRgb& aPenBitmapColor, const CFbsBitmap* aMaskBitmap); + + IMPORT_C void InitializeL(TBool aTerminateDisplay = EFalse); + IMPORT_C void TerminateDisplayL(); + + IMPORT_C void OpenSgDriverL(); + IMPORT_C void CloseSgDriver(); + + IMPORT_C void OpenFbsSessionL(); + IMPORT_C void CloseFbsSession(); + + IMPORT_C TBool IsOpenGLESSupported(); + IMPORT_C TBool IsOpenGLES2Supported(); + IMPORT_C TBool IsOpenVGSupported(); + +protected: + IMPORT_C CTestEglSession(CTestExecuteLogger& aLogger, EGLDisplay& aDisplay, TInt aThreadIdx); + + void QueryExtensionsL(TExtensionsGroups aExtensionBelongsTo); + TBool FindExtensionStringL(TExtensionsGroups aExtensionBelongsTo, const TDesC8& aExtensionString); + + TInt GetFullMatchConfigIndex(EGLDisplay aDisplay, EGLConfig *aConfigs, TInt aNumConfigs, const EGLint aWantedAttribs[], TEglConfigMatchRule aMatchRule); + + const TMapEglConfigToPixelFormat& ConfigToPixelFormatTable(TInt aIndex) const; + TInt ConfigToPixelFormatTableLength() const; + + void CheckAllAvailableRenders(); + +protected: + CTestExecuteLogger& iLogger; + TBool iVerboseLogging; + + /** + Logical thread index, used for outputing logging info for multi threaded tests + Each thread in a multi threaded test will use its own instance of this + CTestEglSession class, and pass in a unique index identifier + */ + TInt iThreadIdx; + + /** + Holds the parsed result of calling eglQueryString() for extensions + */ + RArray iExtensionStrings; + TExtensionsGroups iExtensionGroupCached; + + // Extension Function pointer + TFPtrEglCreateImageKhr ipfnEglCreateImageKHR; + TFPtrEglDestroyImageKhr ipfnEglDestroyImageKHR; + TFPtrVgCreateEglImageTargetKhr ipfnvgCreateImageTargetKHR; + TFPtrEglSwapBuffersRegionNok ipfnEglSwapBuffersRegionNok; + + /** + Copy of the display passed in during construction. + Not owned by this object. + */ + EGLDisplay& iDisplay; + EGLSurface iSurface; + EGLContext iContext; + + /** + When performing negative tests, we need to specify which error code we are expecting to produce. + The next call to an egl API method will check for this value. + If the value is different, then the test will leave with a failure code. + If the value is the same then the test may continue. The value of iExpectedError will be reset to + its initial value of EGL_SUCCESS; + */ + EGLint iExpectedErrorCode; + VGErrorCode iExpectedErrorCodeVG; + + // Native image - only use one of these for any test + CFbsBitmap* iFbsBitmap; + RSgImage iSgImage; + + TBool iTerminateDisplay; + TBool iSgDriverOpen; +#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE + RSgDriver iSgDriver; +#endif + TBool iFbsSessionOpen; + + //we will use a “lazy” initialization for iIsOpenGLESSupported, iIsOpenGLES2Supported and iIsOpenVGSupportedvariable members, + //i.e. they will be initialized upon the first request + TBool iIsSupportedRenderInitialized; //signify that iIsOpenGLESSupported, iIsOpenGLES2Supported and iIsOpenVGSupported members have been initialized + TBool iIsOpenGLESSupported; + TBool iIsOpenGLES2Supported; + TBool iIsOpenVGSupported; + }; + +#endif // EGLTESTCOMMONSESSION_H