egl/egltest/inc/egltestcommonsession.h
changeset 0 5d03bc08d59c
child 26 15986eb6c500
--- /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 <e32base.h>
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#include <sgresource/sgimage.h>
+#else
+#include <graphics/sgimage.h>
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#include <EGL/egl.h>
+
+
+#include <test/egltestcommonutils.h>
+
+//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<TPtrC8> 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