--- a/egl/egltest/bwins/egltestcommonu.def Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/bwins/egltestcommonu.def Wed Mar 31 23:34:07 2010 +0300
@@ -4,87 +4,87 @@
?eglCreateImageKhrL@CTestEglSession@@QAEHHHHPAVRSgImage@@PBH@Z @ 3 NONAME ; int CTestEglSession::eglCreateImageKhrL(int, int, int, class RSgImage *, int const *)
?SwapChannels@CTestEglSession@@QAEXAAK@Z @ 4 NONAME ; void CTestEglSession::SwapChannels(unsigned long &)
??0TSgImageInfoOpenVgTarget@@QAE@XZ @ 5 NONAME ; TSgImageInfoOpenVgTarget::TSgImageInfoOpenVgTarget(void)
- ?CreateWindowSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHAAVRWindow@@HH@Z @ 6 NONAME ; void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(int, class RWindow &, int, int)
- ??1TSgImageInfoOpenVgImage@@QAE@XZ @ 7 NONAME ; TSgImageInfoOpenVgImage::~TSgImageInfoOpenVgImage(void)
- ?GetDisplayL@CEglTestStep@@IAEXXZ @ 8 NONAME ; void CEglTestStep::GetDisplayL(void)
- ?NewL@CTestEglSession@@SAPAV1@AAVCTestExecuteLogger@@AAHH@Z @ 9 NONAME ; class CTestEglSession * CTestEglSession::NewL(class CTestExecuteLogger &, int &, int)
- ?CheckImageDataL@CTestEglSession@@QAEXPAVCFbsBitmap@@@Z @ 10 NONAME ; void CTestEglSession::CheckImageDataL(class CFbsBitmap *)
- ?doProcessFunctionL@CEglTestStep@@MAEXH@Z @ 11 NONAME ; void CEglTestStep::doProcessFunctionL(int)
- ?CheckExpectedErrorL@CTestEglSession@@QAEXH@Z @ 12 NONAME ; void CTestEglSession::CheckExpectedErrorL(int)
- ?CheckVgDrawingL@CTestEglSession@@QAEXW4VGImageFormat@@PBVCFbsBitmap@@@Z @ 13 NONAME ; void CTestEglSession::CheckVgDrawingL(enum VGImageFormat, class CFbsBitmap const *)
- ?VgFormatToDisplayMode@EglTestConversion@@SA?AW4TDisplayMode@@W4VGImageFormat@@@Z @ 14 NONAME ; enum TDisplayMode EglTestConversion::VgFormatToDisplayMode(enum VGImageFormat)
- ?CreateReferenceMaskedBitmapL@CTestEglSession@@QAEPAVCFbsBitmap@@W4TDisplayMode@@ABVTRgb@@PBV2@@Z @ 15 NONAME ; class CFbsBitmap * CTestEglSession::CreateReferenceMaskedBitmapL(enum TDisplayMode, class TRgb const &, class CFbsBitmap const *)
- ?CreatePixmapSurfaceAndMakeCurrentAndMatchL@CTestEglSession@@QAEXABVTSize@@W4TDisplayMode@@HH@Z @ 16 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentAndMatchL(class TSize const &, enum TDisplayMode, int, int)
- ?doTestStepPostambleL@CEglTestStep@@UAE?AW4TVerdict@@XZ @ 17 NONAME ; enum TVerdict CEglTestStep::doTestStepPostambleL(void)
- ?FetchProcEglDestroyImageKhr@CTestEglSession@@QAEHXZ @ 18 NONAME ; int CTestEglSession::FetchProcEglDestroyImageKhr(void)
- ??1CEglTestCommonIniSettings@@UAE@XZ @ 19 NONAME ; CEglTestCommonIniSettings::~CEglTestCommonIniSettings(void)
- ?Surface@CTestEglSession@@QBEHXZ @ 20 NONAME ; int CTestEglSession::Surface(void) const
- ?ConstructWindowL@CEglTestStep@@IAEXAAVRWindow@@ABVTRect@@@Z @ 21 NONAME ; void CEglTestStep::ConstructWindowL(class RWindow &, class TRect const &)
- ?NativeFbsBitmap@CTestEglSession@@QAEPAVCFbsBitmap@@XZ @ 22 NONAME ; class CFbsBitmap * CTestEglSession::NativeFbsBitmap(void)
- ?GetMatchType@@YA?AW4TEglConfigMatchType@@HW4TEglConfigMatchRule@@@Z @ 23 NONAME ; enum TEglConfigMatchType GetMatchType(int, enum TEglConfigMatchRule)
- ?GetConfigExactMatchL@CTestEglSession@@QAEHW4TEglTestConfig@@W4TEglConfigMatchRule@@@Z @ 24 NONAME ; int CTestEglSession::GetConfigExactMatchL(enum TEglTestConfig, enum TEglConfigMatchRule)
- ??0TSgImageInfoTest@@QAE@W4TUidPixelFormat@@VTSize@@@Z @ 25 NONAME ; TSgImageInfoTest::TSgImageInfoTest(enum TUidPixelFormat, class TSize)
- ?InitializeL@CTestEglSession@@QAEXH@Z @ 26 NONAME ; void CTestEglSession::InitializeL(int)
- ?CreateReferenceBitmapL@CTestEglSession@@QAEPAVCFbsBitmap@@W4TDisplayMode@@ABVTRgb@@@Z @ 27 NONAME ; class CFbsBitmap * CTestEglSession::CreateReferenceBitmapL(enum TDisplayMode, class TRgb const &)
- ?CreatePixmapSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHABVTSize@@W4TDisplayMode@@HH@Z @ 28 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentL(int, class TSize const &, enum TDisplayMode, int, int)
- ??1TSgImageInfoOpenVgTarget@@QAE@XZ @ 29 NONAME ; TSgImageInfoOpenVgTarget::~TSgImageInfoOpenVgTarget(void)
- ?CreateEglSessionL@CEglTestStep@@QAEXH@Z @ 30 NONAME ; void CEglTestStep::CreateEglSessionL(int)
- ?CheckNeededExtensionL@CTestEglSession@@QAEHHABVTDesC16@@@Z @ 31 NONAME ; int CTestEglSession::CheckNeededExtensionL(int, class TDesC16 const &)
- ?TryUsePixmapRSgImageL@CTestEglSession@@QAEXXZ @ 32 NONAME ; void CTestEglSession::TryUsePixmapRSgImageL(void)
- ?TryUsePixmapCFbsBitmapOpenGlesL@CTestEglSession@@QAEXHABVTSize@@W4TDisplayMode@@H@Z @ 33 NONAME ; void CTestEglSession::TryUsePixmapCFbsBitmapOpenGlesL(int, class TSize const &, enum TDisplayMode, int)
- ?vgCreateImageTargetKHR@CTestEglSession@@QAEKH@Z @ 34 NONAME ; unsigned long CTestEglSession::vgCreateImageTargetKHR(int)
- ?DrawOpenGLesL@CTestEglSession@@QAEXXZ @ 35 NONAME ; void CTestEglSession::DrawOpenGLesL(void)
- ?CreateBitmap@CTestEglSession@@QAEHPAVCFbsBitmap@@ABVTSize@@W4TDisplayMode@@@Z @ 36 NONAME ; int CTestEglSession::CreateBitmap(class CFbsBitmap *, class TSize const &, enum TDisplayMode)
- ?doProcessFunctionL@CEglTestStep@@MAEXHABVTSgDrawableId@@@Z @ 37 NONAME ; void CEglTestStep::doProcessFunctionL(int, class TSgDrawableId const &)
- ?PixelsMatch@CTestEglSession@@QAEHABVTRgb@@0H@Z @ 38 NONAME ; int CTestEglSession::PixelsMatch(class TRgb const &, class TRgb const &, int)
- ?SetExpectedError@CTestEglSession@@QAEXH@Z @ 39 NONAME ; void CTestEglSession::SetExpectedError(int)
- ?CreateReferenceBitmapL@CTestEglSession@@QAEPAVCFbsBitmap@@W4TDisplayMode@@@Z @ 40 NONAME ; class CFbsBitmap * CTestEglSession::CreateReferenceBitmapL(enum TDisplayMode)
- ?VgFormatToWindowSurfaceFormat@EglTestConversion@@SA?AW4TEglTestConfig@@W4VGImageFormat@@@Z @ 41 NONAME ; enum TEglTestConfig EglTestConversion::VgFormatToWindowSurfaceFormat(enum VGImageFormat)
- ??0CEglTestStep@@IAE@XZ @ 42 NONAME ; CEglTestStep::CEglTestStep(void)
- ?NativeSgImage@CTestEglSession@@QAEAAVRSgImage@@XZ @ 43 NONAME ; class RSgImage & CTestEglSession::NativeSgImage(void)
- ?IsACompatibleConfig@CTestEglSession@@QAEHHAAVRSgImage@@H@Z @ 44 NONAME ; int CTestEglSession::IsACompatibleConfig(int, class RSgImage &, int)
- ?CheckImageDataVgL@CTestEglSession@@QAEXW4VGImageFormat@@@Z @ 45 NONAME ; void CTestEglSession::CheckImageDataVgL(enum VGImageFormat)
- ?ResetSurfaceAndContextSgImageL@CTestEglSession@@QAEXXZ @ 46 NONAME ; void CTestEglSession::ResetSurfaceAndContextSgImageL(void)
- ?PixelFormatToVgFormat@EglTestConversion@@SA?AW4VGImageFormat@@W4TUidPixelFormat@@@Z @ 47 NONAME ; enum VGImageFormat EglTestConversion::PixelFormatToVgFormat(enum TUidPixelFormat)
- ??0TSgImageInfoOpenVgImage@@QAE@W4TUidPixelFormat@@VTSize@@@Z @ 48 NONAME ; TSgImageInfoOpenVgImage::TSgImageInfoOpenVgImage(enum TUidPixelFormat, class TSize)
- ?CheckForExtensionL@CEglTestStep@@IAEHHABVTDesC16@@@Z @ 49 NONAME ; int CEglTestStep::CheckForExtensionL(int, class TDesC16 const &)
- ?Rendezvous@CEglTestStep@@IAEXH@Z @ 50 NONAME ; void CEglTestStep::Rendezvous(int)
- ?OpenWsSessionL@CEglTestStep@@IAEXH@Z @ 51 NONAME ; void CEglTestStep::OpenWsSessionL(int)
- ?TryUsePixmapRSgImageOpenGlesL@CTestEglSession@@QAEHHABVTSgImageInfo@@W4TResourceCloseRule@1@H@Z @ 52 NONAME ; int CTestEglSession::TryUsePixmapRSgImageOpenGlesL(int, class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule, int)
- ?eglCreateImageKhrL@CTestEglSession@@QAEHHHHAAVCFbsBitmap@@PBH@Z @ 53 NONAME ; int CTestEglSession::eglCreateImageKhrL(int, int, int, class CFbsBitmap &, int const *)
- ?VgFormatToSgPixelFormat@EglTestConversion@@SA?AW4TUidPixelFormat@@W4VGImageFormat@@@Z @ 54 NONAME ; enum TUidPixelFormat EglTestConversion::VgFormatToSgPixelFormat(enum VGImageFormat)
- ?NewLC@CEglTestCommonIniSettings@@SAPAV1@XZ @ 55 NONAME ; class CEglTestCommonIniSettings * CEglTestCommonIniSettings::NewLC(void)
- ?doThreadFunctionL@CEglTestStep@@MAEXH@Z @ 56 NONAME ; void CEglTestStep::doThreadFunctionL(int)
- ?TerminateDisplayL@CTestEglSession@@QAEXXZ @ 57 NONAME ; void CTestEglSession::TerminateDisplayL(void)
- ?PrintVGImageFormat@CEglTestStep@@IAEXW4VGImageFormat@@@Z @ 58 NONAME ; void CEglTestStep::PrintVGImageFormat(enum VGImageFormat)
- ?ConvertColor@CTestEglSession@@SAXABVTRgb@@PAM@Z @ 59 NONAME ; void CTestEglSession::ConvertColor(class TRgb const &, float *)
- ?DrawOpenVgL@CTestEglSession@@QAEXXZ @ 60 NONAME ; void CTestEglSession::DrawOpenVgL(void)
- ?doThreadFunctionL@CEglTestStep@@MAEXHABVTSgDrawableId@@@Z @ 61 NONAME ; void CEglTestStep::doThreadFunctionL(int, class TSgDrawableId const &)
- ?CloseFbsSession@CTestEglSession@@QAEXXZ @ 62 NONAME ; void CTestEglSession::CloseFbsSession(void)
- ?GetImageSize@CEglTestCommonIniSettings@@QAE?AVTSize@@ABVTDesC16@@@Z @ 63 NONAME ; class TSize CEglTestCommonIniSettings::GetImageSize(class TDesC16 const &)
- ?PrintUsedPixelConfiguration@CEglTestStep@@IAEXXZ @ 64 NONAME ; void CEglTestStep::PrintUsedPixelConfiguration(void)
- ?NewLC@CTestEglSession@@SAPAV1@AAVCTestExecuteLogger@@AAHH@Z @ 65 NONAME ; class CTestEglSession * CTestEglSession::NewLC(class CTestExecuteLogger &, int &, int)
- ?GetPixelFormatFromEglConfigL@CTestEglSession@@QAEPBVTMapEglConfigToPixelFormat@@H@Z @ 66 NONAME ; class TMapEglConfigToPixelFormat const * CTestEglSession::GetPixelFormatFromEglConfigL(int)
- ?TryUsePixmapCFbsBitmapOpenVgL@CTestEglSession@@QAEXHABVTSize@@W4TDisplayMode@@@Z @ 67 NONAME ; void CTestEglSession::TryUsePixmapCFbsBitmapOpenVgL(int, class TSize const &, enum TDisplayMode)
- ?CreatePixmapSurfaceAndMakeCurrentAndMatchL@CTestEglSession@@QAEXABVTSgImageInfo@@W4TResourceCloseRule@1@HH@Z @ 68 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentAndMatchL(class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule, int, int)
- ?BytePerPixel@EglTestConversion@@SAHW4TUidPixelFormat@@@Z @ 69 NONAME ; int EglTestConversion::BytePerPixel(enum TUidPixelFormat)
- ?CheckImageDataGLesL@CTestEglSession@@QAEXXZ @ 70 NONAME ; void CTestEglSession::CheckImageDataGLesL(void)
- ?CreatePixmapSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHABVTSgImageInfo@@W4TResourceCloseRule@1@HH@Z @ 71 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentL(int, class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule, int, int)
- ?VgFormatToPBufferSurfaceFormat@EglTestConversion@@SA?AW4TEglTestConfig@@W4VGImageFormat@@@Z @ 72 NONAME ; enum TEglTestConfig EglTestConversion::VgFormatToPBufferSurfaceFormat(enum VGImageFormat)
- ?TryUsePixmapRSgImageOpenVgL@CTestEglSession@@QAEHHABVTSgImageInfo@@W4TResourceCloseRule@1@@Z @ 73 NONAME ; int CTestEglSession::TryUsePixmapRSgImageOpenVgL(int, class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule)
- ?CloseWsSession@CEglTestStep@@IAEXXZ @ 74 NONAME ; void CEglTestStep::CloseWsSession(void)
- ??0TSgImageInfoTest@@QAE@XZ @ 75 NONAME ; TSgImageInfoTest::TSgImageInfoTest(void)
- ??1CEglTestStep@@UAE@XZ @ 76 NONAME ; CEglTestStep::~CEglTestStep(void)
- ?Test_MultiThreadL@CEglTestStep@@IAEXHH@Z @ 77 NONAME ; void CEglTestStep::Test_MultiThreadL(int, int)
- ?PartialInitialiseL@CEglTestStep@@QAEXABVTDesC16@@@Z @ 78 NONAME ; void CEglTestStep::PartialInitialiseL(class TDesC16 const &)
- ?CreatePbufferSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHABVTSize@@HH@Z @ 79 NONAME ; void CTestEglSession::CreatePbufferSurfaceAndMakeCurrentL(int, class TSize const &, int, int)
- ?Test_MultiProcessL@CEglTestStep@@IAEXABVTDesC16@@H0ABV?$RArray@VTSgDrawableId@@@@@Z @ 80 NONAME ; void CEglTestStep::Test_MultiProcessL(class TDesC16 const &, int, class TDesC16 const &, class RArray<class TSgDrawableId> const &)
- ?IsOpenVGSupported@CTestEglSession@@QAEHXZ @ 81 NONAME ; int CTestEglSession::IsOpenVGSupported(void)
- ?NewL@CEglTestCommonIniSettings@@SAPAV1@XZ @ 82 NONAME ; class CEglTestCommonIniSettings * CEglTestCommonIniSettings::NewL(void)
- ?PrintPixelFormat@CEglTestStep@@IAEXW4TUidPixelFormat@@@Z @ 83 NONAME ; void CEglTestStep::PrintPixelFormat(enum TUidPixelFormat)
- ?CheckExpectedError@CTestEglSession@@QAEHH@Z @ 84 NONAME ; int CTestEglSession::CheckExpectedError(int)
- ?GetVgFormat@CEglTestCommonIniSettings@@QAE?AW4VGImageFormat@@ABVTDesC16@@H@Z @ 85 NONAME ; enum VGImageFormat CEglTestCommonIniSettings::GetVgFormat(class TDesC16 const &, int)
- ?CleanupSurfaceFbsBitmapL@CTestEglSession@@QAEXXZ @ 86 NONAME ; void CTestEglSession::CleanupSurfaceFbsBitmapL(void)
+ ??1TSgImageInfoOpenVgImage@@QAE@XZ @ 6 NONAME ; TSgImageInfoOpenVgImage::~TSgImageInfoOpenVgImage(void)
+ ?GetDisplayL@CEglTestStep@@IAEXXZ @ 7 NONAME ; void CEglTestStep::GetDisplayL(void)
+ ?NewL@CTestEglSession@@SAPAV1@AAVCTestExecuteLogger@@AAHH@Z @ 8 NONAME ; class CTestEglSession * CTestEglSession::NewL(class CTestExecuteLogger &, int &, int)
+ ?CheckImageDataL@CTestEglSession@@QAEXPAVCFbsBitmap@@@Z @ 9 NONAME ; void CTestEglSession::CheckImageDataL(class CFbsBitmap *)
+ ?doProcessFunctionL@CEglTestStep@@MAEXH@Z @ 10 NONAME ; void CEglTestStep::doProcessFunctionL(int)
+ ?CheckExpectedErrorL@CTestEglSession@@QAEXH@Z @ 11 NONAME ; void CTestEglSession::CheckExpectedErrorL(int)
+ ?CheckVgDrawingL@CTestEglSession@@QAEXW4VGImageFormat@@PBVCFbsBitmap@@@Z @ 12 NONAME ; void CTestEglSession::CheckVgDrawingL(enum VGImageFormat, class CFbsBitmap const *)
+ ?VgFormatToDisplayMode@EglTestConversion@@SA?AW4TDisplayMode@@W4VGImageFormat@@@Z @ 13 NONAME ; enum TDisplayMode EglTestConversion::VgFormatToDisplayMode(enum VGImageFormat)
+ ?CreateReferenceMaskedBitmapL@CTestEglSession@@QAEPAVCFbsBitmap@@W4TDisplayMode@@ABVTRgb@@PBV2@@Z @ 14 NONAME ; class CFbsBitmap * CTestEglSession::CreateReferenceMaskedBitmapL(enum TDisplayMode, class TRgb const &, class CFbsBitmap const *)
+ ?CreatePixmapSurfaceAndMakeCurrentAndMatchL@CTestEglSession@@QAEXABVTSize@@W4TDisplayMode@@HH@Z @ 15 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentAndMatchL(class TSize const &, enum TDisplayMode, int, int)
+ ?doTestStepPostambleL@CEglTestStep@@UAE?AW4TVerdict@@XZ @ 16 NONAME ; enum TVerdict CEglTestStep::doTestStepPostambleL(void)
+ ?FetchProcEglDestroyImageKhr@CTestEglSession@@QAEHXZ @ 17 NONAME ; int CTestEglSession::FetchProcEglDestroyImageKhr(void)
+ ??1CEglTestCommonIniSettings@@UAE@XZ @ 18 NONAME ; CEglTestCommonIniSettings::~CEglTestCommonIniSettings(void)
+ ?Surface@CTestEglSession@@QBEHXZ @ 19 NONAME ; int CTestEglSession::Surface(void) const
+ ?ConstructWindowL@CEglTestStep@@IAEXAAVRWindow@@ABVTRect@@@Z @ 20 NONAME ; void CEglTestStep::ConstructWindowL(class RWindow &, class TRect const &)
+ ?NativeFbsBitmap@CTestEglSession@@QAEPAVCFbsBitmap@@XZ @ 21 NONAME ; class CFbsBitmap * CTestEglSession::NativeFbsBitmap(void)
+ ?GetMatchType@@YA?AW4TEglConfigMatchType@@HW4TEglConfigMatchRule@@@Z @ 22 NONAME ; enum TEglConfigMatchType GetMatchType(int, enum TEglConfigMatchRule)
+ ?GetConfigExactMatchL@CTestEglSession@@QAEHW4TEglTestConfig@@W4TEglConfigMatchRule@@@Z @ 23 NONAME ; int CTestEglSession::GetConfigExactMatchL(enum TEglTestConfig, enum TEglConfigMatchRule)
+ ??0TSgImageInfoTest@@QAE@W4TUidPixelFormat@@VTSize@@@Z @ 24 NONAME ; TSgImageInfoTest::TSgImageInfoTest(enum TUidPixelFormat, class TSize)
+ ?InitializeL@CTestEglSession@@QAEXH@Z @ 25 NONAME ; void CTestEglSession::InitializeL(int)
+ ?CreateReferenceBitmapL@CTestEglSession@@QAEPAVCFbsBitmap@@W4TDisplayMode@@ABVTRgb@@@Z @ 26 NONAME ; class CFbsBitmap * CTestEglSession::CreateReferenceBitmapL(enum TDisplayMode, class TRgb const &)
+ ?CreatePixmapSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHABVTSize@@W4TDisplayMode@@HH@Z @ 27 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentL(int, class TSize const &, enum TDisplayMode, int, int)
+ ??1TSgImageInfoOpenVgTarget@@QAE@XZ @ 28 NONAME ; TSgImageInfoOpenVgTarget::~TSgImageInfoOpenVgTarget(void)
+ ?CreateEglSessionL@CEglTestStep@@QAEXH@Z @ 29 NONAME ; void CEglTestStep::CreateEglSessionL(int)
+ ?CheckNeededExtensionL@CTestEglSession@@QAEHHABVTDesC16@@@Z @ 30 NONAME ; int CTestEglSession::CheckNeededExtensionL(int, class TDesC16 const &)
+ ?TryUsePixmapRSgImageL@CTestEglSession@@QAEXXZ @ 31 NONAME ; void CTestEglSession::TryUsePixmapRSgImageL(void)
+ ?TryUsePixmapCFbsBitmapOpenGlesL@CTestEglSession@@QAEXHABVTSize@@W4TDisplayMode@@H@Z @ 32 NONAME ; void CTestEglSession::TryUsePixmapCFbsBitmapOpenGlesL(int, class TSize const &, enum TDisplayMode, int)
+ ?vgCreateImageTargetKHR@CTestEglSession@@QAEKH@Z @ 33 NONAME ; unsigned long CTestEglSession::vgCreateImageTargetKHR(int)
+ ?DrawOpenGLesL@CTestEglSession@@QAEXXZ @ 34 NONAME ; void CTestEglSession::DrawOpenGLesL(void)
+ ?CreateBitmap@CTestEglSession@@QAEHPAVCFbsBitmap@@ABVTSize@@W4TDisplayMode@@@Z @ 35 NONAME ; int CTestEglSession::CreateBitmap(class CFbsBitmap *, class TSize const &, enum TDisplayMode)
+ ?doProcessFunctionL@CEglTestStep@@MAEXHABVTSgDrawableId@@@Z @ 36 NONAME ; void CEglTestStep::doProcessFunctionL(int, class TSgDrawableId const &)
+ ?PixelsMatch@CTestEglSession@@QAEHABVTRgb@@0H@Z @ 37 NONAME ; int CTestEglSession::PixelsMatch(class TRgb const &, class TRgb const &, int)
+ ?SetExpectedError@CTestEglSession@@QAEXH@Z @ 38 NONAME ; void CTestEglSession::SetExpectedError(int)
+ ?CreateReferenceBitmapL@CTestEglSession@@QAEPAVCFbsBitmap@@W4TDisplayMode@@@Z @ 39 NONAME ; class CFbsBitmap * CTestEglSession::CreateReferenceBitmapL(enum TDisplayMode)
+ ?VgFormatToWindowSurfaceFormat@EglTestConversion@@SA?AW4TEglTestConfig@@W4VGImageFormat@@@Z @ 40 NONAME ; enum TEglTestConfig EglTestConversion::VgFormatToWindowSurfaceFormat(enum VGImageFormat)
+ ??0CEglTestStep@@IAE@XZ @ 41 NONAME ; CEglTestStep::CEglTestStep(void)
+ ?NativeSgImage@CTestEglSession@@QAEAAVRSgImage@@XZ @ 42 NONAME ; class RSgImage & CTestEglSession::NativeSgImage(void)
+ ?IsACompatibleConfig@CTestEglSession@@QAEHHAAVRSgImage@@H@Z @ 43 NONAME ; int CTestEglSession::IsACompatibleConfig(int, class RSgImage &, int)
+ ?CheckImageDataVgL@CTestEglSession@@QAEXW4VGImageFormat@@@Z @ 44 NONAME ; void CTestEglSession::CheckImageDataVgL(enum VGImageFormat)
+ ?ResetSurfaceAndContextSgImageL@CTestEglSession@@QAEXXZ @ 45 NONAME ; void CTestEglSession::ResetSurfaceAndContextSgImageL(void)
+ ?PixelFormatToVgFormat@EglTestConversion@@SA?AW4VGImageFormat@@W4TUidPixelFormat@@@Z @ 46 NONAME ; enum VGImageFormat EglTestConversion::PixelFormatToVgFormat(enum TUidPixelFormat)
+ ??0TSgImageInfoOpenVgImage@@QAE@W4TUidPixelFormat@@VTSize@@@Z @ 47 NONAME ; TSgImageInfoOpenVgImage::TSgImageInfoOpenVgImage(enum TUidPixelFormat, class TSize)
+ ?CheckForExtensionL@CEglTestStep@@IAEHHABVTDesC16@@@Z @ 48 NONAME ; int CEglTestStep::CheckForExtensionL(int, class TDesC16 const &)
+ ?Rendezvous@CEglTestStep@@IAEXH@Z @ 49 NONAME ; void CEglTestStep::Rendezvous(int)
+ ?OpenWsSessionL@CEglTestStep@@IAEXH@Z @ 50 NONAME ; void CEglTestStep::OpenWsSessionL(int)
+ ?TryUsePixmapRSgImageOpenGlesL@CTestEglSession@@QAEHHABVTSgImageInfo@@W4TResourceCloseRule@1@H@Z @ 51 NONAME ; int CTestEglSession::TryUsePixmapRSgImageOpenGlesL(int, class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule, int)
+ ?eglCreateImageKhrL@CTestEglSession@@QAEHHHHAAVCFbsBitmap@@PBH@Z @ 52 NONAME ; int CTestEglSession::eglCreateImageKhrL(int, int, int, class CFbsBitmap &, int const *)
+ ?VgFormatToSgPixelFormat@EglTestConversion@@SA?AW4TUidPixelFormat@@W4VGImageFormat@@@Z @ 53 NONAME ; enum TUidPixelFormat EglTestConversion::VgFormatToSgPixelFormat(enum VGImageFormat)
+ ?NewLC@CEglTestCommonIniSettings@@SAPAV1@XZ @ 54 NONAME ; class CEglTestCommonIniSettings * CEglTestCommonIniSettings::NewLC(void)
+ ?doThreadFunctionL@CEglTestStep@@MAEXH@Z @ 55 NONAME ; void CEglTestStep::doThreadFunctionL(int)
+ ?TerminateDisplayL@CTestEglSession@@QAEXXZ @ 56 NONAME ; void CTestEglSession::TerminateDisplayL(void)
+ ?PrintVGImageFormat@CEglTestStep@@IAEXW4VGImageFormat@@@Z @ 57 NONAME ; void CEglTestStep::PrintVGImageFormat(enum VGImageFormat)
+ ?ConvertColor@CTestEglSession@@SAXABVTRgb@@PAM@Z @ 58 NONAME ; void CTestEglSession::ConvertColor(class TRgb const &, float *)
+ ?DrawOpenVgL@CTestEglSession@@QAEXXZ @ 59 NONAME ; void CTestEglSession::DrawOpenVgL(void)
+ ?doThreadFunctionL@CEglTestStep@@MAEXHABVTSgDrawableId@@@Z @ 60 NONAME ; void CEglTestStep::doThreadFunctionL(int, class TSgDrawableId const &)
+ ?CloseFbsSession@CTestEglSession@@QAEXXZ @ 61 NONAME ; void CTestEglSession::CloseFbsSession(void)
+ ?GetImageSize@CEglTestCommonIniSettings@@QAE?AVTSize@@ABVTDesC16@@@Z @ 62 NONAME ; class TSize CEglTestCommonIniSettings::GetImageSize(class TDesC16 const &)
+ ?PrintUsedPixelConfiguration@CEglTestStep@@IAEXXZ @ 63 NONAME ; void CEglTestStep::PrintUsedPixelConfiguration(void)
+ ?NewLC@CTestEglSession@@SAPAV1@AAVCTestExecuteLogger@@AAHH@Z @ 64 NONAME ; class CTestEglSession * CTestEglSession::NewLC(class CTestExecuteLogger &, int &, int)
+ ?GetPixelFormatFromEglConfigL@CTestEglSession@@QAEPBVTMapEglConfigToPixelFormat@@H@Z @ 65 NONAME ; class TMapEglConfigToPixelFormat const * CTestEglSession::GetPixelFormatFromEglConfigL(int)
+ ?TryUsePixmapCFbsBitmapOpenVgL@CTestEglSession@@QAEXHABVTSize@@W4TDisplayMode@@@Z @ 66 NONAME ; void CTestEglSession::TryUsePixmapCFbsBitmapOpenVgL(int, class TSize const &, enum TDisplayMode)
+ ?CreatePixmapSurfaceAndMakeCurrentAndMatchL@CTestEglSession@@QAEXABVTSgImageInfo@@W4TResourceCloseRule@1@HH@Z @ 67 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentAndMatchL(class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule, int, int)
+ ?BytePerPixel@EglTestConversion@@SAHW4TUidPixelFormat@@@Z @ 68 NONAME ; int EglTestConversion::BytePerPixel(enum TUidPixelFormat)
+ ?CheckImageDataGLesL@CTestEglSession@@QAEXXZ @ 69 NONAME ; void CTestEglSession::CheckImageDataGLesL(void)
+ ?CreatePixmapSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHABVTSgImageInfo@@W4TResourceCloseRule@1@HH@Z @ 70 NONAME ; void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentL(int, class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule, int, int)
+ ?VgFormatToPBufferSurfaceFormat@EglTestConversion@@SA?AW4TEglTestConfig@@W4VGImageFormat@@@Z @ 71 NONAME ; enum TEglTestConfig EglTestConversion::VgFormatToPBufferSurfaceFormat(enum VGImageFormat)
+ ?TryUsePixmapRSgImageOpenVgL@CTestEglSession@@QAEHHABVTSgImageInfo@@W4TResourceCloseRule@1@@Z @ 72 NONAME ; int CTestEglSession::TryUsePixmapRSgImageOpenVgL(int, class TSgImageInfo const &, enum CTestEglSession::TResourceCloseRule)
+ ?CloseWsSession@CEglTestStep@@IAEXXZ @ 73 NONAME ; void CEglTestStep::CloseWsSession(void)
+ ??0TSgImageInfoTest@@QAE@XZ @ 74 NONAME ; TSgImageInfoTest::TSgImageInfoTest(void)
+ ??1CEglTestStep@@UAE@XZ @ 75 NONAME ; CEglTestStep::~CEglTestStep(void)
+ ?Test_MultiThreadL@CEglTestStep@@IAEXHH@Z @ 76 NONAME ; void CEglTestStep::Test_MultiThreadL(int, int)
+ ?PartialInitialiseL@CEglTestStep@@QAEXABVTDesC16@@@Z @ 77 NONAME ; void CEglTestStep::PartialInitialiseL(class TDesC16 const &)
+ ?CreatePbufferSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHABVTSize@@HH@Z @ 78 NONAME ; void CTestEglSession::CreatePbufferSurfaceAndMakeCurrentL(int, class TSize const &, int, int)
+ ?Test_MultiProcessL@CEglTestStep@@IAEXABVTDesC16@@H0ABV?$RArray@VTSgDrawableId@@@@@Z @ 79 NONAME ; void CEglTestStep::Test_MultiProcessL(class TDesC16 const &, int, class TDesC16 const &, class RArray<class TSgDrawableId> const &)
+ ?IsOpenVGSupported@CTestEglSession@@QAEHXZ @ 80 NONAME ; int CTestEglSession::IsOpenVGSupported(void)
+ ?NewL@CEglTestCommonIniSettings@@SAPAV1@XZ @ 81 NONAME ; class CEglTestCommonIniSettings * CEglTestCommonIniSettings::NewL(void)
+ ?PrintPixelFormat@CEglTestStep@@IAEXW4TUidPixelFormat@@@Z @ 82 NONAME ; void CEglTestStep::PrintPixelFormat(enum TUidPixelFormat)
+ ?CheckExpectedError@CTestEglSession@@QAEHH@Z @ 83 NONAME ; int CTestEglSession::CheckExpectedError(int)
+ ?GetVgFormat@CEglTestCommonIniSettings@@QAE?AW4VGImageFormat@@ABVTDesC16@@H@Z @ 84 NONAME ; enum VGImageFormat CEglTestCommonIniSettings::GetVgFormat(class TDesC16 const &, int)
+ ?CleanupSurfaceFbsBitmapL@CTestEglSession@@QAEXXZ @ 85 NONAME ; void CTestEglSession::CleanupSurfaceFbsBitmapL(void)
+ ?CreateWindowSurfaceAndMakeCurrentL@CTestEglSession@@QAEXHAAVRWindow@@HHH@Z @ 86 NONAME ; void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(int, class RWindow &, int, int, int)
?CloseSgDriver@CTestEglSession@@QAEXXZ @ 87 NONAME ; void CTestEglSession::CloseSgDriver(void)
?doTestStepPreambleL@CEglTestStep@@UAE?AW4TVerdict@@XZ @ 88 NONAME ; enum TVerdict CEglTestStep::doTestStepPreambleL(void)
??0CTestEglSession@@IAE@AAVCTestExecuteLogger@@AAHH@Z @ 89 NONAME ; CTestEglSession::CTestEglSession(class CTestExecuteLogger &, int &, int)
@@ -116,4 +116,7 @@
?GetNumberOfFormats@CEglTestCommonIniSettings@@QAEHABVTDesC16@@@Z @ 115 NONAME ; int CEglTestCommonIniSettings::GetNumberOfFormats(class TDesC16 const &)
?Test_MultiProcessL@CEglTestStep@@IAEXABVTDesC16@@H0ABVTSgDrawableId@@@Z @ 116 NONAME ; void CEglTestStep::Test_MultiProcessL(class TDesC16 const &, int, class TDesC16 const &, class TSgDrawableId const &)
?PixelFormatToDisplayMode@EglTestConversion@@SA?AW4TDisplayMode@@W4TUidPixelFormat@@@Z @ 117 NONAME ; enum TDisplayMode EglTestConversion::PixelFormatToDisplayMode(enum TUidPixelFormat)
+ ?GetThresholdGPUUsedMemory@CEglTestCommonIniSettings@@QAEHABVTDesC16@@@Z @ 118 NONAME ; int CEglTestCommonIniSettings::GetThresholdGPUUsedMemory(class TDesC16 const &)
+ ?GetThresholdLastIteration@CEglTestCommonIniSettings@@QAEHABVTDesC16@@@Z @ 119 NONAME ; int CEglTestCommonIniSettings::GetThresholdLastIteration(class TDesC16 const &)
+ ?GetWindowSize@CEglTestCommonIniSettings@@QAE?AVTSize@@ABVTDesC16@@@Z @ 120 NONAME ; class TSize CEglTestCommonIniSettings::GetWindowSize(class TDesC16 const &)
--- a/egl/egltest/eabi/egltestcommonu.def Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/eabi/egltestcommonu.def Wed Mar 31 23:34:07 2010 +0300
@@ -82,7 +82,7 @@
_ZN15CTestEglSession31TryUsePixmapCFbsBitmapOpenGlesLEiRK5TSize12TDisplayModei @ 81 NONAME
_ZN15CTestEglSession34CreatePixmapSurfaceAndMakeCurrentLEiRK12TSgImageInfoNS_18TResourceCloseRuleEii @ 82 NONAME
_ZN15CTestEglSession34CreatePixmapSurfaceAndMakeCurrentLEiRK5TSize12TDisplayModeii @ 83 NONAME
- _ZN15CTestEglSession34CreateWindowSurfaceAndMakeCurrentLEiR7RWindowii @ 84 NONAME
+ _ZN15CTestEglSession34CreateWindowSurfaceAndMakeCurrentLEiR7RWindowiii @ 84 NONAME
_ZN15CTestEglSession35CreatePbufferSurfaceAndMakeCurrentLEiRK5TSizeii @ 85 NONAME
_ZN15CTestEglSession42CreatePixmapSurfaceAndMakeCurrentAndMatchLERK12TSgImageInfoNS_18TResourceCloseRuleEii @ 86 NONAME
_ZN15CTestEglSession42CreatePixmapSurfaceAndMakeCurrentAndMatchLERK5TSize12TDisplayModeii @ 87 NONAME
@@ -135,4 +135,7 @@
_ZTI15CTestEglSession @ 134 NONAME
_ZTV12CEglTestStep @ 135 NONAME
_ZTV15CTestEglSession @ 136 NONAME
+ _ZN25CEglTestCommonIniSettings13GetWindowSizeERK7TDesC16 @ 137 NONAME
+ _ZN25CEglTestCommonIniSettings25GetThresholdGPUUsedMemoryERK7TDesC16 @ 138 NONAME
+ _ZN25CEglTestCommonIniSettings25GetThresholdLastIterationERK7TDesC16 @ 139 NONAME
--- a/egl/egltest/group/egltest.mmp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/group/egltest.mmp Wed Mar 31 23:34:07 2010 +0300
@@ -85,6 +85,7 @@
LIBRARY graphicsscreencomparison.lib
LIBRARY egltestcommon.lib
LIBRARY tprofiler.lib
+LIBRARY estor.lib
DEFFILE egltest.def
--- a/egl/egltest/group/egltestcommonprocess.mmp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/group/egltestcommonprocess.mmp Wed Mar 31 23:34:07 2010 +0300
@@ -33,4 +33,6 @@
LIBRARY libEGL.lib
LIBRARY egltestcommon.lib
+CAPABILITY PowerMgmt
+
SMPSAFE
--- a/egl/egltest/group/egltestserver.mmp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/group/egltestserver.mmp Wed Mar 31 23:34:07 2010 +0300
@@ -24,7 +24,7 @@
UID 0x1000007a 0xA000E61B
VENDORID 0x70000001
-CAPABILITY none
+CAPABILITY PowerMgmt
OS_LAYER_SYSTEMINCLUDE_SYMBIAN
--- a/egl/egltest/inc/egltest_benchmark_sgimage.h Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/inc/egltest_benchmark_sgimage.h Wed Mar 31 23:34:07 2010 +0300
@@ -63,6 +63,9 @@
public:
// from CTestStep
TVerdict doTestStepL();
+protected:
+ // from CEglTestStep
+ void doProcessFunctionL(TInt aIdx);
};
#endif // __EGLTEST_BENCHMARK_SGIMAGE_H__
--- a/egl/egltest/inc/egltest_image_multiprocess.h Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/inc/egltest_image_multiprocess.h Wed Mar 31 23:34:07 2010 +0300
@@ -129,17 +129,6 @@
void doProcessFunctionL(TInt aIdx);
};
-_LIT(KEGL_Image_Multi_Process_VgImage_ProcessTerminate2, "EGL_Image_Multi_Process_VgImage_ProcessTerminate2");
-NONSHARABLE_CLASS(CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate2) : public CEglTestStep
- {
-public:
- // from CTestStep
- TVerdict doTestStepL();
-protected:
- // from CEglTestStep
- void doProcessFunctionL(TInt aIdx);
- };
-
_LIT(KEGL_Image_Multi_Process_VgImage_ProcessTerminateNegative, "EGL_Image_Multi_Process_VgImage_ProcessTerminateNegative");
NONSHARABLE_CLASS(CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminateNegative) : public CEglTestStep
{
--- a/egl/egltest/inc/egltestcommoninisettings.h Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/inc/egltestcommoninisettings.h Wed Mar 31 23:34:07 2010 +0300
@@ -66,6 +66,10 @@
IMPORT_C TInt GetNumberOfFormats(const TDesC& aSectioName);
IMPORT_C TInt GetNumberOfIterations(const TDesC& aSectioName);
IMPORT_C TSize GetImageSize(const TDesC& aSectioName);
+ IMPORT_C TInt GetThresholdGPUUsedMemory(const TDesC& aSectioName);
+ IMPORT_C TInt GetThresholdLastIteration(const TDesC& aSectioName);
+ IMPORT_C TSize GetWindowSize(const TDesC& aSectioName);
+
private:
void ConstructL();
private:
--- a/egl/egltest/inc/egltestcommonprocess.h Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/inc/egltestcommonprocess.h Wed Mar 31 23:34:07 2010 +0300
@@ -46,7 +46,8 @@
EProcSlotMsgQueueSgId,
EProcSlotMsgQueueProcId,
EProcSlotSourceFormat,
- EProcSlotSurfaceFormat
+ EProcSlotSurfaceFormat,
+ EProcSlotCustomClientParam //data that could be sent from client to main process. Concrete implementation will need to specify the format
};
class EglTestCommonProcess
--- a/egl/egltest/inc/egltestcommonsession.h Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/inc/egltestcommonsession.h Wed Mar 31 23:34:07 2010 +0300
@@ -104,9 +104,9 @@
//
//Compound functions that construct surface
//
- IMPORT_C void CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, EGLenum aBindAPI = EGL_OPENVG_API, TInt aRenderVersionNumber = 1);
+ IMPORT_C void CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, TBool aVgAlphaFormatPre = EFalse, 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 CreatePixmapSurfaceAndMakeCurrentAndMatchL(const TSize& aSize, TDisplayMode aDisplayMode, 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);
//
--- a/egl/egltest/inc/egltestcommonstep.h Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/inc/egltestcommonstep.h Wed Mar 31 23:34:07 2010 +0300
@@ -21,6 +21,7 @@
#ifndef EGLTESTCOMMONSTEP_H
#define EGLTESTCOMMONSTEP_H
+#include <e32msgqueue.h>
#include <EGL/egl.h>
#include <VG/openvg.h>
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
@@ -40,6 +41,10 @@
class RWindow;
+struct TEglStepMessageBuffer
+ {
+ TInt iBuf[64];
+ };
/**
Abstract base class for Egl test steps
@@ -120,6 +125,7 @@
IMPORT_C void GetDisplayL();
IMPORT_C void TerminateDisplayL();
+ virtual void ReceiveMessageFromClient(RMsgQueue<TEglStepMessageBuffer>& /*aMessageQueueClientProcParam*/) {}
protected:
// Session object as required for most tests
CTestEglSession* iEglSess;
--- a/egl/egltest/scripts/egltest_settings.ini Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/scripts/egltest_settings.ini Wed Mar 31 23:34:07 2010 +0300
@@ -38,10 +38,10 @@
NumIterations=1000
[Benchmark]
-NumIterations = 400 // Needs to be set with care. Making this value bigger may cause an allocation failure
- // on the emulator, it fails to create SgImage at some point.
+NumIterations = 300 // Needs to be set with care. Making this value greater may cause an allocation failure.
+ // On the emulator, it fails to create SgImage at some point.
// Hardware will have their own limitations which also need to be considered.
ImageWidth = 50 // width of RSgImage
-ImageHeight = 50 // height if RSgImage
+ImageHeight = 50 // height of RSgImage
NumFormats = 1
Format0 = EUidPixelFormatARGB_8888_PRE
--- a/egl/egltest/scripts/egltest_t_benchmark_sgimage.script Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/scripts/egltest_t_benchmark_sgimage.script Wed Mar 31 23:34:07 2010 +0300
@@ -20,4 +20,4 @@
RUN_TEST_STEP 100 egltestserver Benchmark_CreateCloseImage
RUN_TEST_STEP 100 egltestserver Benchmark_Multi_Process_CreateCloseImage
-RUN_TEST_STEP 100 egltestserver Benchmark_DrawImage
+RUN_TEST_STEP 300 egltestserver Benchmark_DrawImage
--- a/egl/egltest/scripts/egltest_t_image_multiprocess.script Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/scripts/egltest_t_image_multiprocess.script Wed Mar 31 23:34:07 2010 +0300
@@ -32,7 +32,6 @@
RUN_TEST_STEP 100 egltestserver EGL_Image_Multi_Process_ThemeServer
RUN_TEST_STEP 100 egltestserver EGL_Image_Multi_Process_VgImage_ProcessTerminate
-RUN_TEST_STEP 100 egltestserver EGL_Image_Multi_Process_VgImage_ProcessTerminate2
RUN_TEST_STEP 100 egltestserver EGL_Image_Multi_Process_VgImage_ProcessTerminateNegative
RUN_TEST_STEP 100 egltestserver EGL_Image_Multi_Process_VgImage_ReadWrite
--- a/egl/egltest/src/egltest_benchmark_sgimage.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltest_benchmark_sgimage.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -36,6 +36,13 @@
_LIT(KBenchmarkSection, "Benchmark");
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+const TInt KBenchmarkDrawImageThreshold = 5; //semi-arbitrary number which signifies deviation in percentage between min and max number of image drawing
+#endif
+
+
+#define ENABLE_BENCHMARK_VERBOSE_LOGGING 1
+
//data will be used to cleanup VgImages if leaving occurs
NONSHARABLE_CLASS(CVgImageDeleteData) : public CBase
{
@@ -163,7 +170,7 @@
return CEglTestStep::doTestStepPostambleL();
}
-//-------
+
/**
@SYMTestCaseID GRAPHICS-EGL-0434
@@ -270,9 +277,6 @@
#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
INFO_PRINTF1(_L("CEglTest_Benchmark_CreateCloseImage can only be run with SgImage-Lite"));
- RecordTestResultL();
- CloseTMSGraphicsStep();
- return TestStepResult();
#else
TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KVG_KHR_EGL_image | KEGL_KHR_image_pixmap);
if(!ret)
@@ -487,10 +491,10 @@
CleanupStack::PopAndDestroy(3, vgImageDeleteData); // vgImageDeleteData, sgImageData, eglImageDeleteData
CleanAll();
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
-#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
}
/**
@@ -569,9 +573,6 @@
#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
INFO_PRINTF1(_L("CEglTest_Benchmark_Multi_Process_CreateCloseImage can only be run with SgImage-Lite"));
- RecordTestResultL();
- CloseTMSGraphicsStep();
- return TestStepResult();
#else
TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KVG_KHR_EGL_image | KEGL_KHR_image_pixmap);
if(!ret)
@@ -585,10 +586,10 @@
// launch 2 processes
Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
-#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
}
void CEglTest_Benchmark_Multi_Process_CreateCloseImage::doProcessFunctionL(TInt aIdx)
@@ -764,7 +765,12 @@
@SYMPREQ 2637
@SYMTestCaseDesc
- Performance test - Drawing VGImage
+ Performance test - Drawing of VGImage
+
+@SYMTestPurpose
+Compare the relative speed of drawing a regular pre-existing VGImage with the
+speed of mapping in a VGImage (starting with a drawable id) and then drawing that.
+
@SYMTestActions
Environmental settings:
• Image Size: w50 h50
@@ -772,195 +778,327 @@
• Pixel format ESgPixelFormatARGB_8888_PRE
• Number of benchmark iteration: N (may vary depending on hardware capacity)
-Creating regular VGImage
-Init EGL, create context and surface
-For i = 0 to N
- Create VGImage[i] with size: 50x50 and format: VG_sARGB_8888_PRE
- SetSubData for VGImage[i]
-End loop
-
-Draw VGImage
-For i = N to 0
- Start timer
- Draw VGImage[i]
- Stop timer and record time
-End loop
-Record average time of drawing VGImage
-
-Closing regular VGImage
-For i = N to 0
- Destroy VGImage[i]
-End loop
-
-Creating VGImage from initialized RSgImage
+From the main test process:
+Spawn two processes A and B
+From process A:
Open RSgDriver
Construct TSgImageInfo object with
• Size: 50x50
• PixelFormat: ESgPixelFormatARGB_8888_PRE
• Usage: ESgUsageBitOpenVgImage;
-For i = N to 0
- Create RSgImage[i] with arguments TSgImageInfo with initialized data which were supplied to regular VGImage
- Create an EGLImage[i] from the RSgImage[i]
- Create a VGImage[i] from the EGLImage[i]
+Creation of the RSgImages:
+For i = 0 to N
+ Form pixel data in such way that there will be a mixture of opaque and transparent pixels.
+ At least one coordinate of the opaque pixel will be unique for any iteration.
+ Creating RSgImage with initialized data, size: 50x50 and format: VG_sARGB_8888_PRE.
+ Send RSgImage drawableID to process B
+End loop
+Close all RSgImages after they will have been opened in process B
+Close RSgDriver after process B finishes with benchmark measurement.
+
+From process B:
+
+For i = 0 to N
+ Receive and store drawableID[i] from process A
+End loop
+
+Init EGL, create context and pixmap surface. Make the surface current.
+Creating regular VGImage:
+For i = 0 to N
+ Create VGImage[i] with size: 50x50 and format: VG_sARGB_8888_PRE
+ SetSubData for VGImage[i] with the same data which were supplied on RSgImage creation
End loop
-Draw VGImage which is based on RSgImage
-For i = N to 0
+Draw regular VGImage:
+For j = 0 to 4
Start timer
- Draw VGImage[i]
+ For i = N to 0
+ Draw VGImage[i]
+ End loop i
Stop timer and record time
-End loop
-Record average time of drawing VGImage
+End loop j
+Complete all outstanding requests on the current context (vgFinish)
+Record max, min, average drawing time of VGImage
+Check that deviation between max and min time doesn’t exceed 5% (max – min / mean) < 0.05
+
+Destroy all regular VGImages
+Open RSgDriver
+Mapping in VGImage from initialized RSgImage and perform drawing:
+For j = 0 to 4
+ Start timer
+ For i = N to 0
+ Open RSgImage[i] with drawableID[i]
+ Create an EGLImage[i] from the RSgImage[i]
+ Create a VGImage[i] from the EGLImage[i]
+ Draw VGImage[i]
+ End loop i
+ Complete all outstanding requests on the current context (vgFinish)
+ Stop timer and record time
+End loop j
+Record max, min, average mapping and drawing time of VGImage
+Check that deviation between max and min time doesn’t exceed 5% (max – min / mean) < 0.05
+
+Destroy context, surface
Close all VGImages, EGLImages and RSgImages
+Terminate Egl environment
Close RSgDriver
@SYMTestExpectedResults
The creation of RSgImage, EGLImage and VGImage must return no error.
-The average drawing time of regular VGImage and VGImage with underlying RSgImage is
-made available in an easy-to-use format for further analysis and comparison.
+The drawing speed of regular VGImage and mapping VGImage (starting from drawable id)
+with following draw is made available in an easy-to-use format for further analysis and
+comparison.
*/
TVerdict CEglTest_Benchmark_DrawImage::doTestStepL()
{
SetTestStepID(_L("GRAPHICS-EGL-0436"));
+ SetTestStepName(KBenchmark_DrawImage);
INFO_PRINTF1(_L("CEglTest_Benchmark_DrawImage::doTestStepL"));
#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
INFO_PRINTF1(_L("CEglTest_Benchmark_DrawImage can only be run with SgImage-Lite"));
+#else
+ TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KVG_KHR_EGL_image | KEGL_KHR_image_pixmap);
+ if(ret)
+ {
+ // launch 2 processes
+ Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
+ }
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
-#else
- TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KVG_KHR_EGL_image | KEGL_KHR_image_pixmap);
- if(!ret)
- {
- // The extension is not supported
- RecordTestResultL();
- CloseTMSGraphicsStep();
- return TestStepResult();
- }
-
- ASSERT_TRUE(iDisplay == EGL_NO_DISPLAY);
+ }
+
+void CEglTest_Benchmark_DrawImage::doProcessFunctionL(TInt aIdx)
+ {
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
GetDisplayL();
- CreateEglSessionL();
- iEglSess->InitializeL();
+ CreateEglSessionL(aIdx);
+ iEglSess->InitializeL();
iEglSess->OpenSgDriverL();
- //----create pixmap and make context curent
+
TSgImageInfo imageInfo;
- imageInfo.iUsage = ESgUsageBitOpenVgImage | ESgUsageBitOpenVgSurface;
+ imageInfo.iUsage = ESgUsageBitOpenVgImage;
imageInfo.iPixelFormat = iPixelFormat;
imageInfo.iSizeInPixels = iImageSize;
- //create a dummy surface and context for the purpose of enabling use of VG
- iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo, CTestEglSession::EResourceCloseSgImageLate);
-
- const TInt KDataStride = iImageSize.iWidth * EglTestConversion::BytePerPixel(iPixelFormat);
- const TInt KDataSizeInByte = KDataStride * iImageSize.iHeight;
- TInt* data = new (ELeave) TInt[KDataSizeInByte];
- User::LeaveIfNull(data);
- CleanupStack::PushL(data);
+ RArray<TSgDrawableId> sgIdImageList;
- Mem::Fill(data, KDataSizeInByte / 2, 0xff);
- Mem::FillZ(data + KDataSizeInByte / 2, KDataSizeInByte / 2);
-
- //Creating regular VGImages
- //Create an array of VGImages and push them into cleanup stack
- //vgImageDeleteData takes ownership of the VGImages array.
- //If leaving occurs or this object is destroyed from the cleanup stack
- //it will delete all images and then the array
- VGImageFormat vgPixelFormat = EglTestConversion::PixelFormatToVgFormat(iPixelFormat);
- VGImage* vgImages = NULL;
- CVgImageDeleteData* vgImageDeleteData = new (ELeave) CVgImageDeleteData(vgImages, iNumIterations);
- CleanupStack::PushL(vgImageDeleteData);
- vgImages = new (ELeave)VGImage[iNumIterations];
- for(TInt count=iNumIterations - 1; count >= 0; --count)
- {
- //we will use VG_IMAGE_QUALITY_NONANTIALIASED flag to avoid OpenVG making the quality improvements
- //at the expense of performance (for instance to create an extra buffer)
- vgImages[count] = vgCreateImage(vgPixelFormat, iImageSize.iWidth, iImageSize.iHeight, VG_IMAGE_QUALITY_NONANTIALIASED);
- ASSERT_VG_TRUE(vgImages[count] != VG_INVALID_HANDLE);
-
- vgImageSubData(vgImages[count],
- data, KDataStride,
- vgPixelFormat,
- 0, 0, iImageSize.iWidth, iImageSize.iHeight);
- ASSERT_VG_ERROR(VG_NO_ERROR);
- }
-
- //--------- start profiling
- iProfiler->InitResults();
- for(TInt count=iNumIterations - 1; count >= 0; --count)
- {
- vgDrawImage(vgImages[count]);
-#ifdef ENABLE_CHECKING_WHILST_PROFILING
- ASSERT_VG_ERROR(VG_NO_ERROR);
-#endif
- iProfiler->MarkResultSetL();
- }
- iProfiler->ResultsAnalysis(_L("Drawing regular VGImage"), 0, EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), iNumIterations);
- //--------- stop profiling
-
- //destroy vgImages
- for(TInt count=iNumIterations - 1; count >= 0; --count)
- {
- vgDestroyImage(vgImages[count]);
- ASSERT_VG_ERROR(VG_NO_ERROR);
- vgImages[count]=VG_INVALID_HANDLE;
- }
-
+ const TInt KNumAttempt = 5;
+ const TInt KNumImagesToDraw = iNumIterations;
//Create an array of SgImages and push them into cleanup stack
//sgImageData takes ownership of the SgImages array.
//If leaving occurs or this object is destroyed from the cleanup stack
//it will delete all images and then the array
- imageInfo.iUsage = ESgUsageBitOpenVgImage;
RSgImage* sgImages = NULL;
- CSgImageDeleteData* sgImageData = new (ELeave)CSgImageDeleteData(sgImages, iNumIterations);
+ CSgImageDeleteData* sgImageData = new (ELeave)CSgImageDeleteData(sgImages, KNumImagesToDraw);
CleanupStack::PushL(sgImageData);
- sgImages = new (ELeave) RSgImage[iNumIterations];
+ sgImages = new (ELeave) RSgImage[KNumImagesToDraw];
+
+ // the message queue will be used to pass image IDs across process boundary
+ RMsgQueue<TSgDrawableId> messageQueue;
+ User::LeaveIfError(messageQueue.Open(EProcSlotMsgQueueSgId, EOwnerProcess));
+ CleanupClosePushL(messageQueue);
+
+ //create iNumIterations * KNumAttempt number of SgImages in one process and send them over to the second process
+ INFO_PRINTF3(_L("Process %d, Start sending %d SgImage IDs to other process..."), aIdx, iNumIterations);
+ if(aIdx == 0)
+ {
+ TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(KDefaultSourceFormat);
+ for(TInt index=0; index < KNumImagesToDraw; ++index)
+ {
+ CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, iImageSize, index);
+ CleanupStack::PushL(bitmap);
+ ASSERT_EQUALS(sgImages[index].Create(imageInfo, bitmap->DataAddress(),bitmap->DataStride()), KErrNone);
+ messageQueue.SendBlocking(sgImages[index].Id());
+ CleanupStack::PopAndDestroy(bitmap);
+ }
+ }
+ else if(aIdx == 1)
+ {
+ for(TInt index=0; index < KNumImagesToDraw; ++index)
+ {
+ TSgDrawableId sgImageId;
+ messageQueue.ReceiveBlocking(sgImageId);
+ sgIdImageList.AppendL(sgImageId);
+ }
+ }
+ CleanupStack::PopAndDestroy(&messageQueue);
+ INFO_PRINTF3(_L("Process %d, Finish sending %d SgImage IDs to other process..."), aIdx, iNumIterations);
+ //We expect to reach this point from both processes simultaneously
+ //this is because ReceiveBlocking/SendBlocking are synchronous
- //Create an array of EglImages and push them into cleanup stack
- //eglImageDeleteData takes ownership of the EglImages array.
- //If leaving occurs or this object is destroyed from the cleanup stack
- //it will delete all images and then the array
- EGLImageKHR* eglImages = NULL;
- CEglImageDeleteData* eglImageDeleteData = new (ELeave)CEglImageDeleteData(*this, eglImages, iDisplay, iNumIterations);
- CleanupStack::PushL(eglImageDeleteData);
- eglImages = new (ELeave) EGLImageKHR[iNumIterations];
-
- //Creating VGImage from initialized RSgImage
- for(TInt count=iNumIterations-1; count >= 0; --count)
+ if(aIdx == 1)
{
- const TInt res = sgImages[count].Create(imageInfo, data, KDataStride);
- TESTL(res == KErrNone);
- TESTL(!sgImages[count].IsNull());
+ imageInfo.iUsage = ESgUsageBitOpenVgImage | ESgUsageBitOpenVgSurface;
+ //create a dummy surface and context for the purpose of enabling use of VG
+ iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo, CTestEglSession::EResourceCloseSgImageLate);
- eglImages[count]= iEglSess->eglCreateImageKhrL(iDisplay,EGL_NO_CONTEXT,EGL_NATIVE_PIXMAP_KHR,&sgImages[count],const_cast<EGLint *> (KEglImageAttribsPreservedTrue));
- ASSERT_EGL_TRUE(eglImages[count] != EGL_NO_IMAGE_KHR)
+ //Creating regular VGImages
+ //Create an array of VGImages and push them into cleanup stack
+ //vgImageDeleteData takes ownership of the VGImages array.
+ //If leaving occurs or this object is destroyed from the cleanup stack
+ //it will delete all images and then the array
+ VGImageFormat vgPixelFormat = EglTestConversion::PixelFormatToVgFormat(iPixelFormat);
+ VGImage* vgImages = NULL;
+ CVgImageDeleteData* vgImageDeleteData = new (ELeave) CVgImageDeleteData(vgImages, KNumImagesToDraw);
+ CleanupStack::PushL(vgImageDeleteData);
+ vgImages = new (ELeave)VGImage[KNumImagesToDraw];
+ for(TInt index=KNumImagesToDraw - 1; index >= 0; --index)
+ {
+ //we will use VG_IMAGE_QUALITY_NONANTIALIASED flag to avoid OpenVG making the quality improvements
+ //at the expense of performance (for instance to create an extra buffer)
+ vgImages[index] = vgCreateImage(vgPixelFormat, iImageSize.iWidth, iImageSize.iHeight, VG_IMAGE_QUALITY_NONANTIALIASED);
+ ASSERT_VG_TRUE(vgImages[index] != VG_INVALID_HANDLE);
+
+ TDisplayMode bitmapMode = EglTestConversion::VgFormatToDisplayMode(EglTestConversion::PixelFormatToVgFormat(iPixelFormat));
+ CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, iImageSize, index);
+ CleanupStack::PushL(bitmap);
+ // Add pixel data to the VGImage reference from the bitmap reference.
+ // Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
+ TUint8* address = reinterpret_cast<TUint8*>(bitmap->DataAddress());
+ TInt stride = bitmap->DataStride();
+ address += (iImageSize.iHeight - 1) * stride;
+ vgImageSubData(vgImages[index], address, -stride,
+ KDefaultSurfaceFormat, 0,0, iImageSize.iWidth, iImageSize.iHeight);
+ ASSERT_VG_ERROR(VG_NO_ERROR);
+ CleanupStack::PopAndDestroy(bitmap);
+ }
+#ifdef ENABLE_BENCHMARK_VERBOSE_LOGGING
+ iProfiler->SetStoreResultInTimingOrder(ETrue);
+#endif
+ //--------- start profiling
+ INFO_PRINTF1(_L("Profiling of drawing of the regular VG image"));
+ iProfiler->InitResults();
+ for(TInt count = KNumAttempt - 1; count >= 0; --count)
+ {
+ for(TInt index=iNumIterations - 1; index >= 0; --index)
+ {
+ vgDrawImage(vgImages[index]);
+#ifdef ENABLE_CHECKING_WHILST_PROFILING
+ ASSERT_VG_ERROR(VG_NO_ERROR);
+#endif
+ }
+ vgFinish();
+#ifdef ENABLE_CHECKING_WHILST_PROFILING
+ ASSERT_VG_ERROR(VG_NO_ERROR);
+#endif
+ iProfiler->MarkResultSetL();
+ }
+ iProfiler->ResultsAnalysis(_L("Drawing of the regular VGImages"), 0, EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), KNumAttempt);
+#ifdef ENABLE_BENCHMARK_VERBOSE_LOGGING
+ iProfiler->ShowResultArrayInTimingOrder();
+
+ const TInt KDeviationRegular = ((((TReal)(iProfiler->TimeMax())) - iProfiler->TimeMin()) / (TReal)(iProfiler->Mean())) * 100;
+ INFO_PRINTF3(_L("Deviation in percentage between min and max number of images drawing ((TimeMax - TimeMin) / Mean * 100): %d, threshold: %d "), KDeviationRegular, KBenchmarkDrawImageThreshold);
+ if(KDeviationRegular > KBenchmarkDrawImageThreshold)
+ {
+ //unfortunatelly EGL test framework currently ignores the error because this is a spawned process, and not
+ // the main cteststep process. We could leave, but that would be too harsh in this situation
+ WARN_PRINTF1(_L("***The deviation has exceeded threshold, the number of iteration needs to be increased!!!"));
+ }
+#endif
+ //--------- stop profiling
+
+ //destroy vgImages
+ for(TInt index=0; index < KNumImagesToDraw; index++)
+ {
+ vgDestroyImage(vgImages[index]);
+ vgImages[index]=VG_INVALID_HANDLE;
+ ASSERT_VG_ERROR(VG_NO_ERROR);
+ }
+
+ //Create an array of EglImages and push them into cleanup stack
+ //eglImageDeleteData takes ownership of the EglImages array.
+ //If leaving occurs or this object is destroyed from the cleanup stack
+ //it will delete all images and then the array
+ EGLImageKHR* eglImages = NULL;
+ CEglImageDeleteData* eglImageDeleteData = new (ELeave)CEglImageDeleteData(*this, eglImages, iDisplay, KNumImagesToDraw);
+ CleanupStack::PushL(eglImageDeleteData);
+ eglImages = new (ELeave) EGLImageKHR[KNumImagesToDraw];
+
+ //---------------start profiling
+ INFO_PRINTF1(_L("Profiling of mapping in and drawing of the VG images with underlying RSgImage"));
+ iProfiler->InitResults();
+ for(TInt count = KNumAttempt - 1; count >= 0; --count)
+ {//we will run KNumAttemt times in a row and check that the set of results is consistent,
+ // i.e. deviation between max and min time doesn't exceed KBenchmarkDrawImageThreshold percentage
+
+ for(TInt index=iNumIterations - 1; index >= 0; --index)
+ {
+#ifdef ENABLE_CHECKING_WHILST_PROFILING
+ const TInt res = sgImages[index].Open(sgIdImageList[index]);
+ TESTL(res == KErrNone);
+ TESTL(!sgImages[index].IsNull());
+ eglImages[index]= iEglSess->eglCreateImageKhrL(iDisplay,EGL_NO_CONTEXT,EGL_NATIVE_PIXMAP_KHR,&sgImages[index],const_cast<EGLint *> (KEglImageAttribsPreservedTrue));
+ ASSERT_EGL_TRUE(eglImages[index] != EGL_NO_IMAGE_KHR)
+ vgImages[index] = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImages[index]);
+ ASSERT_VG_TRUE(vgImages[index] != VG_INVALID_HANDLE);
+ vgDrawImage(vgImages[index]);
+ ASSERT_VG_ERROR(VG_NO_ERROR);
+#else
+ const TInt res = sgImages[index].Open(sgIdImageList[index]);
+ eglImages[index]= iEglSess->eglCreateImageKhrL(iDisplay,EGL_NO_CONTEXT,EGL_NATIVE_PIXMAP_KHR,&sgImages[index],const_cast<EGLint *> (KEglImageAttribsPreservedTrue));
+ vgImages[index] = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImages[index]);
+ vgDrawImage(vgImages[index]);
+
+#endif //ENABLE_CHECKING_WHILST_PROFILING
+ }
+ vgFinish();
+#ifdef ENABLE_CHECKING_WHILST_PROFILING
+ ASSERT_VG_ERROR(VG_NO_ERROR);
+#endif
+ iProfiler->MarkResultSetAndSuspendL(); //mark the end of the iteration. The timer will not be resumed yet
+
+ // Clean Sg/Vg/Egl images.
+ // This is to ensure that expanding of the images will not impact measurement
+ for(TInt index=iNumIterations - 1; index >= 0; --index)
+ {
+ sgImages[index].Close();
+ vgDestroyImage(vgImages[index]);
+ vgImages[index] = VG_INVALID_HANDLE;
+ iEglSess->DestroyEGLImage( iDisplay, eglImages[index]);
+ eglImages[index] = EGL_NO_IMAGE_KHR;
+ }
+
+ iProfiler->StartTimer();
+ }
+ //----------------stop profiling
- vgImages[count] = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImages[count]);
- ASSERT_VG_TRUE(vgImages[count] != VG_INVALID_HANDLE);
+ const TInt KDeviation = ((((TReal)(iProfiler->TimeMax())) - iProfiler->TimeMin()) / (TReal)(iProfiler->Mean())) * 100;
+ INFO_PRINTF3(_L("Deviation in percentage between min and max number of images drawing ((TimeMax - TimeMin) / Mean * 100): %d, threshold: %d "), KDeviation, KBenchmarkDrawImageThreshold);
+ if(KDeviation > KBenchmarkDrawImageThreshold)
+ {
+ //unfortunatelly EGL test framework currently ignores the error because this is a spawned process, and not
+ // the main cteststep process. We could leave, but that would be too harsh in this situation
+ WARN_PRINTF1(_L("***The deviation has exceeded threshold, the number of iteration needs to be increased!!!"));
+ }
+
+ iProfiler->ResultsAnalysis(_L("Drawing VGImages with underlying RSgImage"), 0, EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), KNumAttempt);
+#ifdef ENABLE_BENCHMARK_VERBOSE_LOGGING
+ iProfiler->ShowResultArrayInTimingOrder();
+#endif
+ sgIdImageList.Reset();
}
- //---------------start profiling
- iProfiler->InitResults();
- for(TInt count=iNumIterations - 1; count >= 0; --count)
+ //Introduce synchronization point here to make sure that RSgImages are not closed from the
+ //first process while the second one is busy with benchmark measurement
+ Rendezvous(aIdx);
+ if(aIdx == 0)
{
- vgDrawImage(vgImages[count]);
-#ifdef ENABLE_CHECKING_WHILST_PROFILING
- ASSERT_VG_ERROR(VG_NO_ERROR);
-#endif
- iProfiler->MarkResultSetL();
+ //Destroying VGImage/EGLImage/RSgImages
+ //no need to profile as we have already done this before
+ CleanupStack::PopAndDestroy(sgImageData); // sgImageData
}
- iProfiler->ResultsAnalysis(_L("Drawing VGImage with underlying RSgImage "), 0, EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), EglTestConversion::PixelFormatToDisplayMode(iPixelFormat), iNumIterations);
- //----------------stop profiling
-
- //Destroying VGImage/EGLImage/RSgImages
- //no need to profile as we have already done this before
- CleanupStack::PopAndDestroy(4, data); // data, vgImageDeleteData, sgImageData, eglImageDeleteData
-
+ else
+ {
+ //Destroying VGImage/EGLImage/RSgImages
+ //no need to profile as we have already done this before
+ CleanupStack::PopAndDestroy(3, sgImageData); // sgImageData, vgImageDeleteData, eglImageDeleteData
+ }
CleanAll();
- RecordTestResultL();
- CloseTMSGraphicsStep();
- return TestStepResult();
#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
}
--- a/egl/egltest/src/egltest_geterroranddisplay.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltest_geterroranddisplay.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -963,7 +963,7 @@
TEST(eglGetError() == EGL_SUCCESS);
// launch 100 threads.
- Test_MultiThreadL(100, EFalse);
+ Test_MultiThreadL(100, ETrue);
INFO_PRINTF1(_L("Calling eglTerminate from main thread"));
TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
--- a/egl/egltest/src/egltest_image_multiprocess.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltest_image_multiprocess.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -107,7 +107,7 @@
// destroy sgImage
CleanupStack::PopAndDestroy(2, bitmap);
-
+
// clean everything
CleanAll();
INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_Sibling_Basic::doTestStepL"));
@@ -117,7 +117,7 @@
}
void CEglTest_EGL_Image_Multi_Process_Sibling_Basic::doProcessFunctionL(TInt aIdx,const TSgDrawableId& aSgId)
- {
+ {
INFO_PRINTF2(_L("CEglTest_EGL_Image_Multi_Process_Sibling_Basic::doProcessFunctionL, Process %d"),aIdx);
GetDisplayL();
CreateEglSessionL(aIdx);
@@ -127,12 +127,12 @@
RSgImage sgImageFromId;
CleanupClosePushL(sgImageFromId);
ASSERT_EQUALS(sgImageFromId.Open(aSgId),KErrNone);
-
+
INFO_PRINTF2(_L("Process %d, Creating an EGLImage from the shared RSgImage"),aIdx);
EGLImageKHR eglImage = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImageFromId, KEglImageAttribsPreservedTrue);
ASSERT_EGL_TRUE(eglImage != EGL_NO_IMAGE_KHR);
CleanupStack::PopAndDestroy(&sgImageFromId);
-
+
INFO_PRINTF2(_L("Process %d, EGLImage successfully created, now destroying it"),aIdx);
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImage));
@@ -155,7 +155,7 @@
@SYMTestActions
Run two processes that independently perform the same actions detailed below.
-This test will check for the “VG_KHR_EGL_image” extension, if it is not
+This test will check for the “VG_KHR_EGL_image” extension, if it is not
supported on this platform then the test will return immediately without failure.
Create and fully construct an RSgImage object
• Set the iUsage bits to ESgUsageBitOpenVgImage
@@ -166,21 +166,21 @@
Check that eglCreateImageKHR() does NOT return EGL_NO_IMAGE_KHR
Use vgCreateEGLImageTargetKHR() to construct a VGImage object from the EGLImage.
• Check for errors (VGInvalidHandle is not returned)
-Create a second RSgImage, and use it to create a pixmap surface that is
+Create a second RSgImage, and use it to create a pixmap surface that is
compatible as a target for the VGImage to be drawn to.
• Set the iUsage bit to ESgUsageBitOpenVgSurface
• Use the same pixel format as the RSgImage above.
-Now that a eglContext and an OpenVG context have been created, use the
-OpenVG API vgClearImage to clear to a chosen colour the VGImage previously
+Now that a eglContext and an OpenVG context have been created, use the
+OpenVG API vgClearImage to clear to a chosen colour the VGImage previously
returned by eglCreateImageKHR.
-Use OpenVG to draw the just drawn VGImage to the pixmap surface currently
+Use OpenVG to draw the just drawn VGImage to the pixmap surface currently
linked to the context.
Call eglWaitClient() to finish the above drawing instructions synchronously.
Destroy the original image data
• Pass the VGImage into vgDestroyImage()
• Pass the EGLImage into eglDestroyImageKHR()
• Close the first RSgImage
-• Check that the pixmap surface contains expected pixel values using
+• Check that the pixmap surface contains expected pixel values using
OpenVG APIs, vgReadPixels.
Close the second RSgImage and destroy the pixmap surface
Check for memory and handle leaks
@@ -194,7 +194,7 @@
SetTestStepID(_L("GRAPHICS-EGL-0161"));
SetTestStepName(KEGL_Image_Multi_Process_Parallel);
INFO_PRINTF1(_L("Enter: CEglTest_EGL_Image_Multi_Process_Parallel::doTestStepL"));
-
+
TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KEGL_KHR_image_pixmap | KVG_KHR_EGL_image);
if(!ret)
{
@@ -206,8 +206,8 @@
// launch 2 processes
Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
-
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_Parallel::doTestStepL"));
+
+ INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_Parallel::doTestStepL"));
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -218,7 +218,7 @@
INFO_PRINTF2(_L("CEglTest_EGL_Image_Multi_Process_Parallel::doProcessFunctionL, Process %d"),aIdx);
GetDisplayL();
CreateEglSessionL(aIdx);
- iEglSess->InitializeL();
+ iEglSess->InitializeL();
iEglSess->OpenSgDriverL();
// create a reference bitmap (we give index 3 for example, as there's only 1 image in this test case)
@@ -238,7 +238,7 @@
ASSERT_EGL_TRUE(eglImageLocal != EGL_NO_IMAGE_KHR);
CleanupStack::PopAndDestroy(&rSgImageLocal); //transferring ownership of the buffer to the EGLImage
CleanupStack::PopAndDestroy(bitmap);
-
+
INFO_PRINTF2(_L("Process %d, Creating a Surface and a Context bound to OpenVG"),aIdx);
TUidPixelFormat pixelFormat = EglTestConversion::VgFormatToSgPixelFormat(KDefaultSurfaceFormat);
TSgImageInfoOpenVgTarget imageInfo2 = TSgImageInfoOpenVgTarget(pixelFormat, KImageSize);
@@ -265,7 +265,7 @@
iEglSess->CheckVgDrawingL(KDefaultSurfaceFormat, refBitmap);
CleanupStack::PopAndDestroy(refBitmap);
INFO_PRINTF2(_L("Drawing successful, Process %d"),aIdx);
-
+
// cleanup
CleanAll();
}
@@ -344,10 +344,10 @@
// destroy sgImage
CleanupStack::PopAndDestroy(&sgImage);
CleanupStack::PopAndDestroy(bitmap);
-
+
// clean everything
CleanAll();
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_Sibling_CheckContents::doTestStepL"));
+ INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_Sibling_CheckContents::doTestStepL"));
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -364,28 +364,28 @@
RSgImage sgImageFromId;
CleanupClosePushL(sgImageFromId);
ASSERT_EQUALS(sgImageFromId.Open(aSgId),KErrNone);
-
+
INFO_PRINTF2(_L("Process %d, Creating an EGLImage from the shared RSgImage"),aIdx);
EGLImageKHR eglImageLocal = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImageFromId, KEglImageAttribsPreservedTrue);
ASSERT_EGL_TRUE(eglImageLocal != EGL_NO_IMAGE_KHR);
CleanupStack::PopAndDestroy(&sgImageFromId);
-
+
INFO_PRINTF2(_L("Process %d, Creating a Surface and a Context bound to OpenVG"),aIdx);
TUidPixelFormat pixelFormat = EglTestConversion::VgFormatToSgPixelFormat(KDefaultSurfaceFormat);
TSgImageInfoOpenVgTarget imageInfo = TSgImageInfoOpenVgTarget(pixelFormat, KImageSize);
// Create a pixmap surface matching the native image pixel format
iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo,CTestEglSession::EResourceCloseSgImageEarly);
-
+
INFO_PRINTF2(_L("Process %d, Creating one VGImage from the EGLImage"),aIdx);
VGImage vgImageLocal = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImageLocal);
ASSERT_VG_TRUE(vgImageLocal != VG_INVALID_HANDLE);
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImageLocal));
-
+
if(aIdx == 0)
{
TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(KDefaultSourceFormat);
CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KImageSize, 4);
- // Add pixel data to the VGImage reference from the bitmap reference.
+ // Add pixel data to the VGImage reference from the bitmap reference.
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
TSize bitmapSize = bitmap->SizeInPixels();
TUint8* address = reinterpret_cast<TUint8*>(bitmap->DataAddress());
@@ -397,10 +397,10 @@
ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
eglWaitClient();
}
-
+
// Wait for both processes to reach this point (process 0 will have updated the VGImage)
Rendezvous(aIdx);
-
+
if(aIdx == 1)
{
INFO_PRINTF2(_L("Process %d, Drawing the VGImage to the current surface"),aIdx);
@@ -472,7 +472,7 @@
// launch 2 processes
Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_Source::doTestStepL"));
+ INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_Source::doTestStepL"));
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -483,7 +483,7 @@
INFO_PRINTF2(_L("CEglTest_EGL_Image_Multi_Process_VgImage_Source::doProcessFunctionL, Process %d"),aIdx);
GetDisplayL();
CreateEglSessionL(aIdx);
- iEglSess->InitializeL();
+ iEglSess->InitializeL();
iEglSess->OpenSgDriverL();
RMsgQueue<TSgDrawableId> messageQueue;
@@ -506,7 +506,7 @@
#endif
ASSERT_EQUALS(rSgImageLocal.Create(imageInfo,bitmap->DataAddress(),bitmap->DataStride()), KErrNone);
CleanupStack::PopAndDestroy(bitmap);
-
+
INFO_PRINTF2(_L("Process %d, Sending SgImage ID to other process..."), aIdx);
messageQueue.SendBlocking(rSgImageLocal.Id());
}
@@ -560,7 +560,7 @@
INFO_PRINTF2(_L("Process %d, Changing contents of the VGImage"),aIdx);
TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(KDefaultSourceFormat);
CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KImageSize, 4);
- // Add pixel data to the VGImage reference from the bitmap reference.
+ // Add pixel data to the VGImage reference from the bitmap reference.
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
TSize bitmapSize = bitmap->SizeInPixels();
TUint8* address = reinterpret_cast<TUint8*>(bitmap->DataAddress());
@@ -575,7 +575,7 @@
// Wait for both processes to reach this point (process 0 will have updated the VGImage)
Rendezvous(aIdx);
-
+
if(aIdx == 1)
{
INFO_PRINTF2(_L("Drawing the VGImage to the current surface after changing contents of the VGImage, Process %d"),aIdx);
@@ -649,7 +649,7 @@
// launch 2 processes
Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_DrawAfterTerminate::doTestStepL"));
+ INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_DrawAfterTerminate::doTestStepL"));
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -666,7 +666,7 @@
RMsgQueue<TSgDrawableId> messageQueue;
User::LeaveIfError(messageQueue.Open(EProcSlotMsgQueueSgId, EOwnerProcess));
CleanupClosePushL(messageQueue);
-
+
RSgImage rSgImageLocal;
if(aIdx == 0)
{
@@ -683,7 +683,7 @@
#endif
ASSERT_EQUALS(rSgImageLocal.Create(imageInfo,bitmap->DataAddress(),bitmap->DataStride()), KErrNone);
CleanupStack::PopAndDestroy(bitmap);
-
+
INFO_PRINTF2(_L("Process %d, Sending SgImage ID to other process..."), aIdx);
messageQueue.SendBlocking(rSgImageLocal.Id());
}
@@ -694,7 +694,7 @@
messageQueue.ReceiveBlocking(sgImageId);
ASSERT_EQUALS(rSgImageLocal.Open(sgImageId),KErrNone);
}
-
+
INFO_PRINTF2(_L("Process %d, Creating an EGLImage from the shared RSgImage"),aIdx);
CleanupClosePushL(rSgImageLocal);
EGLImageKHR eglImageLocal = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &rSgImageLocal, KEglImageAttribsPreservedTrue);
@@ -711,7 +711,7 @@
VGImage vgImageLocal = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImageLocal);
ASSERT_VG_TRUE(vgImageLocal != VG_INVALID_HANDLE);
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImageLocal));
-
+
if(aIdx == 1)
{
INFO_PRINTF2(_L("Process %d, Drawing the VGImage to the current surface before changing contents of the VGImage"),aIdx);
@@ -719,7 +719,7 @@
vgSetPixels(0, 0, vgImageLocal, 0, 0, KImageSize.iWidth, KImageSize.iHeight);
ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
eglWaitClient();
-
+
// we can now compare the VgImage to the one we expect before we apply any change to it
TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(KDefaultSourceFormat);
@@ -738,7 +738,7 @@
INFO_PRINTF2(_L("Process %d, Changing contents of the VGImage"),aIdx);
TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(KDefaultSourceFormat);
CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KImageSize, 2);
- // Add pixel data to the VGImage reference from the bitmap reference.
+ // Add pixel data to the VGImage reference from the bitmap reference.
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
TSize bitmapSize = bitmap->SizeInPixels();
TUint8* address = reinterpret_cast<TUint8*>(bitmap->DataAddress());
@@ -758,7 +758,7 @@
// Wait for both processes to reach this point
Rendezvous(aIdx);
-
+
if(aIdx == 1)
{
INFO_PRINTF2(_L("Drawing the VGImage to the current surface after changing contents of the VGImage, Process %d"),aIdx);
@@ -805,18 +805,18 @@
• EUidPixelFormatA_8 (source only)
- Note that when using EUidPixelFormatA_8 as a source, the reference bitmap display mode used is EGray256,
This is to enable using the reference bitmap as an alpha mask.
-- Spawn N client processes. During the process launching, pass to each process single drawable ID from the SgImages.
- In order to define which SgImage needs to be passed to the particular process, there will be following
+- Spawn N client processes. During the process launching, pass to each process single drawable ID from the SgImages.
+ In order to define which SgImage needs to be passed to the particular process, there will be following
formula applied: J = P Mod (M), where J is the sequence number of the image, P is the particular process number.
From processes 1 to N:
- Open SgImage by using TSgDrawableId, obtained from the SgImage which was passed from the process A.
-- Using EGL extension, create EGLImage specifying as EGLClientBuffer SgImage which was created on
+- Using EGL extension, create EGLImage specifying as EGLClientBuffer SgImage which was created on
previous step, EGL_NATIVE_PIXMAP_KHR as a target and EGL_IMAGE_PRESERVED_KHR as an attribute
-- Using VG extension, create VG image based on EGLImage from the previous step.
+- Using VG extension, create VG image based on EGLImage from the previous step.
- Close Sg and EGL images
-- Create second SgImage with the same size and pixel format as first SgImage and usage flag is set to ESgUsageBitOpenVgSurface.
-- Create off-screen pixmap surface with underlining second SgImage and make it current for the drawing context.
-- Draw VGImage to the off-screen surface (note that when using EUidPixelFormatA_8 as a source, the
+- Create second SgImage with the same size and pixel format as first SgImage and usage flag is set to ESgUsageBitOpenVgSurface.
+- Create off-screen pixmap surface with underlining second SgImage and make it current for the drawing context.
+- Draw VGImage to the off-screen surface (note that when using EUidPixelFormatA_8 as a source, the
reference bitmap is used as an alpha mask).
- Draw VGImage to the off-screen surface.
- Retrieve surface data (see vgReadPixels() API)
@@ -824,7 +824,7 @@
@SYMTestExpectedResults
Creation of all drawable resources have been completed without errors.
Image data obtained in client processes 1-N matches to the data which have been uploaded to the SgImages buffer from
-process A. Reference counting works correctly and keeps VG image alive although bound Sg and EGL images have been destroyed.
+process A. Reference counting works correctly and keeps VG image alive although bound Sg and EGL images have been destroyed.
When all resources are closed, resource count maintained by RSgDriver extension is zero in all processes.
*/
TVerdict CEglTest_EGL_Image_Multi_Process_FontServer_Upfront::doTestStepL()
@@ -868,7 +868,7 @@
// A_8 related tests are only performed for SgImage-Lite
if (iSourceFormat == EUidPixelFormatA_8)
continue;
-#endif
+#endif
doTestPartialStepL();
}
}
@@ -913,8 +913,8 @@
}
INFO_PRINTF2(_L("MAIN PROCESS: About to launch %d processes..."), KNumProcesses);
- Test_MultiProcessL(KEglTestStepDllName, KNumProcesses, TestStepName(), sgIdList); //the function will guarantee that all images will be opened before it returns
- CleanupStack::PopAndDestroy(2 * KNumImages + 1, &sgIdList); // KNumImages SgImages, KNumImages bitmaps, sgIdList
+ Test_MultiProcessL(KEglTestStepDllName, KNumProcesses, TestStepName(), sgIdList); //the function will guarantee that all images will be opened before it returns
+ CleanupStack::PopAndDestroy(2 * KNumImages + 1, &sgIdList); // KNumImages SgImages, KNumImages bitmaps, sgIdList
INFO_PRINTF2(_L("MAIN PROCESS: All %d launched processes have completed!"), KNumProcesses);
CleanAll();
@@ -955,9 +955,9 @@
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImage));
// At this point we draw the VGImage created from the SgImage to the current surface.
- // # if the source is a A_8, the VGImage acts as a mask and the target surface must contain
+ // # if the source is a A_8, the VGImage acts as a mask and the target surface must contain
// as a result the pen colour set above blended with the mask
- // # otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required)
+ // # otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required)
INFO_PRINTF1(_L("Copying the VGImage to the surface"));
if (iSourceFormat == EUidPixelFormatA_8)
{
@@ -975,7 +975,7 @@
VGuint fillColor = 0x008000ff; // opaque dark green
vgSetColor(fillPaint, fillColor);
ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
-
+
vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
vgDrawImage(vgImage);
@@ -996,7 +996,7 @@
// a) a reference bitmap needs to be cleared to black (same colour as the surface was cleared to)
// b) a Pen bitmap, that we clear to dark green (same colour as the fillPaint used to draw to the surface)
// c) a mask bitmap, which is the reference bitmap used to create the SgImage
- // # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage
+ // # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage
if (iSourceFormat == EUidPixelFormatA_8)
{
TDisplayMode maskMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
@@ -1009,7 +1009,7 @@
CFbsBitmap* refBitmap = iEglSess->CreateReferenceMaskedBitmapL(refbitmapMode, KRgbDarkGreen, mask);
CleanupStack::PushL(refBitmap);
-
+
// compare the obtained reference bitmap with the surface drawn
iEglSess->CheckVgDrawingL(iSurfaceFormat, refBitmap);
CleanupStack::PopAndDestroy(2, mask); //mask, refBitmap
@@ -1051,29 +1051,29 @@
• EUidPixelFormatRGB_565
• EUidPixelFormatXRGB_8888
• EUidPixelFormatARGB_8888_PRE
-- Using EGL extension, create M EGLImage(s), specifying as EGLClientBuffer SgImage(s) which were created on
+- Using EGL extension, create M EGLImage(s), specifying as EGLClientBuffer SgImage(s) which were created on
first step and EGL_NATIVE_PIXMAP_KHR as a target
- Using VG extension, create VG images based on EGLImage(s) from the previous step
- Close Sg and EGL Images
-- Populate data in VGImages (see vgImageSubData(..) API), there will be different data uploaded for each VGImage
-- Spawn N client processes. During the process launching, pass to each process single drawable ID from the SgImages.
- In order to define which SgImage(s) needs to be passed to the particular processes, there will be following
+- Populate data in VGImages (see vgImageSubData(..) API), there will be different data uploaded for each VGImage
+- Spawn N client processes. During the process launching, pass to each process single drawable ID from the SgImages.
+ In order to define which SgImage(s) needs to be passed to the particular processes, there will be following
formula applied: J = P Mod (M), where J is the sequence number of the image, P is the particular process number.
From processes 1 to N:
- Open SgImage by using TSgDrawableId, obtained from the SgImage which was passed from the process A.
-- Using EGL extension, create EGLImage specifying as EGLClientBuffer SgImage which was created on previous step,
+- Using EGL extension, create EGLImage specifying as EGLClientBuffer SgImage which was created on previous step,
EGL_NATIVE_PIXMAP_KHR as a target and EGL_IMAGE_PRESERVED_KHR as an attribute
-- Using VG extension, create VG image based on EGLImage from the previous step.
+- Using VG extension, create VG image based on EGLImage from the previous step.
- Close Sg and EGL images
-- Create second SgImage with the same size and pixel format as first SgImage and usage flag is set to ESgUsageBitOpenVgSurface.
-- Create off-screen pixmap surface with underlining second SgImage and make it current for the drawing context.
+- Create second SgImage with the same size and pixel format as first SgImage and usage flag is set to ESgUsageBitOpenVgSurface.
+- Create off-screen pixmap surface with underlining second SgImage and make it current for the drawing context.
- Draw VGImage to the off-screen surface.
- Retrieve surface data (see vgReadPixels() API)
@SYMTestExpectedResults
Creation of all drawable resources have been completed without errors.
-Image data obtained in client processes 1-N matches to the data which have been uploaded to the SgImages buffer from
-process A. Reference counting works correctly and keep VG image alive although bound Sg and EGL images have been closed.
+Image data obtained in client processes 1-N matches to the data which have been uploaded to the SgImages buffer from
+process A. Reference counting works correctly and keep VG image alive although bound Sg and EGL images have been closed.
When all resources are closed, resource count maintained by RSgDriver extension is zero in all processes.
*/
TVerdict CEglTest_EGL_Image_Multi_Process_FontServer_Deferred::doTestStepL()
@@ -1108,7 +1108,7 @@
// A_8 related tests are only performed for SgImage-Lite
if (iSourceFormat == EUidPixelFormatA_8)
continue;
-#endif
+#endif
doTestPartialStepL();
}
@@ -1122,7 +1122,7 @@
{
INFO_PRINTF1(_L("CEglTest_EGL_Image_Multi_Process_FontServer_Deferred::doTestPartialStepL"));
PrintUsedPixelConfiguration();
-
+
// Create display object
ASSERT_TRUE(iDisplay == EGL_NO_DISPLAY);
GetDisplayL();
@@ -1137,7 +1137,7 @@
#else
imageInfo.iUsage = ESgUsageOpenVgImage | ESgUsageOpenVgTarget;
imageInfo.iShareable = ETrue;
-#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
// Create a pixmap surface matching the given pixel format
iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo,CTestEglSession::EResourceCloseSgImageEarly);
@@ -1153,16 +1153,16 @@
CleanupClosePushL(sgImages[i]);
ASSERT_EQUALS(sgIdList.Insert(sgImages[i].Id(),i), KErrNone);
- EGLImageKHR eglImage = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImages[i], KEglImageAttribsPreservedTrue);
+ EGLImageKHR eglImage = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImages[i], KEglImageAttribsPreservedTrue);
ASSERT_EGL_TRUE(eglImage != EGL_NO_IMAGE_KHR);
-
+
VGImage vgImage = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImage);
ASSERT_VG_TRUE(vgImage != VG_INVALID_HANDLE);
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImage));
TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KImageSize, i);
- // Add pixel data to the VGImage reference from the bitmap reference.
+ // Add pixel data to the VGImage reference from the bitmap reference.
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
TSize bitmapSize = bitmap->SizeInPixels();
TUint8* address = reinterpret_cast<TUint8*>(bitmap->DataAddress());
@@ -1196,7 +1196,7 @@
//Retrieve source formats for the launched process from the process parameters.
User::LeaveIfError(User::GetTIntParameter(EProcSlotSourceFormat, reinterpret_cast<TInt&>(iSourceFormat)));
User::LeaveIfError(User::GetTIntParameter(EProcSlotSurfaceFormat, reinterpret_cast<TInt&>(iSurfaceFormat)));
-
+
RSgImage sgImageFromId;
CleanupClosePushL(sgImageFromId);
ASSERT_EQUALS(sgImageFromId.Open(aSgId), KErrNone);
@@ -1218,9 +1218,9 @@
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImage));
// At this point we draw the VGImage created from the SgImage to the current surface.
- // # if the source is a A_8, the VGImage acts as a mask and the target surface must contain
+ // # if the source is a A_8, the VGImage acts as a mask and the target surface must contain
// as a result the pen colour set above blended with the mask
- // # otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required)
+ // # otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required)
INFO_PRINTF1(_L("Copying the VGImage to the surface"));
if (iSourceFormat == EUidPixelFormatA_8)
{
@@ -1238,7 +1238,7 @@
VGuint fillColor = 0x008000ff; // opaque dark green
vgSetColor(fillPaint, fillColor);
ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
-
+
vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
vgDrawImage(vgImage);
@@ -1259,7 +1259,7 @@
// a) a reference bitmap needs to be cleared to black (same colour as the surface was cleared to)
// b) a Pen bitmap, that we clear to dark green (same colour as the fillPaint used to draw to the surface)
// c) a mask bitmap, which is the reference bitmap used to create the SgImage
- // # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage
+ // # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage
if (iSourceFormat == EUidPixelFormatA_8)
{
TDisplayMode maskMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
@@ -1272,7 +1272,7 @@
CFbsBitmap* refBitmap = iEglSess->CreateReferenceMaskedBitmapL(refbitmapMode, KRgbDarkGreen, mask);
CleanupStack::PushL(refBitmap);
-
+
// compare the obtained reference bitmap with the surface drawn
iEglSess->CheckVgDrawingL(iSurfaceFormat, refBitmap);
CleanupStack::PopAndDestroy(2, mask); //mask, refBitmap
@@ -1314,37 +1314,37 @@
• EUidPixelFormatRGB_565
• EUidPixelFormatXRGB_8888
• EUidPixelFormatARGB_8888_PRE
-- Choose egl config, supplying as a native pixmap type in attribute (flag EGL_MATCH_NATIVE_PIXMAP) the SgImages which
+- Choose egl config, supplying as a native pixmap type in attribute (flag EGL_MATCH_NATIVE_PIXMAP) the SgImages which
were created on the previous step. The EGL_RENDERABLE_TYPE of the config attributes must include EGL_OPENVG_BIT.
-- Create M pixmap surfaces based on SgImages from the first step. The surface is created with EGL_ALPHA_FORMAT_PRE
+- Create M pixmap surfaces based on SgImages from the first step. The surface is created with EGL_ALPHA_FORMAT_PRE
flag supplied in attribute list if the underlining SgImage was of type ESgPixelFormatARGB_8888_PRE.
- In iteration from 1 to M perform three following steps:
1. Make the pixmap surface current (see eglMakeCurrent(.) API)
- 2. Draw something to the current surface, for instance, clear the whole area with color and then draw a
- few graphics primitives. The drawing needs to be unique for each surface and complicated enough to
+ 2. Draw something to the current surface, for instance, clear the whole area with color and then draw a
+ few graphics primitives. The drawing needs to be unique for each surface and complicated enough to
ensure that bit comparison will reveal any mismatch
3. Make no surface current
- Close all pixmap surfaces
-- Spawn N client processes. During the process launching, pass to each process single drawable ID from the SgImages.
- In order to define which SgImage(s) needs to be passed to the particular processes, there will be following
+- Spawn N client processes. During the process launching, pass to each process single drawable ID from the SgImages.
+ In order to define which SgImage(s) needs to be passed to the particular processes, there will be following
formula applied: J = P Mod (M), where J is the sequence number of the image, P is the particular process number.
From processes 1 to N:
- Open SgImage by TSgDrawableId obtained from the SgImage which was passed from the process A.
-- Using EGL extension, create EGLImage specifying as EGLClientBuffer SgImage which was opened on the previous
+- Using EGL extension, create EGLImage specifying as EGLClientBuffer SgImage which was opened on the previous
step, EGL_NATIVE_PIXMAP_KHR as a target and EGL_IMAGE_PRESERVED_KHR as an attribute
- Using VG extension, create VG image based on EGLImage from the previous step.
- Close both Sg and EGL images
-- Create second SgImage with the same size and pixel format as first SgImage and usage flag is set to ESgUsageBitOpenVgSurface.
-- Create off-screen pixmap surface with underlining second SgImage and make it current for the drawing context.
+- Create second SgImage with the same size and pixel format as first SgImage and usage flag is set to ESgUsageBitOpenVgSurface.
+- Create off-screen pixmap surface with underlining second SgImage and make it current for the drawing context.
- Draw VGImage to the off-screen surface.
- Retrieve surface data (see vgReadPixels() API)
@SYMTestExpectedResults
-Creation of all drawable resources has been completed without errors.
-On return eglChooseConfig() must return EGL_OPENVG_BIT in config attribute list (actual attributes should
+Creation of all drawable resources has been completed without errors.
+On return eglChooseConfig() must return EGL_OPENVG_BIT in config attribute list (actual attributes should
be retrieved via call to eglGetConfigAttrib()).
Image data obtained in client processes 1 - N matches to the pixmap surface which was drawn in the process A.
-Reference counting works correctly and keep VG image alive although bound Sg and EGL images have been closed.
+Reference counting works correctly and keep VG image alive although bound Sg and EGL images have been closed.
When all resources are closed, resource count maintained by RSgDriver extension is zero in all processes.
*/
TVerdict CEglTest_EGL_Image_Multi_Process_ThemeServer::doTestStepL()
@@ -1379,7 +1379,7 @@
// A_8 related tests are only performed for SgImage-Lite
if (iSourceFormat == EUidPixelFormatA_8)
continue;
-#endif
+#endif
doTestPartialStepL();
}
@@ -1393,7 +1393,7 @@
{
INFO_PRINTF1(_L("CEglTest_EGL_Image_Multi_Process_ThemeServer::doTestPartialStepL"));
PrintUsedPixelConfiguration();
-
+
// Create display object
ASSERT_TRUE(iDisplay == EGL_NO_DISPLAY);
GetDisplayL();
@@ -1416,22 +1416,22 @@
#else
imageInfo.iUsage = ESgUsageOpenVgImage | ESgUsageOpenVgTarget;
imageInfo.iShareable = ETrue;
-#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
ASSERT_EQUALS(sgImages[i].Create(imageInfo, NULL, NULL), KErrNone);
CleanupClosePushL(sgImages[i]);
ASSERT_EQUALS(sgIdList.Insert(sgImages[i].Id(),i), KErrNone);
-
+
INFO_PRINTF1(_L("Calling sequence - eglBindAPI(EGL_OPENVG_API) - eglCreatePixmapSurface - eglCreateContext - eglMakeCurrent"));
ASSERT_EGL_TRUE(eglBindAPI(EGL_OPENVG_API));
- const EGLint KAttrib_list_image_pre[] = { EGL_MATCH_NATIVE_PIXMAP, reinterpret_cast<EGLint>(&sgImages[i]),
+ const EGLint KAttrib_list_image_pre[] = { EGL_MATCH_NATIVE_PIXMAP, reinterpret_cast<EGLint>(&sgImages[i]),
EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
- EGL_SURFACE_TYPE, EGL_PIXMAP_BIT | EGL_VG_ALPHA_FORMAT_PRE_BIT,
+ EGL_SURFACE_TYPE, EGL_PIXMAP_BIT | EGL_VG_ALPHA_FORMAT_PRE_BIT,
EGL_NONE };
const EGLint KAttrib_list_image_nonpre[] = {EGL_MATCH_NATIVE_PIXMAP, reinterpret_cast<EGLint>(&sgImages[i]),
EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
- EGL_SURFACE_TYPE, EGL_PIXMAP_BIT,
+ EGL_SURFACE_TYPE, EGL_PIXMAP_BIT,
EGL_NONE };
EGLConfig currentConfig;
EGLint numconfigs =0;
@@ -1514,9 +1514,9 @@
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImage));
// At this point we draw the VGImage created from the SgImage to the current surface.
- // # if the source is a A_8, the VGImage acts as a mask and the target surface must contain
+ // # if the source is a A_8, the VGImage acts as a mask and the target surface must contain
// as a result the pen colour set above blended with the mask
- // # otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required)
+ // # otherwise, drawing the VGImage is just a simple copy via vgSetPixels (no blending required)
INFO_PRINTF1(_L("Copying the VGImage to the surface"));
if (iSourceFormat == EUidPixelFormatA_8)
{
@@ -1534,7 +1534,7 @@
VGuint fillColor = 0x008000ff; // opaque dark green
vgSetColor(fillPaint, fillColor);
ASSERT_EGL_TRUE(vgGetError() == VG_NO_ERROR);
-
+
vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
vgDrawImage(vgImage);
@@ -1555,7 +1555,7 @@
// a) a reference bitmap needs to be cleared to black (same colour as the surface was cleared to)
// b) a Pen bitmap, that we clear to dark green (same colour as the fillPaint used to draw to the surface)
// c) a mask bitmap, which is the reference bitmap used to create the SgImage
- // # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage
+ // # otherwise, the surface must contain the same pixels as the bitmap used to create the SgImage
if (iSourceFormat == EUidPixelFormatA_8)
{
TDisplayMode maskMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
@@ -1568,7 +1568,7 @@
CFbsBitmap* refBitmap = iEglSess->CreateReferenceMaskedBitmapL(refbitmapMode, KRgbDarkGreen, mask);
CleanupStack::PushL(refBitmap);
-
+
// compare the obtained reference bitmap with the surface drawn
iEglSess->CheckVgDrawingL(iSurfaceFormat, refBitmap);
CleanupStack::PopAndDestroy(2, mask); //mask, refBitmap
@@ -1593,7 +1593,7 @@
/**
-@SYMTestCaseID GRAPHICS-EGL-0428
+@SYMTestCaseID GRAPHICS-EGL-0430
@SYMTestPriority 1
@@ -1609,36 +1609,39 @@
Run two processes that independently perform the actions detailed below.
* From Process A
Open the RSgDriver
- Create an RSgImage
- Signal (by semaphore or otherwise) to process A, passing the drawable ID to it
+ Create an RSgImage passing an initialised bitmap
+ Signal (by semaphore or otherwise) to process B, passing the drawable ID to it
* From Process B:
Open the RSgDriver
Using the drawable ID, open the RSgImage
+ Close the RSgImage
+ Re-open the RSgImage
+
+* From Process A:
+ Unexpectedly terminate process A without performing any explicit clean-up
+
+* From Process B:
+ Wait for Process A to be killed:
Create an EGLImage from the RSgImage
Create a VGImage from the EGLImage
Close the RSgImage
Close the EGLImage
Create an off-screen surface
-
-* From Process A:
- Unexpectedly terminate process A without performing any explicit clean-up
-
-* From Process B:
- Wait for Process A to be killed
- Populate the VGImage with data
- Copy the VGImage to the off-screen surface
- Close the off-screen surface
+ Draw VGImage to the off-screen surface
+ Read the pixel data and verify that it matches the data populated by process A
+ Destroy the off-screen surface
Close the VGImage
Close the RSgDriver
+ Exit
@SYMTestExpectedResults
-Process B should be able to populate the VGImage with data and copy it to the off-screen surface.
+Process B should be able to populate the VGImage with data and copy it to the off-screen surface
All allocated image memory should be freed
*/
TVerdict CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate::doTestStepL()
{
- SetTestStepID(_L("GRAPHICS-EGL-0428"));
+ SetTestStepID(_L("GRAPHICS-EGL-0430"));
SetTestStepName(KEGL_Image_Multi_Process_VgImage_ProcessTerminate);
INFO_PRINTF1(_L("Enter: CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate::doTestStepL"));
@@ -1655,9 +1658,9 @@
PrintUsedPixelConfiguration();
// launch 2 processes
- Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
+ Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate::doTestStepL"));
+ INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate::doTestStepL"));
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -1684,216 +1687,14 @@
RMsgQueue<TProcessId> messageQueueProcId;
User::LeaveIfError(messageQueueProcId.Open(EProcSlotMsgQueueProcId, EOwnerProcess));
CleanupClosePushL(messageQueueProcId);
-
+
RProcess process;
CleanupClosePushL(process);
TRequestStatus status;
- RSgImage rSgImageLocal;
- EGLImageKHR eglImageLocal = EGL_NO_IMAGE_KHR;
- VGImage vgImageLocal = VG_INVALID_HANDLE;
- if(aIdx == 0)
- {
- // Create an RSgImage
- INFO_PRINTF2(_L("Process %d, Creating a RSgImage"),aIdx);
- TSgImageInfoOpenVgImage imageInfo = TSgImageInfoOpenVgImage(iSourceFormat, KImageSize);
-#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
- imageInfo.iShareable = ETrue;
- imageInfo.iCpuAccess = ESgCpuAccessReadWrite;
-#endif
- ASSERT_EQUALS(rSgImageLocal.Create(imageInfo, NULL, NULL), KErrNone);
-
- INFO_PRINTF2(_L("Process %d, Sending SgImage ID to other process..."), aIdx);
- messageQueueSgId.SendBlocking(rSgImageLocal.Id());
-
- // Sending Process ID to other process... so that the other process can identify when this one dies.
- messageQueueProcId.SendBlocking(RProcess().Id());
- }
- else if(aIdx == 1)
- {
- INFO_PRINTF2(_L("Process %d: Receiving SgImage ID from other process..."), aIdx);
- TSgDrawableId sgImageId;
- messageQueueSgId.ReceiveBlocking(sgImageId);
- ASSERT_EQUALS(rSgImageLocal.Open(sgImageId),KErrNone);
-
- // Also receiving RProcess ID from other process to be able to identify when it dies
- TProcessId procId;
- messageQueueProcId.ReceiveBlocking(procId);
- process.Open(procId);
- process.Logon(status);
-
- INFO_PRINTF2(_L("Process %d, Creating an EGLImage from the shared RSgImage"),aIdx);
- CleanupClosePushL(rSgImageLocal);
- eglImageLocal = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &rSgImageLocal, KEglImageAttribsPreservedTrue);
- ASSERT_EGL_TRUE(eglImageLocal != EGL_NO_IMAGE_KHR);
- CleanupStack::PopAndDestroy(&rSgImageLocal); //transferring ownership of the buffer to the EGLImage
-
- INFO_PRINTF2(_L("Creating a Surface and a Context bound to OpenVG, Process %d"),aIdx);
- TUidPixelFormat pixelFormat = EglTestConversion::VgFormatToSgPixelFormat(iSurfaceFormat);
- TSgImageInfoOpenVgTarget imageInfo = TSgImageInfoOpenVgTarget(pixelFormat, KImageSize);
- // Create a pixmap surface matching the native image pixel format
- iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo,CTestEglSession::EResourceCloseSgImageEarly);
-
- INFO_PRINTF2(_L("Process %d, Creating one VGImage from the EGLImage"),aIdx);
- vgImageLocal = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImageLocal);
- ASSERT_VG_TRUE(vgImageLocal != VG_INVALID_HANDLE);
- ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImageLocal));
- }
-
- // Wait for both processes to reach this point
- Rendezvous(aIdx);
-
- if(aIdx == 0)
- {
- // simulate this process being killed
- // note that we terminate with reason=0 (otherwise the egl test framework would think it's an error)
- INFO_PRINTF2(_L("Process %d, Simulate the process is being killed!"),aIdx);
- RProcess().Terminate(KErrNone);
-
- // this line is unreachable
- ASSERT(0);
- }
- else if(aIdx == 1)
- {
- // first wait for the other process to finish
- User::WaitForRequest(status);
- ASSERT_EQUALS(status.Int(), KErrNone);
-
- INFO_PRINTF2(_L("Process %d, Populate contents of the VGImage"),aIdx);
- TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
- CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KImageSize, 3);
- CleanupStack::PushL(bitmap);
- // Add pixel data to the VGImage reference from the bitmap reference.
- // Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
- TSize bitmapSize = bitmap->SizeInPixels();
- TUint8* address = reinterpret_cast<TUint8*>(bitmap->DataAddress());
- TInt stride = bitmap->DataStride();
- address += (bitmapSize.iHeight - 1) * stride;
- vgImageSubData(vgImageLocal, address, -stride, iSurfaceFormat, 0,0, bitmapSize.iWidth, bitmapSize.iHeight);
- ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
- eglWaitClient();
-
- INFO_PRINTF2(_L("Process %d, Drawing the VGImage to the current surface before changing contents of the VGImage"),aIdx);
- // Copy the source VGImage to the surface
- vgSetPixels(0, 0, vgImageLocal, 0, 0, KImageSize.iWidth, KImageSize.iHeight);
- ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
- eglWaitClient();
-
- // we can now compare the VgImage to the one we expect
- iEglSess->CheckVgDrawingL(iSurfaceFormat, bitmap);
- CleanupStack::PopAndDestroy(bitmap);
- INFO_PRINTF2(_L("Process %d, Drawing successful"),aIdx);
-
- // cleanup
- vgDestroyImage(vgImageLocal);
- ASSERT_TRUE(vgGetError() == VG_NO_ERROR);
- }
-
- //cleanup and finish
- CleanupStack::PopAndDestroy(3, &messageQueueSgId); //messageQueueSgId, messageQueueProcId, process
- CleanAll();
- }
-
-
-/**
-@SYMTestCaseID GRAPHICS-EGL-0430
-
-@SYMTestPriority 1
-
-@SYMPREQ 2637
-
-@SYMTestCaseDesc
-Functional test - Killing the RSgImage creating process
-
-@SYMTestPurpose
-To verify correct operation of RSgImage sharing across processes when the creating process is killed
-
-@SYMTestActions
-Run two processes that independently perform the actions detailed below.
-* From Process A
- Open the RSgDriver
- Create an RSgImage
- Signal (by semaphore or otherwise) to process B, passing the drawable ID to it
-
-* From Process B:
- Open the RSgDriver
- Using the drawable ID, open the RSgImage
- Close the RSgImage
- Re-open the RSgImage
-
-* From Process A:
- Unexpectedly terminate process A without performing any explicit clean-up
-
-* From Process B:
- Wait for Process A to be killed:
- Create an EGLImage from the RSgImage
- Create a VGImage from the EGLImage
- Close the RSgImage
- Close the EGLImage
- Create an off-screen surface
- Populate the VGImage with data
- Draw VGImage to the off-screen surface
- Destroy the off-screen surface
- Close the VGImage
- Close the RSgDriver
- Exit
-
-@SYMTestExpectedResults
-Process B should be able to populate the VGImage with data and copy it to the off-screen surface
-All allocated image memory should be freed
-*/
-TVerdict CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate2::doTestStepL()
- {
- SetTestStepID(_L("GRAPHICS-EGL-0430"));
- SetTestStepName(KEGL_Image_Multi_Process_VgImage_ProcessTerminate2);
- INFO_PRINTF1(_L("Enter: CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate2::doTestStepL"));
-
- TBool ret = CheckForExtensionL(KEGL_RSgimage | KEGL_KHR_image_base | KEGL_KHR_image_pixmap | KVG_KHR_EGL_image);
- if(!ret)
- {
- // The extension is not supported
- RecordTestResultL();
- CloseTMSGraphicsStep();
- return TestStepResult();
- }
-
- // This test is performed for default pixel format
- PrintUsedPixelConfiguration();
-
- // launch 2 processes
- Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
-
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate2::doTestStepL"));
- RecordTestResultL();
- CloseTMSGraphicsStep();
- return TestStepResult();
- }
-
-void CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate2::doProcessFunctionL(TInt aIdx)
- {
- INFO_PRINTF2(_L("CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate2::doProcessFunctionL, Process %d"),aIdx);
- GetDisplayL();
- CreateEglSessionL(aIdx);
- iEglSess->InitializeL();
- iEglSess->OpenSgDriverL();
-
- //Retrieve source formats for the launched process from the process parameters.
- User::LeaveIfError(User::GetTIntParameter(EProcSlotSourceFormat, reinterpret_cast<TInt&>(iSourceFormat)));
- User::LeaveIfError(User::GetTIntParameter(EProcSlotSurfaceFormat, reinterpret_cast<TInt&>(iSurfaceFormat)));
-
- //create the queue to send/receive SgImage ID between processes
- RMsgQueue<TSgDrawableId> messageQueueSgId;
- User::LeaveIfError(messageQueueSgId.Open(EProcSlotMsgQueueSgId, EOwnerProcess));
- CleanupClosePushL(messageQueueSgId);
-
- //create the queue to send/receive Process ID between processes
- RMsgQueue<TProcessId> messageQueueProcId;
- User::LeaveIfError(messageQueueProcId.Open(EProcSlotMsgQueueProcId, EOwnerProcess));
- CleanupClosePushL(messageQueueProcId);
-
- RProcess process;
- CleanupClosePushL(process);
- TRequestStatus status;
+ TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
+ CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KImageSize, 6);
+ CleanupStack::PushL(bitmap);
RSgImage rSgImageLocal;
if(aIdx == 0)
@@ -1905,8 +1706,8 @@
imageInfo.iShareable = ETrue;
imageInfo.iCpuAccess = ESgCpuAccessReadWrite;
#endif
- ASSERT_EQUALS(rSgImageLocal.Create(imageInfo,NULL, NULL), KErrNone);
-
+ ASSERT_EQUALS(rSgImageLocal.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride()), KErrNone);
+
INFO_PRINTF2(_L("Process %d, Sending SgImage ID to other process..."), aIdx);
messageQueueSgId.SendBlocking(rSgImageLocal.Id());
@@ -1930,7 +1731,7 @@
rSgImageLocal.Close();
ASSERT_EQUALS(rSgImageLocal.Open(sgImageId),KErrNone);
}
-
+
// Wait for both processes to reach this point
Rendezvous(aIdx);
@@ -1940,7 +1741,7 @@
// note that we terminate with reason=0 (otherwise the egl test framework would think it's an error)
INFO_PRINTF2(_L("Process %d, Simulate the process is being killed!"),aIdx);
RProcess().Terminate(KErrNone);
-
+
// this line is unreachable
ASSERT(0);
}
@@ -1949,13 +1750,13 @@
// first wait for the other process to finish
User::WaitForRequest(status);
ASSERT_EQUALS(status.Int(), KErrNone);
-
+
INFO_PRINTF2(_L("Process %d, Creating an EGLImage from the shared RSgImage"),aIdx);
CleanupClosePushL(rSgImageLocal);
EGLImageKHR eglImageLocal = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &rSgImageLocal, KEglImageAttribsPreservedTrue);
ASSERT_EGL_TRUE(eglImageLocal != EGL_NO_IMAGE_KHR);
CleanupStack::PopAndDestroy(&rSgImageLocal); //transferring ownership of the buffer to the EGLImage
-
+
INFO_PRINTF2(_L("Creating a Surface and a Context bound to OpenVG, Process %d"),aIdx);
TUidPixelFormat pixelFormat = EglTestConversion::VgFormatToSgPixelFormat(iSurfaceFormat);
TSgImageInfoOpenVgTarget imageInfo = TSgImageInfoOpenVgTarget(pixelFormat, KImageSize);
@@ -1967,38 +1768,23 @@
ASSERT_VG_TRUE(vgImageLocal != VG_INVALID_HANDLE);
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImageLocal));
- INFO_PRINTF2(_L("Process %d, Populate contents of the VGImage"),aIdx);
- TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
- CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KImageSize, 3);
- CleanupStack::PushL(bitmap);
- // Add pixel data to the VGImage reference from the bitmap reference.
- // Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
- TSize bitmapSize = bitmap->SizeInPixels();
- TUint8* address = reinterpret_cast<TUint8*>(bitmap->DataAddress());
- TInt stride = bitmap->DataStride();
- address += (bitmapSize.iHeight - 1) * stride;
- vgImageSubData(vgImageLocal, address, -stride, iSurfaceFormat, 0,0, bitmapSize.iWidth, bitmapSize.iHeight);
- ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
- eglWaitClient();
-
INFO_PRINTF2(_L("Process %d, Drawing the VGImage to the current surface before changing contents of the VGImage"),aIdx);
// Copy the source VGImage to the surface
vgSetPixels(0, 0, vgImageLocal, 0, 0, KImageSize.iWidth, KImageSize.iHeight);
ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
eglWaitClient();
-
+
// we can now compare the VgImage to the one we expect
iEglSess->CheckVgDrawingL(iSurfaceFormat, bitmap);
- CleanupStack::PopAndDestroy(bitmap);
INFO_PRINTF2(_L("Process %d, Drawing successful"),aIdx);
// cleanup
vgDestroyImage(vgImageLocal);
ASSERT_TRUE(vgGetError() == VG_NO_ERROR);
}
-
+
//cleanup and finish
- CleanupStack::PopAndDestroy(3, &messageQueueSgId); //messageQueueSgId, messageQueueProcId, process
+ CleanupStack::PopAndDestroy(4, &messageQueueSgId); //messageQueueSgId, messageQueueProcId, process, bitmap
CleanAll();
}
@@ -2028,7 +1814,7 @@
* From Process A:
Unexpectedly terminate process A without performing any explicit clean-up
-
+
* From Process B:
Wait for Process A to be killed:
Using the drawable ID, attempt to open the RSgImage
@@ -2036,7 +1822,7 @@
Exit
@SYMTestExpectedResults
-Process B should be unable to open the RSgImage and the call to Open() should return error code KErrNotFound.
+Process B should be unable to open the RSgImage and the call to Open() should return error code KErrNotFound.
All allocated image memory should be freed
*/
TVerdict CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminateNegative::doTestStepL()
@@ -2060,7 +1846,7 @@
// launch 2 processes
Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminateNegative::doTestStepL"));
+ INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminateNegative::doTestStepL"));
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -2087,7 +1873,7 @@
RMsgQueue<TProcessId> messageQueueProcId;
User::LeaveIfError(messageQueueProcId.Open(EProcSlotMsgQueueProcId, EOwnerProcess));
CleanupClosePushL(messageQueueProcId);
-
+
RProcess process;
CleanupClosePushL(process);
TRequestStatus status;
@@ -2104,7 +1890,7 @@
imageInfo.iCpuAccess = ESgCpuAccessReadWrite;
#endif
ASSERT_EQUALS(rSgImageLocal.Create(imageInfo,NULL, NULL), KErrNone);
-
+
INFO_PRINTF2(_L("Process %d, Sending SgImage ID to other process..."), aIdx);
messageQueueSgId.SendBlocking(rSgImageLocal.Id());
@@ -2133,7 +1919,7 @@
// note that we terminate with reason=0 (otherwise the egl test framework would think it's an error)
INFO_PRINTF2(_L("Process %d, Simulate the process is being killed!"),aIdx);
RProcess().Terminate(KErrNone);
-
+
// this line is unreachable
ASSERT(0);
}
@@ -2145,13 +1931,13 @@
// NOTE: We can't guarante when the kernel will have completed the cleanup. This process
// could have been notified that the other process has terminated but this does not guarantee
- // that all handles to the process have been released.
+ // that all handles to the process have been released.
// This is not generally a problem in single processor hardware, but can be a problem in dual
// processor hardware (ie, NaviEngine) where one processor could be cleaning up the terminated
// process, the other processor could already be issuing the notification to the waiting process
// Not much we can do other than adding a small delay to ensure this...
User::After(1*1000*1000); // 1 second
-
+
// we're expecting it to fail with the appropriate error
TInt ret = rSgImageLocal.Open(sgImageId);
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
@@ -2177,7 +1963,7 @@
@SYMPREQ 2637
@SYMTestCaseDesc
-Functional test - Simultaneous reading and writing of simulated glyphs.
+Functional test - Simultaneous reading and writing of simulated glyphs.
The rectangular area of RSgImage will be divided into the following section:
-----------
¦ 0 ¦ 1 ¦ 2 ¦
@@ -2190,7 +1976,7 @@
It is obvoious that each sub-section will therefore be of 30x30:
@SYMTestPurpose
-To determine that the system can cope with simultaneous
+To determine that the system can cope with simultaneous
reading and writing from/to area within RSgImage without corrupting each other.
@SYMTestActions
@@ -2214,7 +2000,7 @@
Signal client process that section[i] can be read
Repeat until client process signal read complete
Shade sections surrounding section[i] to other colors e.g. when i=1,
- surrounding sections are section 4, 5 and 2
+ surrounding sections are section 0, 2 and 4
End loop
End loop
@@ -2231,7 +2017,7 @@
Close the VGImage and RSgImage driver
@SYMTestExpectedResults
-The content of each section read by client process should match the content written by Process A.
+The content of each section read by client process should match the content written by Process A.
All image memory should be freed
*/
TVerdict CEglTest_EGL_Image_Multi_Process_VgImage_ReadWrite::doTestStepL()
@@ -2258,7 +2044,7 @@
// launch 2 processes
Test_MultiProcessL(KEglTestStepDllName, 2, TestStepName());
- INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_ReadWrite::doTestStepL"));
+ INFO_PRINTF1(_L("Exit: CEglTest_EGL_Image_Multi_Process_VgImage_ReadWrite::doTestStepL"));
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -2275,17 +2061,17 @@
const TSize KTestReadWriteImageSize(90,90);
const TInt KTestReadWriteSubImageLength = KTestReadWriteImageSize.iHeight / 3;
const TInt KTestNumColors = 9;
- const VGfloat KTestClearColors[KTestNumColors][4] =
+ const VGfloat KTestClearColors[KTestNumColors][4] =
{
- {0.11f, 0.13f, 0.15f, 0.17f}, // arbitrary colour 1
- {0.21f, 0.23f, 0.25f, 0.27f}, // arbitrary colour 2
- {0.31f, 0.33f, 0.35f, 0.37f}, // arbitrary colour 3
- {0.41f, 0.43f, 0.45f, 0.47f}, // arbitrary colour 4
- {0.51f, 0.53f, 0.55f, 0.57f}, // arbitrary colour 5
- {0.61f, 0.63f, 0.65f, 0.67f}, // arbitrary colour 6
- {0.71f, 0.73f, 0.75f, 0.77f}, // arbitrary colour 7
- {0.81f, 0.83f, 0.85f, 0.87f}, // arbitrary colour 8
- {0.91f, 0.93f, 0.95f, 0.97f} // arbitrary colour 9
+ {0.11f, 0.13f, 0.15f, 0.17f}, // arbitrary colour 1
+ {0.21f, 0.23f, 0.25f, 0.27f}, // arbitrary colour 2
+ {0.31f, 0.33f, 0.35f, 0.37f}, // arbitrary colour 3
+ {0.41f, 0.43f, 0.45f, 0.47f}, // arbitrary colour 4
+ {0.51f, 0.53f, 0.55f, 0.57f}, // arbitrary colour 5
+ {0.61f, 0.63f, 0.65f, 0.67f}, // arbitrary colour 6
+ {0.71f, 0.73f, 0.75f, 0.77f}, // arbitrary colour 7
+ {0.81f, 0.83f, 0.85f, 0.87f}, // arbitrary colour 8
+ {0.91f, 0.93f, 0.95f, 0.97f} // arbitrary colour 9
};
//Retrieve source formats for the launched process from the process parameters.
@@ -2308,7 +2094,7 @@
imageInfo.iCpuAccess = ESgCpuAccessReadWrite;
#endif
ASSERT_EQUALS(rSgImageLocal.Create(imageInfo,NULL, NULL), KErrNone);
-
+
INFO_PRINTF2(_L("Process %d, Sending SgImage ID to other process..."), aIdx);
messageQueueSgId.SendBlocking(rSgImageLocal.Id());
}
@@ -2319,7 +2105,7 @@
messageQueueSgId.ReceiveBlocking(sgImageId);
ASSERT_EQUALS(rSgImageLocal.Open(sgImageId),KErrNone);
}
-
+
INFO_PRINTF2(_L("Process %d, Creating an EGLImage from the shared RSgImage"),aIdx);
CleanupClosePushL(rSgImageLocal);
EGLImageKHR eglImageLocal = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &rSgImageLocal, KEglImageAttribsPreservedTrue);
@@ -2327,7 +2113,7 @@
CleanupStack::PopAndDestroy(&rSgImageLocal); //transferring ownership of the buffer to the EGLImage
// OpenVG needs a current VG context before it will allow the call vgCreateEGLImageTargetKHR
- // The created surface will remain un-used, hence we create it with the default pixel format, as we don't care
+ // The created surface will remain un-used, hence we create it with the default pixel format, as we don't care
TUidPixelFormat pixelFormat = EglTestConversion::VgFormatToSgPixelFormat(KDefaultSurfaceFormat);
TSgImageInfoOpenVgTarget imageInfo = TSgImageInfoOpenVgTarget(pixelFormat, KTestReadWriteImageSize);
iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo,CTestEglSession::EResourceCloseSgImageEarly);
@@ -2336,7 +2122,7 @@
VGImage vgImageLocal = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)eglImageLocal);
ASSERT_VG_TRUE(vgImageLocal != VG_INVALID_HANDLE);
ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, eglImageLocal));
-
+
// Wait for both processes to reach this point
Rendezvous(aIdx);
@@ -2348,7 +2134,8 @@
INFO_PRINTF3(_L("Process %d, Shading section[%d]"),aIdx, section);
//Shade section[i] to color[i]
vgSetfv(VG_CLEAR_COLOR, 4, KTestClearColors[section]);
- vgClearImage(vgImageLocal, section%3, section/3, KTestReadWriteSubImageLength, KTestReadWriteSubImageLength);
+ vgClearImage(vgImageLocal, (section%3)*KTestReadWriteSubImageLength, (section/3)*KTestReadWriteSubImageLength, KTestReadWriteSubImageLength, KTestReadWriteSubImageLength);
+ vgFinish();
}
// Wait for both processes to reach this point
@@ -2359,21 +2146,24 @@
{
INFO_PRINTF3(_L("Process %d, Creating child vgimage for section[%d]"),aIdx, section);
//Create child VGImage for section[i]
- childImage = vgChildImage(vgImageLocal, section%3, section/3, KTestReadWriteSubImageLength, KTestReadWriteSubImageLength);
+ childImage = vgChildImage(vgImageLocal, (section%3)*KTestReadWriteSubImageLength, (section/3)*KTestReadWriteSubImageLength, KTestReadWriteSubImageLength, KTestReadWriteSubImageLength);
//Read the value of child VGImage and compare it with colour[i]
- TUint32 vgPixel=0;
+ TUint32* vgPixel = new(ELeave) TUint32[KTestReadWriteSubImageLength];
+ CleanupArrayDeletePushL(vgPixel);
for (TInt i=0; i<KTestReadWriteSubImageLength; i++)
{
+ // Read childImage, a line at a time
+ vgGetImageSubData(childImage, vgPixel, 1, iSurfaceFormat, 0, i, KTestReadWriteSubImageLength, 1);
for (TInt j=0; j<KTestReadWriteSubImageLength; j++)
{
- vgGetImageSubData(childImage, &vgPixel, 1, iSurfaceFormat, i, j, 1, 1);
// Should be exact, but give a tolerance of 1 because VG rounds to nearer integer, whereas TInt rounds down
- ASSERT_TRUE(Abs(((vgPixel & 0xff000000) >> 24) - (255 * KTestClearColors[section][3])) <= 1); //alpha
- ASSERT_TRUE(Abs(((vgPixel & 0x00ff0000) >> 16) - (255 * KTestClearColors[section][0])) <= 1); //red
- ASSERT_TRUE(Abs(((vgPixel & 0x0000ff00) >> 8) - (255 * KTestClearColors[section][1])) <= 1); //green
- ASSERT_TRUE(Abs(((vgPixel & 0x000000ff) >> 0) - (255 * KTestClearColors[section][2])) <= 1); //blue
+ ASSERT_TRUE(Abs(((vgPixel[j] & 0xff000000) >> 24) - (255 * KTestClearColors[section][3])) <= 1); //alpha
+ ASSERT_TRUE(Abs(((vgPixel[j] & 0x00ff0000) >> 16) - (255 * KTestClearColors[section][0])) <= 1); //red
+ ASSERT_TRUE(Abs(((vgPixel[j] & 0x0000ff00) >> 8) - (255 * KTestClearColors[section][1])) <= 1); //green
+ ASSERT_TRUE(Abs(((vgPixel[j] & 0x000000ff) >> 0) - (255 * KTestClearColors[section][2])) <= 1); //blue
}
}
+ CleanupStack::PopAndDestroy(vgPixel);
}
if (aIdx==0)
{
@@ -2382,8 +2172,9 @@
{
TInt surroundingSection = (KTestNumColors + section + k) % KTestNumColors;
vgSetfv(VG_CLEAR_COLOR, 4, KTestClearColors[surroundingSection]);
- vgClearImage(vgImageLocal, surroundingSection*KTestReadWriteSubImageLength, section*KTestReadWriteSubImageLength, KTestReadWriteSubImageLength, KTestReadWriteSubImageLength);
+ vgClearImage(vgImageLocal, (surroundingSection%3)*KTestReadWriteSubImageLength, (surroundingSection/3)*KTestReadWriteSubImageLength, KTestReadWriteSubImageLength, KTestReadWriteSubImageLength);
}
+ vgFinish();
}
// Wait for both processes to reach this point
--- a/egl/egltest/src/egltest_image_negative.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltest_image_negative.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -76,13 +76,13 @@
GetDisplayL();
CreateEglSessionL();
iEglSess->InitializeL();
- iEglSess->OpenSgDriverL();
-
+ iEglSess->OpenSgDriverL();
+
INFO_PRINTF1(_L("Creating one EGLImage from a NULL RSgImage"));
EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, NULL, KEglImageAttribsPreservedTrue);
ASSERT_EGL_TRUE(imageKHR == EGL_NO_IMAGE_KHR);
ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
-
+
INFO_PRINTF1(_L("Creating one EGLImage from a not fully constructed RSgImage"));
RSgImage sgImage;
CleanupClosePushL(sgImage);
@@ -241,7 +241,7 @@
TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KPixmapSize, 8);
CleanupStack::PushL(bitmap);
-
+
// Create RSgImage's attributes.
TSgImageInfoTest imageInfo;
imageInfo.iSizeInPixels = KPixmapSize;
@@ -254,20 +254,22 @@
imageInfo.iCpuAccess = ESgCpuAccessNone;
imageInfo.iScreenId = KSgScreenIdMain;
imageInfo.iUserAttributes = NULL;
- imageInfo.iUserAttributeCount = 0;
+ imageInfo.iUserAttributeCount = 0;
#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
RSgImage sgImage;
CleanupClosePushL(sgImage);
ASSERT_EQUALS(sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride()), KErrNone);
- //First Subtest: creation of an EGLImageKhr with wrong Usage will fail
- INFO_PRINTF1(_L("Trying to create an EGLImage from a RSgImage that doesn't have correct iUsage, ESgUsageBitOpenVgImage|ESgUsageOpenGlesTexture2D|ESgUsageOpenGles2Texture2D"));
+ //First Subtest: Attempted creation of an EGLImageKhr from an RSgImage with the wrong Usage should fail
+ INFO_PRINTF1(_L("Attempt creation of an EGLImage from a RSgImage with incorrect iUsage ESgUsageBitOpenGlesSurface"));
+ INFO_PRINTF1(_L("Correct iUsage needs to have at least one of ESgUsageBitOpenVgImage, ESgUsageOpenGlesTexture2D or ESgUsageOpenGles2Texture2D bits set"));
+
EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage, KEglImageAttribsPreservedTrue);
ASSERT_EGL_TRUE(imageKHR == EGL_NO_IMAGE_KHR);
ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
CleanupStack::PopAndDestroy(&sgImage);
-
+
if(iEglSess->IsOpenGLES2Supported())
{
TSgImageInfoTest imageInfo2;
@@ -278,15 +280,15 @@
#else
imageInfo2.iUsage = ESgUsageOpenGlesTexture2D;
#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
-
+
// Create a SgImage
RSgImage sgImage2;
CleanupClosePushL(sgImage2);
ASSERT_EQUALS(sgImage2.Create(imageInfo2, bitmap->DataAddress(), bitmap->DataStride()), KErrNone);
- // Create a EGLImage from the RSgImage
+ // The creation of an EGLImage from a RSgImage with correct usage (ESgUsageBitOpenGles2Texture2D or ESgUsageOpenGlesTexture2D) should pass
EGLImageKHR imageKHR2 = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage2, KEglImageAttribsPreservedTrue);
- ASSERT_EGL_TRUE(imageKHR2 == EGL_NO_IMAGE_KHR);
+ ASSERT_EGL_TRUE(imageKHR2 != EGL_NO_IMAGE_KHR);
//Create an OffScreen Pixmap, we need it to make a Context current
imageInfo2.iSizeInPixels = KPixmapSize;
@@ -305,13 +307,13 @@
ASSERT_TRUE(vgGetError()==VG_UNSUPPORTED_IMAGE_FORMAT_ERROR);
CleanupStack::PopAndDestroy(&sgImage2);
- ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR2));
+ ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR2));
}
-
+
//cleanup
CleanupStack::PopAndDestroy(bitmap);
CleanAll();
-
+
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -373,11 +375,11 @@
iEglSess->InitializeL();
iEglSess->OpenSgDriverL();
- INFO_PRINTF1(_L("Creating one RSgImage"));
+ INFO_PRINTF1(_L("Creating one RSgImage"));
TSgImageInfoOpenVgImage imageInfo = TSgImageInfoOpenVgImage(iSourceFormat, KPixmapSize);
#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
imageInfo.iCpuAccess = ESgCpuAccessReadWrite;
-#endif
+#endif
RSgImage sgImage;
CleanupClosePushL(sgImage);
ASSERT_EQUALS(sgImage.Create(imageInfo, NULL, NULL), KErrNone);
@@ -385,26 +387,26 @@
INFO_PRINTF1(_L("Creating one EGLImage from it"));
EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage, KEglImageAttribsPreservedTrue);
ASSERT_EGL_TRUE(imageKHR != EGL_NO_IMAGE_KHR);
-
+
INFO_PRINTF1(_L("Calling eglDestroyImageKHR with EGL_NO_DISPLAY"));
- ASSERT_EGL_TRUE(!iEglSess->DestroyEGLImage(EGL_NO_DISPLAY, imageKHR));
+ ASSERT_EGL_TRUE(!iEglSess->DestroyEGLImage(EGL_NO_DISPLAY, imageKHR));
ASSERT_EGL_ERROR(EGL_BAD_DISPLAY);
INFO_PRINTF1(_L("Calling eglDestroyImageKHR with a random number (but not 1) as Display"));
- ASSERT_EGL_TRUE(!iEglSess->DestroyEGLImage(7, imageKHR));
+ ASSERT_EGL_TRUE(!iEglSess->DestroyEGLImage(7, imageKHR));
ASSERT_EGL_ERROR(EGL_BAD_DISPLAY);
INFO_PRINTF1(_L("Calling eglDestroyImageKHR with valid EGLImage handle (so, that should succeed)"));
- ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+ ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
INFO_PRINTF1(_L("Calling eglDestroyImageKHR with invalid handle"));
- ASSERT_EGL_TRUE(!iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+ ASSERT_EGL_TRUE(!iEglSess->DestroyEGLImage(iDisplay, imageKHR));
ASSERT_EGL_ERROR(EGL_BAD_PARAMETER);
-
+
//cleanup
- CleanupStack::PopAndDestroy(&sgImage);
+ CleanupStack::PopAndDestroy(&sgImage);
CleanAll();
-
+
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -464,11 +466,11 @@
iEglSess->InitializeL();
iEglSess->OpenSgDriverL();
- INFO_PRINTF1(_L("Creating one RSgImage"));
+ INFO_PRINTF1(_L("Creating one RSgImage"));
TSgImageInfoOpenVgImage imageInfo = TSgImageInfoOpenVgImage(iSourceFormat, KPixmapSize);
#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
imageInfo.iCpuAccess = ESgCpuAccessReadWrite;
-#endif
+#endif
RSgImage sgImage;
CleanupClosePushL(sgImage);
ASSERT_EQUALS(sgImage.Create(imageInfo, NULL, NULL), KErrNone);
@@ -483,10 +485,10 @@
iEglSess->CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo2, CTestEglSession::EResourceCloseSgImageEarly);
INFO_PRINTF1(_L("Destroying the EGLImage but retain the handle value"));
- ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+ ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
INFO_PRINTF1(_L("Attemptimg to create a VGImage from an invalid handle"));
- VGImage vgImage = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)imageKHR);
+ VGImage vgImage = iEglSess->vgCreateImageTargetKHR((VGeglImageKHR)imageKHR);
ASSERT_VG_TRUE(vgImage == VG_INVALID_HANDLE);
ASSERT_TRUE(vgGetError()==VG_ILLEGAL_ARGUMENT_ERROR);
@@ -494,9 +496,9 @@
ASSERT_TRUE(vgGetError()==VG_BAD_HANDLE_ERROR);
//cleanup
- CleanupStack::PopAndDestroy(&sgImage);
+ CleanupStack::PopAndDestroy(&sgImage);
CleanAll();
-
+
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
@@ -568,8 +570,8 @@
TDisplayMode bitmapMode = EglTestConversion::PixelFormatToDisplayMode(iSourceFormat);
CFbsBitmap* bitmap = iEglSess->CreateReferenceBitmapL(bitmapMode, KPixmapSize, 8);
CleanupStack::PushL(bitmap);
-
- INFO_PRINTF1(_L("Creating one RSgImage"));
+
+ INFO_PRINTF1(_L("Creating one RSgImage"));
TSgImageInfoTest imageInfo;
imageInfo.iSizeInPixels = KPixmapSize;
imageInfo.iPixelFormat = iSourceFormat;
@@ -589,7 +591,7 @@
INFO_PRINTF1(_L("Calling eglBindAPI(EGL_OPENVG_API)"));
ASSERT_EGL_TRUE(eglBindAPI(EGL_OPENVG_API));
- EGLint numConfigsWithPre = 0;
+ EGLint numConfigsWithPre = 0;
EGLConfig configWithPre;
const EGLint KAttribImagePre[] = { EGL_MATCH_NATIVE_PIXMAP, reinterpret_cast<EGLint>(&sgImage),
EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
@@ -623,7 +625,7 @@
//cleanup
vgDestroyImage(vgImage);
ASSERT_TRUE(vgGetError()==VG_NO_ERROR);
- ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
+ ASSERT_EGL_TRUE(iEglSess->DestroyEGLImage(iDisplay, imageKHR));
CleanupStack::PopAndDestroy(2, bitmap); // bitmap, sgImage
//This test doesn't check the drawing because the content of the image are undefined
//since we are using the same buffer both as target and as source
--- a/egl/egltest/src/egltest_vgimagetosurfaces.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltest_vgimagetosurfaces.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -389,7 +389,7 @@
return TestStepResult();
}
User::LeaveIfError(res); // leave here if any other error was raised other than the one above.
- iEglSess->CreateWindowSurfaceAndMakeCurrentL(config, window);
+ iEglSess->CreateWindowSurfaceAndMakeCurrentL(config, window, windowFormat == EWindowAttribsColor16MAP);
INFO_PRINTF1(_L("Creating 1 EGLImage from the RSgImage"));
EGLImageKHR imageKHR = iEglSess->eglCreateImageKhrL(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, &sgImage, KEglImageAttribsPreservedTrue);
--- a/egl/egltest/src/egltestcommoninisettings.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltestcommoninisettings.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -153,7 +153,40 @@
{
return size;
}
-
return TSize(0,0);
}
+EXPORT_C TSize CEglTestCommonIniSettings::GetWindowSize(const TDesC& aSectioName)
+ {
+ _LIT(KKeyWindowWidth, "WindowWidth");
+ _LIT(KKeyWindowHeight, "WindowHeight");
+ TSize size(0, 0);
+ if(iIniData->FindVar(aSectioName, KKeyWindowWidth, size.iWidth) &&
+ iIniData->FindVar(aSectioName, KKeyWindowHeight, size.iHeight))
+ {
+ return size;
+ }
+ return TSize(0,0);
+ }
+
+EXPORT_C TInt CEglTestCommonIniSettings::GetThresholdGPUUsedMemory(const TDesC& aSectioName)
+ {
+ _LIT(KKeyThresholdGPUUsedMemory, "ThresholdGPUUsedMemory");
+ TInt thresholdGPUUsedMemory = 0;
+ if(iIniData->FindVar(aSectioName, KKeyThresholdGPUUsedMemory, thresholdGPUUsedMemory))
+ {
+ return thresholdGPUUsedMemory;
+ }
+ return 0;
+ }
+
+EXPORT_C TInt CEglTestCommonIniSettings::GetThresholdLastIteration(const TDesC& aSectioName)
+ {
+ _LIT(KKeyThresholdLastIteration, "ThresholdLastIteration");
+ TInt thresholdLastIteration = 0;
+ if(iIniData->FindVar(aSectioName, KKeyThresholdLastIteration, thresholdLastIteration))
+ {
+ return thresholdLastIteration;
+ }
+ return 0;
+ }
--- a/egl/egltest/src/egltestcommonsession.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltestcommonsession.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -15,7 +15,7 @@
/**
@file
- @test
+ @test
*/
#include "egltestcommonsession.h"
@@ -82,7 +82,7 @@
{
WARN_PRINTF3(_L("thread %d: eglMakeCurrent returned error = %x ~CTestEglSession..."), iThreadIdx, eglGetError());
}
-
+
// Warn because this should be done by the test, rather than relying on the d'tor
// which may not leave if there is an error (so no CHECK_EXPECTED_ERROR)
WARN_PRINTF2(_L("thread %d: Calling eglDestroyContext() from ~CTestEglSession..."), iThreadIdx);
@@ -90,7 +90,7 @@
if(ret == EGL_FALSE)
{
WARN_PRINTF3(_L("thread %d: eglDestroyContext returned error = %x ~CTestEglSession..."), iThreadIdx, eglGetError());
- }
+ }
}
if (iSurface != EGL_NO_SURFACE)
@@ -102,9 +102,9 @@
if(ret == EGL_FALSE)
{
WARN_PRINTF3(_L("thread %d: eglDestroySurface returned error = %x ~CTestEglSession..."), iThreadIdx, eglGetError());
- }
+ }
}
-
+
if (iTerminateDisplay)
{
INFO_PRINTF1(_L("Calling eglTerminate..."));
@@ -113,14 +113,14 @@
if(ret == EGL_FALSE)
{
WARN_PRINTF3(_L("thread %d: eglTerminate returned error = %x ~CTestEglSession..."), iThreadIdx, eglGetError());
- }
+ }
}
}
// Only destroy native resource after the surface and context that wraps it has been destroyed.
delete iFbsBitmap;
CloseFbsSession();
-
+
iSgImage.Close();
CloseSgDriver();
}
@@ -129,7 +129,7 @@
{
VERBOSE_INFO_PRINTF3(_L("thread %d: Setting the expected error code for the next EGL call to %x"), iThreadIdx, aExpectedErrorCode);
{
- iExpectedErrorCode = aExpectedErrorCode;
+ iExpectedErrorCode = aExpectedErrorCode;
}
}
@@ -149,15 +149,15 @@
{
TBool isExpectedError = ETrue;
EGLint eglErr = eglGetError();
-
+
// First check that we got the correct return value
if ((iExpectedErrorCode == EGL_SUCCESS) && !aFunctionReturnValue)
{
ERR_PRINTF3(_L("thread %d: Wrong function return value: %d"), iThreadIdx, aFunctionReturnValue);
isExpectedError = EFalse;
}
- // Also check that we got the
- if (eglErr != iExpectedErrorCode)
+ // Also check that we got the
+ if (eglErr != iExpectedErrorCode)
{
ERR_PRINTF4(_L("thread %d: eglGetError() returned %x, but expected %x"), iThreadIdx, eglErr, iExpectedErrorCode);
isExpectedError = EFalse;
@@ -166,18 +166,18 @@
{
VERBOSE_INFO_PRINTF3(_L("thread %d: eglGetError() returned %x, as expected"), iThreadIdx, eglErr);
}
-
+
// Reset the expected error
ResetExpectedError();
-
+
return isExpectedError;
}
EXPORT_C void CTestEglSession::CheckExpectedErrorL(EGLint aExpectedErrorCode)
{
- EGLint eglErr = eglGetError();
+ EGLint eglErr = eglGetError();
// check that we got the expected error
- if (eglErr != aExpectedErrorCode)
+ if (eglErr != aExpectedErrorCode)
{
ERR_PRINTF4(_L("thread %d: eglGetError() returned %x, but expected %x"), iThreadIdx, eglErr, aExpectedErrorCode);
User::Leave(KErrTEFUnitFail);
@@ -188,7 +188,7 @@
{
// reset the cached extensions
iExtensionStrings.Reset();
-
+
const char* extensionsString = NULL;
if(aExtensionBelongsTo == EIsEGL)
{
@@ -196,10 +196,11 @@
extensionsString = eglQueryString(iDisplay, EGL_EXTENSIONS);
}
else if(aExtensionBelongsTo == EIsVG)
- {
+ {
INFO_PRINTF2(_L("thread %d: Calling vgGetString for VG_EXTENSIONS)"), iThreadIdx);
// OpenVG needs a current VG context before it will allow the call to vgGetString
+ // The created surface will remain un-used, hence we create it with an arbitrary pixel format
EGLConfig currentConfig = GetConfigExactMatchL(EPBufferAttribsColor64K);
CreatePbufferSurfaceAndMakeCurrentL(currentConfig, TSize(1,1), EGL_OPENVG_API);
@@ -213,13 +214,17 @@
ERR_PRINTF2(_L("CTestEglSession::QueryExtensionsL() - Unknown extension group provided (%d)."), aExtensionBelongsTo);
User::Leave(KErrArgument);
}
- CHECK_EXPECTED_ERROR(extensionsString!=NULL);
-
+ CHECK_EXPECTED_ERROR(extensionsString!=NULL);
+
TPtrC8 ptrExtensions((const TUint8 *) extensionsString );
- TBuf16<128> bufExtensions;
- bufExtensions.Copy(ptrExtensions.Left(128));
- INFO_PRINTF3(_L("thread %d: QueryExtensionsL: \"%S\""), iThreadIdx, &bufExtensions);
-
+
+ RBuf buffer;
+ buffer.CreateL(ptrExtensions.Length());
+ buffer.CleanupClosePushL();
+ buffer.Copy(ptrExtensions);
+ INFO_PRINTF3(_L("thread %d: QueryExtensionsL: \"%S\""), iThreadIdx, &buffer);
+ CleanupStack::PopAndDestroy(&buffer);
+
TInt posSpace=1;
while (posSpace > 0 && ptrExtensions.Length() > 0)
{
@@ -237,7 +242,7 @@
{
iExtensionStrings.Append(ptrExtensions);
}
- }
+ }
}
TBool CTestEglSession::FindExtensionStringL(TExtensionsGroups aExtensionBelongsTo, const TDesC8& aExtensionString)
@@ -248,7 +253,7 @@
QueryExtensionsL(aExtensionBelongsTo); // Load extension info
iExtensionGroupCached = aExtensionBelongsTo;
}
-
+
TInt countExtensionStrings = iExtensionStrings.Count();
for(TUint i=0; i<countExtensionStrings; i++)
{
@@ -263,7 +268,7 @@
const TInt KBufLenMissingExtension=128;
TBuf16<KBufLenMissingExtension> bufMissingExtension16;
bufMissingExtension16.Copy(aExtensionString.Left(KBufLenMissingExtension));
-
+
WARN_PRINTF2(_L("EGL extension missing: [%S]"), &bufMissingExtension16);
return EFalse;
}
@@ -293,11 +298,11 @@
INFO_PRINTF1(_L("Checking number of configs..."));
ASSERT_TRUE(numConfigs >= 1);
INFO_PRINTF2(_L("Found %d configs"), numConfigs);
-
+
// Get the configs
INFO_PRINTF1(_L("Calling eglGetConfigs to get configs..."));
CHECK_EXPECTED_ERROR(eglGetConfigs(iDisplay, configs, KMaxEglConfigs, &numConfigs));
-
+
for(TUint index = 0; index < numConfigs; index++)
{
EGLint EGL_BUFFER_SIZE_value;
@@ -374,14 +379,14 @@
TBool good = ETrue;
- INFO_PRINTF7(_L("(idx: %3d) RGBA=(%2d) %2d,%2d,%2d,%2d"), index, EGL_BUFFER_SIZE_value,
- EGL_RED_SIZE_value, EGL_GREEN_SIZE_value, EGL_BLUE_SIZE_value,
+ INFO_PRINTF7(_L("(idx: %3d) RGBA=(%2d) %2d,%2d,%2d,%2d"), index, EGL_BUFFER_SIZE_value,
+ EGL_RED_SIZE_value, EGL_GREEN_SIZE_value, EGL_BLUE_SIZE_value,
EGL_ALPHA_SIZE_value);
if (!(EGL_RED_SIZE_value == 8 && EGL_GREEN_SIZE_value == 8 && EGL_BLUE_SIZE_value == 8 && EGL_ALPHA_SIZE_value == 0))
{
continue;
}
-
+
INFO_PRINTF2(_L("\n\n^^^^^^ CONFIG [%d] VALUES ******"), index);
if (EGL_SURFACE_TYPE_value & EGL_PIXMAP_BIT)
{
@@ -392,7 +397,7 @@
INFO_PRINTF2(_L("EGL_SURFACE_TYPE=%d. <<< BAD (not pixmap)"), EGL_SURFACE_TYPE_value);
good = EFalse;
}
-
+
if (EGL_RENDERABLE_TYPE_value & EGL_OPENVG_BIT)
{
INFO_PRINTF2(_L("EGL_RENDERABLE_TYPE=%d. <<< Has EGL_OPENVG_BIT"), EGL_RENDERABLE_TYPE_value);
@@ -402,7 +407,7 @@
INFO_PRINTF2(_L("EGL_RENDERABLE_TYPE=%d. <<< BAD (not open vg)"), EGL_RENDERABLE_TYPE_value);
good = EFalse;
}
-
+
if (good)
{
INFO_PRINTF1(_L("^^^^^^^ GOOD ^^^^^^^"));
@@ -449,7 +454,7 @@
EXPORT_C static TEglConfigMatchType GetMatchType(EGLint aAttrib, TEglConfigMatchRule aMatchRule)
{
const TConfigMatchRuleItem* curMatchRuleItem = KConfigMatchRules[aMatchRule];
-
+
while(curMatchRuleItem->iAttrib != EGL_NONE)
{
if (aAttrib == curMatchRuleItem->iAttrib)
@@ -466,7 +471,7 @@
/**
Returns the first index of a config that matches the requested config extactly
*/
-TInt CTestEglSession::GetFullMatchConfigIndex(EGLDisplay aDisplay, EGLConfig *aConfigs, TInt aNumConfigs,
+TInt CTestEglSession::GetFullMatchConfigIndex(EGLDisplay aDisplay, EGLConfig *aConfigs, TInt aNumConfigs,
const EGLint aWantedAttribs[], TEglConfigMatchRule aMatchRule)
{
EGLint value=0;
@@ -474,7 +479,7 @@
{
const EGLint *curAttrib = aWantedAttribs;
TBool match = ETrue;
-
+
while(*curAttrib != EGL_NONE && match)
{
ASSERT_EGL_TRUE(eglGetConfigAttrib(aDisplay, aConfigs[idxConfig], *curAttrib, &value));
@@ -485,7 +490,7 @@
if (value != curAttrib[1])
{
match = EFalse;
- }
+ }
break;
case eMatchAtLeast:
if (value < curAttrib[1]) // Note, we detect "failure to match", hence "<" not ">="!
@@ -501,17 +506,17 @@
break;
case eMatchAlways:
break;
-
+
default:
// We should not get here.
- ASSERT(FALSE);
+ ASSERT(FALSE);
break;
}
curAttrib += 2;
}
-
- // If we get here with match set, we have matched all attributes, and have found a match.
- if (match)
+
+ // If we get here with match set, we have matched all attributes, and have found a match.
+ if (match)
{
return idxConfig;
}
@@ -532,7 +537,7 @@
/**
Returns pixel format inforamtion for a given EGL config.
@param aConfig The EGL config for which pixel format information will be returned.
- @return A pointer to the pixel format information for the given EGL config.
+ @return A pointer to the pixel format information for the given EGL config.
Tf the config cannot be mapped, then NULL is returned.
*/
EXPORT_C const TMapEglConfigToPixelFormat* CTestEglSession::GetPixelFormatFromEglConfigL(EGLConfig aConfig)
@@ -554,7 +559,7 @@
CHECK_EXPECTED_ERROR(eglGetConfigAttrib(iDisplay, aConfig, EGL_SURFACE_TYPE, &surfaceType));
INFO_PRINTF7(_L(">>>>> Config info: %d, %d, %d,%d,%d, 0x%x"), bufferSize, alphaSize, redSize, greenSize, blueSize, colorBufferType);
-
+
for(TUint i=0; i<ConfigToPixelFormatTableLength(); i++)
{
if ((ConfigToPixelFormatTable(i).iBufferSize == bufferSize)
@@ -625,7 +630,7 @@
ERR_PRINTF1(_L("Attribute index out of range, please check the INI file"));
User::Leave(KErrArgument);
}
-
+
EGLConfig configs[KMaxEglConfigs];
EGLint numConfigs=0;
ASSERT_EGL_TRUE(eglChooseConfig(iDisplay, KConfigAttribs[aConfigAttribIndex], configs, KMaxEglConfigs, &numConfigs));
@@ -635,7 +640,7 @@
WARN_PRINTF1(_L("GetConfigExactMatchL - Could not find a matching config, eglChooseConfig returned 0 configs!"));
User::Leave(KTestNoMatchingConfig);
}
-
+
// Check that any of the configs returned matches the desired attributes
TInt match = GetFullMatchConfigIndex(iDisplay, configs, numConfigs, KConfigAttribs[aConfigAttribIndex], aMatchRule);
if (match == KErrNotFound)
@@ -664,10 +669,10 @@
{
CreatePixmapSurfaceAndMakeCurrentL(aConfig, aSize, aDisplayMode);
DrawOpenVgL();
-
+
// Wait for the drawing to complete
eglWaitClient();
-
+
CheckImageDataL(iFbsBitmap);
CheckImageDataVgL(VG_sRGB_565);
CleanupSurfaceFbsBitmapL();
@@ -681,10 +686,10 @@
{
CreatePixmapSurfaceAndMakeCurrentL(aConfig, aSize, aDisplayMode,EGL_OPENGL_ES_API, aRenderVersion);
DrawOpenGLesL();
-
+
// Wait for the drawing to complete
eglWaitClient();
-
+
CheckImageDataFullRedishL(iFbsBitmap);
CleanupSurfaceFbsBitmapL();
CloseFbsSession();
@@ -700,7 +705,7 @@
imageInfo.iSizeInPixels = KPixmapSize;
imageInfo.iPixelFormat = EUidPixelFormatXRGB_8888;
// will draw to and read from the image using OpenVg
-#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
imageInfo.iUsage = ESgUsageBitOpenVgSurface | ESgUsageBitOpenVgImage;
#else
// will also read from the image using DirectGdi
@@ -713,11 +718,11 @@
#endif
CreatePixmapSurfaceAndMakeCurrentAndMatchL(imageInfo, EResourceCloseSgImageLate);
DrawOpenVgL();
-
+
// Wait for the drawing to complete
eglWaitClient();
-
- //we can't retrieve data directly from the SgImage as
+
+ //we can't retrieve data directly from the SgImage as
//non-unified architecture doesn't allow readback from the GPU
CheckImageDataVgL(VG_sXRGB_8888);
CleanupSurfaceSgImageL();
@@ -727,18 +732,18 @@
EXPORT_C TBool CTestEglSession::TryUsePixmapRSgImageOpenGlesL(EGLConfig aConfig, const TSgImageInfo& aImageInfo, TResourceCloseRule aResourceCloseRule, TInt aRenderVersion)
{
CreatePixmapSurfaceAndMakeCurrentL(aConfig, aImageInfo, aResourceCloseRule ,EGL_OPENGL_ES_API, aRenderVersion);
-
+
DrawOpenGLesL();
-
+
// Wait for the drawing to complete
eglWaitClient();
- //we can't retrieve data directly from SgImage as non-unified
+ //we can't retrieve data directly from SgImage as non-unified
//architecture doesn't allow readback from the GPU
-
- if (aImageInfo.iPixelFormat == EUidPixelFormatXRGB_8888 ||
+
+ if (aImageInfo.iPixelFormat == EUidPixelFormatXRGB_8888 ||
aImageInfo.iPixelFormat == EUidPixelFormatARGB_8888_PRE)
- {
+ {
CheckImageDataGLesL();
}
@@ -760,13 +765,13 @@
EXPORT_C TBool CTestEglSession::TryUsePixmapRSgImageOpenVgL(EGLConfig aConfig, const TSgImageInfo& aImageInfo, TResourceCloseRule aResourceCloseRule)
{
CreatePixmapSurfaceAndMakeCurrentL(aConfig, aImageInfo, aResourceCloseRule);
-
+
DrawOpenVgL();
-
+
// Wait for the drawing to complete
eglWaitClient();
-
- //we can't retrieve data directly from the SgImage as
+
+ //we can't retrieve data directly from the SgImage as
//non-unified architecture doesn't allow readback from the GPU
CheckImageDataVgL(VG_sXRGB_8888);
CleanupSurfaceSgImageL();
@@ -774,26 +779,24 @@
return ETrue;
}
-EXPORT_C void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, EGLenum aBindAPI, TInt aRenderVersionNumber)
+EXPORT_C void CTestEglSession::CreateWindowSurfaceAndMakeCurrentL(EGLConfig aConfig, RWindow& aWindow, TBool aVgAlphaFormatPre, EGLenum aBindAPI, TInt aRenderVersionNumber)
{
ASSERT_EQUALS(iSurface, EGL_NO_SURFACE);
ASSERT_EQUALS(iContext, EGL_NO_CONTEXT);
-
+
ASSERT_EGL_TRUE(eglBindAPI(aBindAPI));
-
+
// Create a Window surface from the native image
- EGLint EGL_RENDERABLE_TYPE_value = 0;
- ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, aConfig, EGL_RENDERABLE_TYPE, &EGL_RENDERABLE_TYPE_value));
- const EGLint* pixmapAttribs = ((aWindow.DisplayMode() == EColor16MAP) && (EGL_RENDERABLE_TYPE_value & EGL_OPENVG_BIT)) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
- iSurface = eglCreateWindowSurface(iDisplay, aConfig, &aWindow, pixmapAttribs);
+ const EGLint* windowAttribs = (aVgAlphaFormatPre && aBindAPI == EGL_OPENVG_API) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
+ iSurface = eglCreateWindowSurface(iDisplay, aConfig, &aWindow, windowAttribs);
ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
// Create a context for drawing to/reading from the pixmap surface and make it current
const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
- const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
+ const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
iContext = eglCreateContext(iDisplay, aConfig, EGL_NO_CONTEXT, attrib_list_ctx);
- ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
+ ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
ASSERT_EGL_TRUE(eglMakeCurrent(iDisplay, iSurface, iSurface, iContext));
}
@@ -809,7 +812,7 @@
{
ASSERT_EQUALS(iSurface, EGL_NO_SURFACE);
ASSERT_EQUALS(iContext, EGL_NO_CONTEXT);
-
+
OpenSgDriverL();
ASSERT_EQUALS(iSgImage.Create(aImageInfo, NULL, 0), KErrNone);
@@ -831,7 +834,7 @@
ERR_PRINTF1(_L("CreatePixmapSurfaceAndMakeCurrentAndMatchL - Unkown API requested!"));
User::Leave(KErrArgument);
}
- EGLint attrib_list[] = {
+ EGLint attrib_list[] = {
EGL_MATCH_NATIVE_PIXMAP,(TInt)&iSgImage,
EGL_RENDERABLE_TYPE,renderableType,
EGL_SURFACE_TYPE,EGL_PIXMAP_BIT,
@@ -858,21 +861,21 @@
const EGLint* pixmapAttribs = ((aImageInfo.iPixelFormat == EUidPixelFormatARGB_8888_PRE) && (EGL_RENDERABLE_TYPE_value & EGL_OPENVG_BIT)) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
iSurface = eglCreatePixmapSurface(iDisplay, config, &iSgImage, pixmapAttribs);
ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
-
+
if (aResourceCloseRule == EResourceCloseSgImageEarly)
{
// EGL should have taken its own reference to the SgImage, so it should be able to continue
// to use the underlying data after this local image has been closed.
iSgImage.Close();
}
-
+
if (aResourceCloseRule == EResourceCloseSgDriverAndImageEarly)
{
// EGL should have taken its own reference to the SgDriver, so it should be able to continue
- // to use its reference to the image resource after this local reference to the driver has
+ // to use its reference to the image resource after this local reference to the driver has
// been closed.
iSgImage.Close();
- CloseSgDriver();
+ CloseSgDriver();
}
// Create a context for drawing to/reading from the pixmap surface and make it current
@@ -885,12 +888,12 @@
}
/**
-Compound operation that constructs an RSgImage and uses it to create a pixmap suface.
+Compound operation that constructs an RSgImage and uses it to create a pixmap suface.
It then makes it current to the thread.
@param aConfig The EGL config to be used when creating the pixmap surface
@param aImageInfo Used to create the RSgImage pixmap
@param aCloseNativeImageEarly When ETrue, the RSgImage is closed as soon as the pixmap surface has been
- created. Otherwise, the RSgImage is left to be destroyed later by some other method
+ created. Otherwise, the RSgImage is left to be destroyed later by some other method
- e.g at the same time as destroying the surface.
@return Whether it was possible to create an iSgImage for the given aImageInfo
*/
@@ -898,10 +901,10 @@
{
ASSERT_EQUALS(iSurface, EGL_NO_SURFACE);
ASSERT_EQUALS(iContext, EGL_NO_CONTEXT);
-
+
OpenSgDriverL();
ASSERT_EQUALS(iSgImage.Create(aImageInfo, NULL, 0), KErrNone);
-
+
ASSERT_EGL_TRUE(eglBindAPI(aBindAPI));
// Create a pixmap surface from the native image
@@ -910,7 +913,7 @@
const EGLint* pixmapAttribs = ((aImageInfo.iPixelFormat == EUidPixelFormatARGB_8888_PRE) && (EGL_RENDERABLE_TYPE_value & EGL_OPENVG_BIT)) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
iSurface = eglCreatePixmapSurface(iDisplay, aConfig, &iSgImage, pixmapAttribs);
ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
-
+
if (aResourceCloseRule == EResourceCloseSgImageEarly)
{
// EGL should have taken its own reference to the SgImage, so it should be able to continue
@@ -920,18 +923,18 @@
if (aResourceCloseRule == EResourceCloseSgDriverAndImageEarly)
{
// EGL should have taken its own reference to the SgDriver, so it should be able to continue
- // to use its reference to the image resource after this local reference to the driver has
+ // to use its reference to the image resource after this local reference to the driver has
// been closed.
iSgImage.Close();
- CloseSgDriver();
+ CloseSgDriver();
}
-
+
// Create a context for drawing to/reading from the pixmap surface and make it current
const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
- const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
+ const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
iContext = eglCreateContext(iDisplay, aConfig, EGL_NO_CONTEXT, attrib_list_ctx);
- ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
+ ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
ASSERT_EGL_TRUE(eglMakeCurrent(iDisplay, iSurface, iSurface, iContext));
}
@@ -939,7 +942,7 @@
{
//Fist try with CreateHardwareBitmap to check whether we are on hardware
TInt result = aFbsBitmap->CreateHardwareBitmap(aSize, aDisplayMode, KUidEglTestServer);
-
+
if(result == KErrNotSupported)
{
//we are not on hardware
@@ -952,12 +955,12 @@
{
ASSERT_EQUALS(iSurface, EGL_NO_SURFACE);
ASSERT_EQUALS(iContext, EGL_NO_CONTEXT);
-
+
// Create an empty native CFbsBitmap
OpenFbsSessionL();
iFbsBitmap = new(ELeave)CFbsBitmap;
ASSERT_EQUALS(CreateBitmap(iFbsBitmap, aSize, displayMode), KErrNone);
-
+
const EGLint* attrib_list = NULL;
if(aBindAPI == EGL_OPENVG_API)
{
@@ -978,28 +981,28 @@
User::Leave(KErrArgument);
}
ASSERT_EGL_TRUE(eglBindAPI(aBindAPI));
-
+
// Create a pixmap surface from the native image
EGLint EGL_RENDERABLE_TYPE_value = 0;
ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, aConfig, EGL_RENDERABLE_TYPE, &EGL_RENDERABLE_TYPE_value));
const EGLint* pixmapAttribs = ((displayMode == EColor16MAP) && (EGL_RENDERABLE_TYPE_value & EGL_OPENVG_BIT)) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
iSurface = eglCreatePixmapSurface(iDisplay, aConfig, iFbsBitmap, pixmapAttribs);
ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
-
+
// Create a context for drawing to/reading from the pixmap surface and make it current
iContext = eglCreateContext(iDisplay, aConfig, EGL_NO_CONTEXT, attrib_list);
- ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
+ ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
ASSERT_EGL_TRUE(eglMakeCurrent(iDisplay, iSurface, iSurface, iContext));
}
-EXPORT_C void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentAndMatchL(const TSize& aSize, TDisplayMode displayMode, EGLenum aBindAPI, TInt aRenderVersionNumber)
+EXPORT_C void CTestEglSession::CreatePixmapSurfaceAndMakeCurrentAndMatchL(const TSize& aSize, TDisplayMode aDisplayMode, EGLenum aBindAPI, TInt aRenderVersionNumber)
{
ASSERT_EQUALS(iSurface, EGL_NO_SURFACE);
ASSERT_EQUALS(iContext, EGL_NO_CONTEXT);
-
+
OpenFbsSessionL();
iFbsBitmap = new(ELeave)CFbsBitmap;
- ASSERT_EQUALS(CreateBitmap(iFbsBitmap, aSize, displayMode), KErrNone);
+ ASSERT_EQUALS(CreateBitmap(iFbsBitmap, aSize, aDisplayMode), KErrNone);
EGLint renderableType = 0;
if(aBindAPI == EGL_OPENVG_API)
@@ -1019,7 +1022,7 @@
ERR_PRINTF1(_L("CreatePixmapSurfaceAndMakeCurrentAndMatchL - Unkown API requested!"));
User::Leave(KErrArgument);
}
- EGLint attrib_list[] = {
+ EGLint attrib_list[] = {
EGL_MATCH_NATIVE_PIXMAP,(TInt)iFbsBitmap,
EGL_RENDERABLE_TYPE,renderableType,
EGL_SURFACE_TYPE,EGL_PIXMAP_BIT,
@@ -1041,18 +1044,16 @@
}
// Create a pixmap surface from the native image
- EGLint EGL_RENDERABLE_TYPE_value = 0;
- ASSERT_EGL_TRUE(eglGetConfigAttrib(iDisplay, config, EGL_RENDERABLE_TYPE, &EGL_RENDERABLE_TYPE_value));
- const EGLint* pixmapAttribs = ((displayMode == EColor16MAP) && (EGL_RENDERABLE_TYPE_value & EGL_OPENVG_BIT)) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
+ const EGLint* pixmapAttribs = (aDisplayMode == EColor16MAP && aBindAPI == EGL_OPENVG_API) ? KPixmapAttribsVgAlphaFormatPre : KPixmapAttribsNone;
iSurface = eglCreatePixmapSurface(iDisplay, config, iFbsBitmap, pixmapAttribs);
ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
-
+
// Create a context for drawing to/reading from the pixmap surface and make it current
const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
- const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
+ const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
iContext = eglCreateContext(iDisplay, config, EGL_NO_CONTEXT, attrib_list_ctx);
- ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
+ ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
ASSERT_EGL_TRUE(eglMakeCurrent(iDisplay, iSurface, iSurface, iContext));
}
@@ -1063,27 +1064,27 @@
ASSERT_EQUALS(iSurface, EGL_NO_SURFACE);
ASSERT_EQUALS(iContext, EGL_NO_CONTEXT);
-
+
ASSERT_EGL_TRUE(eglBindAPI(aBindAPI));
-
+
// PBuffer attribs options are:
// EGL_WIDTH, EGL_HEIGHT, EGL_LARGEST_PBUFFER,
// EGL_TEXTURE_FORMAT, EGL_TEXTURE_TARGET, EGL_MIPMAP_TEXTURE,
// EGL_VG_COLORSPACE, and EGL_VG_ALPHA_FORMAT
// Create a pbuffer surface of the given size
- const EGLint KPbufferAttribs[] = {
+ const EGLint KPbufferAttribs[] = {
EGL_WIDTH, aSize.iWidth,
EGL_HEIGHT, aSize.iHeight,
EGL_NONE };
- iSurface = eglCreatePbufferSurface(iDisplay, aConfig, KPbufferAttribs);
+ iSurface = eglCreatePbufferSurface(iDisplay, aConfig, KPbufferAttribs);
ASSERT_EGL_TRUE(iSurface != EGL_NO_SURFACE);
// Create a context for drawing to/reading from the pixmap surface and make it current
const EGLint KAttribsListCtxNone[] = { EGL_NONE };;
const EGLint KAttribsListCtxGles2[] = { EGL_CONTEXT_CLIENT_VERSION, aRenderVersionNumber, EGL_NONE };
- const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
+ const EGLint* attrib_list_ctx = (aBindAPI == EGL_OPENGL_ES_API && aRenderVersionNumber == 2) ? KAttribsListCtxGles2 : KAttribsListCtxNone;
iContext = eglCreateContext(iDisplay, aConfig, EGL_NO_CONTEXT, attrib_list_ctx);
- ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
+ ASSERT_EGL_TRUE(iContext != EGL_NO_CONTEXT);
ASSERT_EGL_TRUE(eglMakeCurrent(iDisplay, iSurface, iSurface, iContext));
}
@@ -1091,14 +1092,14 @@
{
ASSERT_TRUE(iSurface != EGL_NO_SURFACE);
ASSERT_TRUE(iContext != EGL_NO_CONTEXT);
-
- // Draw to the pixmap surface
+
+ // Draw to the pixmap surface
// Clear it: redish
VGfloat colorBackground[4];
ConvertColor(KRgbReddish, colorBackground);
vgSetfv(VG_CLEAR_COLOR, 4, colorBackground);
vgClear(0, 0, KPixmapSize.iWidth, KPixmapSize.iHeight);
-
+
// And add a square: greenish
VGfloat colorSquare[4];
ConvertColor(KRgbGreenish, colorSquare);
@@ -1119,16 +1120,16 @@
const GLfloat glGreenBits = 255.f;
const GLfloat glBlueBits = 255.f;
const GLfloat glAlphaBits = 255.f;
-
+
// Disable cdither - when using exact comparison to reference bitmap
// because reference bitmap cannot be created to match dither exactly
- glDisable(GL_DITHER);
+ glDisable(GL_DITHER);
// Clear the surface to the colour specified
glClearColor((glRed)/glRedBits, (glGreen)/glGreenBits, (glBlue)/glBlueBits, glAlpha/glAlphaBits);
-
+
//glColor3f(KRgbGreenish.Red(),KRgbGreenish.Green(),KRgbGreenish.Blue());
//glRectf(KPixmapSquare.iTl.iX, KPixmapSquare.iTl.iY,KPixmapSquare.iTl.iX + KPixmapSquare.Width(),KPixmapSquare.iTl.iY + KPixmapSquare.Height());
-
+
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -1141,7 +1142,7 @@
ASSERT_TRUE(PixelsMatch(KRgbReddish, rgbPixelSample, EFalse));
aFbsBitmap->GetPixel(rgbPixelSample, TPoint(90,90));
ASSERT_TRUE(PixelsMatch(KRgbReddish, rgbPixelSample, EFalse));
-
+
// Inside the square
aFbsBitmap->GetPixel(rgbPixelSample, TPoint(30,30));
ASSERT_TRUE(PixelsMatch(KRgbGreenish, rgbPixelSample, EFalse));
@@ -1158,7 +1159,7 @@
ASSERT_TRUE(PixelsMatch(KRgbReddish, rgbPixelSample, EFalse));
aFbsBitmap->GetPixel(rgbPixelSample, TPoint(90,90));
ASSERT_TRUE(PixelsMatch(KRgbReddish, rgbPixelSample, EFalse));
-
+
// Inside the square
aFbsBitmap->GetPixel(rgbPixelSample, TPoint(30,30));
ASSERT_TRUE(PixelsMatch(KRgbReddish, rgbPixelSample, EFalse));
@@ -1177,13 +1178,13 @@
case VG_sRGB_565:
{
TUint16 intPixelSample=0;
-
+
// Outside the square
vgReadPixels(&intPixelSample, 1, aDataFormat, 10,10, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color64K(intPixelSample), EFalse));
vgReadPixels(&intPixelSample, 1, aDataFormat, 90,90, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color64K(intPixelSample), EFalse));
-
+
// Inside the square
vgReadPixels(&intPixelSample, 1, aDataFormat, 30,30, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbGreenish, TRgb::Color64K(intPixelSample), EFalse));
@@ -1191,16 +1192,16 @@
ASSERT_TRUE(PixelsMatch(KRgbGreenish, TRgb::Color64K(intPixelSample), EFalse));
break;
}
- case VG_sXRGB_8888:
+ case VG_sXRGB_8888:
{
TUint32 intPixelSample=0;
-
+
// Outside the square
vgReadPixels(&intPixelSample, 1, aDataFormat, 10,10, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color16MU(intPixelSample), EFalse));
vgReadPixels(&intPixelSample, 1, aDataFormat, 90,90, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color16MU(intPixelSample), EFalse));
-
+
// Inside the square
vgReadPixels(&intPixelSample, 1, aDataFormat, 30,30, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbGreenish, TRgb::Color16MU(intPixelSample), EFalse));
@@ -1211,13 +1212,13 @@
case VG_sARGB_8888:
{
TUint32 intPixelSample=0;
-
+
// Outside the square
vgReadPixels(&intPixelSample, 1, aDataFormat, 10,10, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color16MA(intPixelSample), EFalse));
vgReadPixels(&intPixelSample, 1, aDataFormat, 90,90, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color16MA(intPixelSample), EFalse));
-
+
// Inside the square
vgReadPixels(&intPixelSample, 1, aDataFormat, 30,30, 1,1);
ASSERT_TRUE(PixelsMatch(KRgbGreenish, TRgb::Color16MA(intPixelSample), EFalse));
@@ -1240,8 +1241,8 @@
TUint32 intPixelSample;
glReadPixels(10,10,1,1,GL_RGBA,GL_UNSIGNED_BYTE ,&intPixelSample);
SwapChannels(intPixelSample);
- ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color16MU(intPixelSample), EFalse));
-
+ ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color16MU(intPixelSample), EFalse));
+
glReadPixels(45,45,1,1,GL_RGBA,GL_UNSIGNED_BYTE ,&intPixelSample);
SwapChannels(intPixelSample);
ASSERT_TRUE(PixelsMatch(KRgbReddish, TRgb::Color16MU(intPixelSample), EFalse));
@@ -1259,7 +1260,7 @@
EXPORT_C void CTestEglSession::SwapChannels(TUint32 &aSwapMe)
{
TUint32 buff = aSwapMe;
-
+
aSwapMe = 0;
aSwapMe |= (buff & 0x000000FF) << 16;
aSwapMe |= (buff & 0x0000FF00);
@@ -1283,12 +1284,12 @@
Also closes the internal RSgImage handled that is associated to the surface.
EGL destroys all surface and context handles associated with a display when
-eglTerminate() is called.
+eglTerminate() is called.
*/
EXPORT_C void CTestEglSession::ResetSurfaceAndContextSgImageL()
{
INFO_PRINTF1(_L("CTestEglSession::ResetSurfaceAndContextSgImageL()"));
-
+
iContext = EGL_NO_CONTEXT;
iSurface = EGL_NO_SURFACE;
iSgImage.Close();
@@ -1297,7 +1298,7 @@
/**
Check that the pixel values match within a predefined tolerance
@param aExpected the expected pixel colour vaule
- @param aActual the actual pixel colour value
+ @param aActual the actual pixel colour value
@param aCheckAlpha Whether to check the alpha channel value
@return Whether the pixel values match - within the allowed tolerance
*/
@@ -1307,10 +1308,10 @@
// differences, while too low will be too strict to allow for pixel conversions, i.e. from 16bpp to 32bpp
const TInt KPixelTolerance = 8;
- if (aCheckAlpha && aExpected.Alpha()== 0 &&
- aActual.Red() == 0 &&
- aActual.Green() == 0 &&
- aActual.Blue() == 0 &&
+ if (aCheckAlpha && aExpected.Alpha()== 0 &&
+ aActual.Red() == 0 &&
+ aActual.Green() == 0 &&
+ aActual.Blue() == 0 &&
aActual.Alpha() == 0)
{
// if the expected value for alpha is 0, all actual values should be 0
@@ -1339,7 +1340,7 @@
CHECK_EXPECTED_ERROR(eglInitialize(iDisplay, &major, &minor));
// Remember if the user wants us to terminate the display.
iTerminateDisplay = aTerminateDisplay;
-
+
INFO_PRINTF4(_L("thread %d: Initialised: EGL Version %d.%d"), iThreadIdx, major, minor);
}
@@ -1372,11 +1373,11 @@
if (!iSgDriverOpen)
{
VERBOSE_INFO_PRINTF2(_L("CTestEglSession<0x%08x> Opening SgDriver"), this);
-#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
TInt ret=iSgDriver.Open();
#else
TInt ret=SgDriver::Open();
-#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
ASSERT_EQUALS(ret, KErrNone);
iSgDriverOpen = ETrue;
}
@@ -1387,10 +1388,10 @@
if (iSgDriverOpen)
{
VERBOSE_INFO_PRINTF2(_L("CTestEglSession<0x%08x> Closing SgDriver"), this);
-#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
iSgDriver.Close();
#else
- SgDriver::Close();
+ SgDriver::Close();
#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
iSgDriverOpen = EFalse;
}
@@ -1437,7 +1438,7 @@
TBool bSuccess = FetchProcEglCreateImageKhr();
ASSERT_TRUE(bSuccess);
VERBOSE_INFO_PRINTF2(_L("thread %d: Calling eglCreateImageKHR"), iThreadIdx);
- EGLImageKHR eglImage = ipfnEglCreateImageKHR(aDisplay,aContext,aTarget,reinterpret_cast<EGLClientBuffer>(aSgImage),const_cast<EGLint *>(aAttr_List));
+ EGLImageKHR eglImage = ipfnEglCreateImageKHR(aDisplay,aContext,aTarget,reinterpret_cast<EGLClientBuffer>(aSgImage),const_cast<EGLint *>(aAttr_List));
return eglImage;
}
@@ -1447,7 +1448,7 @@
ASSERT_TRUE(bSuccess);
INFO_PRINTF2(_L("thread %d: Calling eglCreateImageKHR, with CFBsBitmap)"), iThreadIdx);
//the following call to eglCreateImageKHR MUST fail, error handling is made outside
- EGLImageKHR eglImage = ipfnEglCreateImageKHR(aDisplay,aContext,aTarget,reinterpret_cast<EGLClientBuffer>(&aCFbsBitmap),const_cast<EGLint *>(aAttr_List));
+ EGLImageKHR eglImage = ipfnEglCreateImageKHR(aDisplay,aContext,aTarget,reinterpret_cast<EGLClientBuffer>(&aCFbsBitmap),const_cast<EGLint *>(aAttr_List));
return eglImage;
}
@@ -1479,7 +1480,7 @@
if (!ipfnvgCreateImageTargetKHR)
{
INFO_PRINTF2(_L("thread %d: Calling eglGetProcAddress (\"vgCreateEGLImageTargetKHR\")"), iThreadIdx);
- ipfnvgCreateImageTargetKHR = reinterpret_cast<TFPtrVgCreateEglImageTargetKhr>(eglGetProcAddress("vgCreateEGLImageTargetKHR"));
+ ipfnvgCreateImageTargetKHR = reinterpret_cast<TFPtrVgCreateEglImageTargetKhr>(eglGetProcAddress("vgCreateEGLImageTargetKHR"));
if (ipfnvgCreateImageTargetKHR==NULL)
{
EGLint eglError = eglGetError();
@@ -1507,32 +1508,32 @@
EGLint EGL_SURFACE_TYPE_value;
EGLint EGL_RENDERABLE_TYPE_value;
EGLint EGL_CONFIG_ID_value;
-
+
eglGetConfigAttrib(iDisplay, aConfig, EGL_CONFIG_ID, &EGL_CONFIG_ID_value);
eglGetConfigAttrib(iDisplay, aConfig, EGL_BUFFER_SIZE, &EGL_BUFFER_SIZE_value);
eglGetConfigAttrib(iDisplay, aConfig, EGL_ALPHA_SIZE, &EGL_ALPHA_SIZE_value);
eglGetConfigAttrib(iDisplay, aConfig, EGL_BLUE_SIZE, &EGL_BLUE_SIZE_value);
eglGetConfigAttrib(iDisplay, aConfig, EGL_GREEN_SIZE, &EGL_GREEN_SIZE_value);
eglGetConfigAttrib(iDisplay, aConfig, EGL_RED_SIZE, &EGL_RED_SIZE_value);
- eglGetConfigAttrib(iDisplay, aConfig, EGL_SURFACE_TYPE, &EGL_SURFACE_TYPE_value);
+ eglGetConfigAttrib(iDisplay, aConfig, EGL_SURFACE_TYPE, &EGL_SURFACE_TYPE_value);
eglGetConfigAttrib(iDisplay, aConfig, EGL_RENDERABLE_TYPE, &EGL_RENDERABLE_TYPE_value);
#ifdef PRINTG_CONFIGS_LOG
- INFO_PRINTF7(_L("(Config: %3d) RGBA=(%2d) %2d,%2d,%2d,%2d"), EGL_CONFIG_ID_value, EGL_BUFFER_SIZE_value,
- EGL_RED_SIZE_value, EGL_GREEN_SIZE_value, EGL_BLUE_SIZE_value,
+ INFO_PRINTF7(_L("(Config: %3d) RGBA=(%2d) %2d,%2d,%2d,%2d"), EGL_CONFIG_ID_value, EGL_BUFFER_SIZE_value,
+ EGL_RED_SIZE_value, EGL_GREEN_SIZE_value, EGL_BLUE_SIZE_value,
EGL_ALPHA_SIZE_value);
INFO_PRINTF2(_L("RENDERABLE_TYPE %d"),EGL_RENDERABLE_TYPE_value);
#endif
-
+
if(!(EGL_SURFACE_TYPE_value & EGL_PIXMAP_BIT))
{
return EFalse;
}
-
+
TBool good = ETrue;
//requested usage bits
TSgImageInfo requestedImageInfo;
aImage.GetInfo(requestedImageInfo);
-
+
#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
//potential usage bits
RSgImage potential;
@@ -1540,22 +1541,22 @@
TSgImageInfo potentialImageInfo;
potential.GetInfo(potentialImageInfo);
potential.Close();
-#endif
-
+#endif
+
switch(requestedImageInfo.iPixelFormat)
- {
+ {
case EUidPixelFormatRGB_565:
if (!(EGL_RED_SIZE_value == 5 && EGL_GREEN_SIZE_value == 6 && EGL_BLUE_SIZE_value == 5 && EGL_ALPHA_SIZE_value == 0))
{
good = EFalse;
}
- break;
+ break;
case EUidPixelFormatXRGB_8888:
if (!(EGL_RED_SIZE_value == 8 && EGL_GREEN_SIZE_value == 8 && EGL_BLUE_SIZE_value == 8 && EGL_ALPHA_SIZE_value == 0))
{
good = EFalse;
- }
- break;
+ }
+ break;
case EUidPixelFormatARGB_8888_PRE:
if (!(EGL_RED_SIZE_value == 8 && EGL_GREEN_SIZE_value == 8 && EGL_BLUE_SIZE_value == 8 && EGL_ALPHA_SIZE_value == 8))
{
@@ -1588,17 +1589,17 @@
}
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
- //
+ //
//Check if strict matching requirements are met:
- //- All the supported APIs included in the EGL_RENDERABLE_TYPE of the
+ //- All the supported APIs included in the EGL_RENDERABLE_TYPE of the
// EGLConfig must be matched by the corresponding iUsage of RSgImage
- //- The following usages included in the iUsage of the RSgImage must be
- // matched by the corresponding API in EGL_RENDERABLE_TYPE of the EGLConfig:
+ //- The following usages included in the iUsage of the RSgImage must be
+ // matched by the corresponding API in EGL_RENDERABLE_TYPE of the EGLConfig:
// ESgUsageBitOpenGlSurface-> EGL_OPENGL_BIT
// ESgUsageBitOpenGlesSurface-> EGL_OPENGL_ES_BIT
// ESgUsageBitOpenGles2Surface-> EGL_OPENGL_ES2_BIT
// ESgUsageBitOpenVgSurface->EGL_OPENVG_BIT
-
+
EGLint usageBitsMask = 0;
if(requestedImageInfo.iUsage & ESgUsageBitOpenVgSurface)
{
@@ -1640,9 +1641,9 @@
{
return EFalse;
}
-
+
// potential usage >= RENDERABLE_TYPE
-
+
EGLint potentialUsageBitsMask = 0;
if(potentialImageInfo.iUsage & ESgUsageOpenVgTarget)
{
@@ -1656,13 +1657,13 @@
{
potentialUsageBitsMask |= EGL_OPENGL_ES2_BIT;
}
-
+
potentialUsageBitsMask = EGL_RENDERABLE_TYPE_value &~ potentialUsageBitsMask;
if(potentialUsageBitsMask)
{
return EFalse;
}
-#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
+#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
return good;
}
@@ -1744,8 +1745,8 @@
}
}
#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
-
- return ETrue;
+
+ return ETrue;
}
EXPORT_C CFbsBitmap* CTestEglSession::CreateReferenceBitmapL(TDisplayMode aMode)
@@ -1796,8 +1797,8 @@
fbsBitGc->Activate(bitmapDevice);
fbsBitGc->SetBrushColor(KRgbBlack);
fbsBitGc->Clear();
-
- // create the penBitmap (same size as the mask bitmap)
+
+ // create the penBitmap (same size as the mask bitmap)
CFbsBitmap* penBitmap = new(ELeave) CFbsBitmap();
CleanupStack::PushL(penBitmap);
User::LeaveIfError(penBitmap->Create(aMaskBitmap->SizeInPixels(), aRefBitmapMode));
@@ -1810,9 +1811,9 @@
penBitGc->Clear();
// perform a masked bitmap transfer to the active refBitmap
- TRect bmpRect(TPoint(0, 0), refBitmap->SizeInPixels());
+ TRect bmpRect(TPoint(0, 0), refBitmap->SizeInPixels());
fbsBitGc->Activate(bitmapDevice);
- fbsBitGc->BitBltMasked(TPoint(0, 0), penBitmap, bmpRect, aMaskBitmap, EFalse);
+ fbsBitGc->BitBltMasked(TPoint(0, 0), penBitmap, bmpRect, aMaskBitmap, EFalse);
CleanupStack::PopAndDestroy(5, bitmapDevice);
CleanupStack::Pop(refBitmap);
@@ -1830,7 +1831,7 @@
TInt height = bitmap->SizeInPixels().iHeight;
TInt width = bitmap->SizeInPixels().iWidth;
- // Initialise colour values to a random value (guarantees pixel uniqueness if update is done accordingly)
+ // Initialise colour values to a random value (guarantees pixel uniqueness if update is done accordingly)
TInt red=0;
TInt green=127;
TInt blue=127;
@@ -1876,29 +1877,29 @@
{
// We should not get here - colour mode not supported by these tests
ERR_PRINTF1(_L("CTestEglSession::CreateReferenceBitmapL - Colour mode not supported!"));
- ASSERT(FALSE);
+ ASSERT(FALSE);
}
}
bmpUtil.IncYPos();
- // Update red bit
- red = ++red + aIndex;
- if (red>255)
+ // Update red bit
+ red = ++red + aIndex;
+ if (red>255)
red = red - 256;
-
+
// Update green bit
- green = --green - aIndex;
- if (green<0)
+ green = --green - aIndex;
+ if (green<0)
green = green + 256;
-
+
// Update blue bit
- blue = ++blue + aIndex;
- if (blue>255)
+ blue = ++blue + aIndex;
+ if (blue>255)
blue = blue - 256;
-
+
// Update alpha bit
- alpha = --alpha - aIndex;
- if (alpha<0)
+ alpha = --alpha - aIndex;
+ if (alpha<0)
alpha = alpha + 256;
}
}
@@ -1916,14 +1917,14 @@
switch(aDataFormat)
{
case VG_sRGB_565:
- {
+ {
TUint16* vgPixel = new(ELeave) TUint16[width];
CleanupArrayDeletePushL(vgPixel);
for (TInt y=0; y < height; y++)
{
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
vgReadPixels(vgPixel, 1, aDataFormat, 0,height-y-1, width,1);
-
+
for (TInt x=0; x < width; x++)
{
aReferenceBitmap->GetPixel(refPixel, TPoint(x,y));
@@ -1931,21 +1932,21 @@
{
User::Leave(KErrTEFUnitFail);
}
- }
+ }
}
CleanupStack::PopAndDestroy(vgPixel);
break;
}
- case VG_sXRGB_8888:
- {
+ case VG_sXRGB_8888:
+ {
TUint32* vgPixel = new(ELeave) TUint32[width];
CleanupArrayDeletePushL(vgPixel);
for (TInt y=0; y < height; y++)
{
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
vgReadPixels(vgPixel, 1, aDataFormat, 0,height-y-1, width,1);
-
+
for (TInt x=0; x < width; x++)
{
aReferenceBitmap->GetPixel(refPixel, TPoint(x,y));
@@ -1953,21 +1954,21 @@
{
User::Leave(KErrTEFUnitFail);
}
- }
+ }
}
CleanupStack::PopAndDestroy(vgPixel);
break;
}
-
- case VG_sARGB_8888:
- {
+
+ case VG_sARGB_8888:
+ {
TUint32* vgPixel = new(ELeave) TUint32[width];
CleanupArrayDeletePushL(vgPixel);
for (TInt y=0; y < height; y++)
{
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
vgReadPixels(vgPixel, 1, aDataFormat, 0,height-y-1, width,1);
-
+
for (TInt x=0; x < width; x++)
{
aReferenceBitmap->GetPixel(refPixel, TPoint(x,y));
@@ -1975,21 +1976,21 @@
{
User::Leave(KErrTEFUnitFail);
}
- }
+ }
}
CleanupStack::PopAndDestroy(vgPixel);
break;
}
-
- case VG_sARGB_8888_PRE:
- {
+
+ case VG_sARGB_8888_PRE:
+ {
TUint32* vgPixel = new(ELeave) TUint32[width];
CleanupArrayDeletePushL(vgPixel);
for (TInt y=0; y < height; y++)
{
// Mind the fact that CFbsBitmap and VGImages use different coordinates origin!
vgReadPixels(vgPixel, 1, aDataFormat, 0,height-y-1, width,1);
-
+
for (TInt x=0; x < width; x++)
{
aReferenceBitmap->GetPixel(refPixel, TPoint(x,y));
@@ -1997,7 +1998,7 @@
{
User::Leave(KErrTEFUnitFail);
}
- }
+ }
}
CleanupStack::PopAndDestroy(vgPixel);
break;
@@ -2006,21 +2007,21 @@
default:
// We should not get here - colour mode not supported by these tests
ERR_PRINTF1(_L("CTestEglSession::CheckVgDrawingL - Colour mode not supported!"));
- ASSERT(FALSE);
+ ASSERT(FALSE);
break;
}
}
-EXPORT_C TBool CTestEglSession::IsOpenGLESSupported()
- {
+EXPORT_C TBool CTestEglSession::IsOpenGLESSupported()
+ {
if(!iIsSupportedRenderInitialized)
{
CheckAllAvailableRenders();
}
return iIsOpenGLESSupported;
- }
+ }
-EXPORT_C TBool CTestEglSession::IsOpenGLES2Supported()
+EXPORT_C TBool CTestEglSession::IsOpenGLES2Supported()
{
if(!iIsSupportedRenderInitialized)
{
@@ -2028,7 +2029,7 @@
}
return iIsOpenGLES2Supported;
}
-EXPORT_C TBool CTestEglSession::IsOpenVGSupported()
+EXPORT_C TBool CTestEglSession::IsOpenVGSupported()
{
if(!iIsSupportedRenderInitialized)
{
@@ -2042,7 +2043,7 @@
ASSERT_EGL_TRUE(iDisplay != EGL_NO_DISPLAY);
TPtrC8 ptrEglClientApis((const TText8 *)eglQueryString(iDisplay, EGL_CLIENT_APIS));
_LIT8(KOpenGLES, "OpenGL_ES");
- EGLint numConfigs= 0;
+ EGLint numConfigs= 0;
EGLConfig config;
if(ptrEglClientApis.Find(KOpenGLES) != KErrNotFound)
{
@@ -2069,7 +2070,7 @@
_LIT8(KOpenVG, "OpenVG");
if(ptrEglClientApis.Find(KOpenVG) != KErrNotFound)
{
- numConfigs= 0;
+ numConfigs= 0;
//check VG
const EGLint KAttrib_list_vg[] = { EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
EGL_NONE };
--- a/egl/egltest/src/egltestcommonstep.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/egltestcommonstep.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -294,10 +294,12 @@
RMsgQueue<TSgDrawableId> messageQueueSgId;
TInt ret = messageQueueSgId.CreateGlobal(KNullDesC, 1, EOwnerProcess);
ASSERT_EQUALS(ret, KErrNone);
+ CleanupClosePushL(messageQueueSgId);
RMsgQueue<TProcessId> messageQueueProcId;
ret = messageQueueProcId.CreateGlobal(KNullDesC, 1, EOwnerProcess);
ASSERT_EQUALS(ret, KErrNone);
+ CleanupClosePushL(messageQueueProcId);
// Create semphores that can be shared (only used in some test to synch between 2 process)
ret = iSemaphore[0].CreateGlobal(KNullDesC(), 0, EOwnerProcess);
@@ -305,6 +307,12 @@
ret = iSemaphore[1].CreateGlobal(KNullDesC(), 0, EOwnerProcess);
ASSERT_EQUALS(ret, KErrNone);
+ // create MsgQueue (only used in some tests to pass data from client processes to the main process)
+ RMsgQueue<TEglStepMessageBuffer> messageQueueClientProcParam;
+ ret = messageQueueClientProcParam.CreateGlobal(KNullDesC, 1, EOwnerProcess);
+ ASSERT_EQUALS(ret, KErrNone);
+ CleanupClosePushL(messageQueueClientProcParam);
+
for (TInt i=0; i<aProcessCount; i++)
{
TProcessInfo info;
@@ -338,14 +346,19 @@
User::LeaveIfError(ret);
ret = iProcessStatus[i].iProcess.SetParameter(EProcSlotSurfaceFormat, static_cast<TInt>(iSurfaceFormat));
User::LeaveIfError(ret);
-
+ ret = iProcessStatus[i].iProcess.SetParameter(EProcSlotCustomClientParam, messageQueueClientProcParam);
+ User::LeaveIfError(ret);
+
iProcessStatus[i].iProcess.Logon(iProcessStatus[i].iStatus);
iProcessStatus[i].iProcess.Resume();
}
+
+ //by default an empty implementation
+ ReceiveMessageFromClient(messageQueueClientProcParam);
// wait for all processes to complete (not worried about the order)
// This is needed, as the only way to determine whether the process step has failed is to check
- // the return value (using TEST(EFalse) has no effect on the spawned process)
+ // the return value (using TEST(EFalse) has no effect on the spawned process)
for (TInt i=0; i<aProcessCount; i++)
{
User::WaitForRequest(iProcessStatus[i].iStatus);
@@ -355,8 +368,7 @@
}
// close MsgQueue and semaphores (as used in some test with 2 spawned processes)
- messageQueueSgId.Close();
- messageQueueProcId.Close();
+ CleanupStack::PopAndDestroy(3, &messageQueueSgId); //messageQueueClientProcParam, messageQueueProcId
iSemaphore[1].Close();
iSemaphore[0].Close();
}
--- a/egl/egltest/src/eglteststep.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/egl/egltest/src/eglteststep.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -63,7 +63,7 @@
else if (aStepName == KDisplay_OOM_ClientHeap) testStep = new CEglTest_Display_OOM_ClientHeap;
else if (aStepName == KDisplay_OOM_ClientHeap_Initialize) testStep = new CEglTest_Display_OOM_ClientHeap_Initialize;
- //SyncObject tests excluding WaitFlush which requires OpenVG and OpenGL ES
+ // SyncObject tests excluding WaitFlush which requires OpenVG and OpenGL ES
else if (aStepName == KSyncObject_Positive_GetProcAddress) testStep = new CEglTest_SyncObject_Positive_GetProcAddress;
else if (aStepName == KSyncObject_Positive_CreateDestroy) testStep = new CEglTest_SyncObject_Positive_CreateDestroy;
else if (aStepName == KSyncObject_Positive_WaitSignal) testStep = new CEglTest_SyncObject_Positive_WaitSignal;
@@ -101,19 +101,19 @@
else if (aStepName == KCreatePixmapSurface_Alpha_bit_RSgImage) testStep = new CEglTest_CreatePixmapSurface_Alpha_bit_RSgImage;
else if (aStepName == KCreatePixmapSurface_RSgImage_Positive_MantadoryFormatUsageSupport) testStep = new CEglTest_CreatePixmapSurface_RSgImage_Positive_MantadoryFormatUsageSupport;
- // image tests
+ // Image tests
else if (aStepName == KEGL_Image_SgDriverHandle) testStep = new CEglTest_EGL_Image_SgDriverHandle;
else if (aStepName == KEGL_Image_RSgImage_UseOpenVG_PersistImageData) testStep = new CEglTest_EGL_Image_RSgImage_UseOpenVG_PersistImageData;
else if (aStepName == KEGL_Image_Consistent_Linked_List) testStep = new CEglTest_EGL_Image_Consistent_Linked_List;
- // image negative tests
+ // Image negative tests
else if (aStepName == KEGL_Image_eglCreateImage_Bad_Parameter) testStep = new CEglTest_EGL_Image_eglCreateImage_Bad_Parameter;
else if (aStepName == KEGL_Image_UsageBits_Enforcement) testStep = new CEglTest_EGL_Image_UsageBits_Enforcement;
else if (aStepName == KEGL_Image_DestroyImageKHR) testStep = new CEglTest_EGL_Image_DestroyImageKHR;
else if (aStepName == KEGL_Image_VGImage_From_Invalid_EGLHandle) testStep = new CEglTest_EGL_Image_VGImage_From_Invalid_EGLHandle;
else if (aStepName == KEGL_Image_Self_Drawing) testStep = new CEglTest_EGL_Image_Self_Drawing;
- //Siblings tests
+ // Siblings tests
else if (aStepName == KEGL_Image_Sibling_Basic) testStep = new CEglTest_EGL_Image_Sibling_Basic;
else if (aStepName == KEGL_Image_Sibling_VGImage) testStep = new CEglTest_EGL_Image_Sibling_VGImage;
else if (aStepName == KEGL_Image_Sibling_Two_VGImages) testStep = new CEglTest_EGL_Image_Sibling_Two_VGImages;
@@ -122,7 +122,7 @@
else if (aStepName == KEGL_Image_Sibling_VGImage_Child_CheckContents_CloseSgEarlier) testStep = new CEglTest_EGL_Image_Sibling_VGImage_Child_CheckContents_CloseSgEarlier;
else if (aStepName == KEGL_Image_CreatePBufferFromClient_With_Sibling_VGImage) testStep = new CEglTest_EGL_Image_CreatePBufferFromClient_With_Sibling_VGImage;
- //VgImage to surfaces tests
+ // VgImage to surfaces tests
else if (aStepName == KEGL_Image_VgImage_To_Pixmap) testStep = new CEglTest_EGL_Image_VgImage_To_Pixmap;
else if (aStepName == KEGL_Image_VGImage_To_Pixmap_CFbs) testStep = new CEglTest_EGL_Image_VGImage_To_Pixmap_CFbs;
else if (aStepName == KEGL_Image_VgImage_To_pBuffer) testStep = new CEglTest_EGL_Image_VgImage_To_pBuffer;
@@ -146,7 +146,6 @@
else if (aStepName == KEGL_Image_Multi_Process_FontServer_Deferred) testStep = new CEglTest_EGL_Image_Multi_Process_FontServer_Deferred;
else if (aStepName == KEGL_Image_Multi_Process_ThemeServer) testStep = new CEglTest_EGL_Image_Multi_Process_ThemeServer;
else if (aStepName == KEGL_Image_Multi_Process_VgImage_ProcessTerminate) testStep = new CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate;
- else if (aStepName == KEGL_Image_Multi_Process_VgImage_ProcessTerminate2) testStep = new CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminate2;
else if (aStepName == KEGL_Image_Multi_Process_VgImage_ProcessTerminateNegative) testStep = new CEglTest_EGL_Image_Multi_Process_VgImage_ProcessTerminateNegative;
else if (aStepName == KEGL_Image_Multi_Process_VgImage_ReadWrite) testStep = new CEglTest_EGL_Image_Multi_Process_VgImage_ReadWrite;
--- a/fbs/fontandbitmapserver/group/BLD.INF Mon Mar 15 12:45:41 2010 +0200
+++ b/fbs/fontandbitmapserver/group/BLD.INF Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-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"
@@ -48,8 +48,6 @@
../group/FBSERV.MMP
../group/fbsrasterizerlib.mmp
../group/stubrasterizer.mmp
-../group/fbscli_fmm.mmp
-../group/fbserv_fmm.mmp
PRJ_TESTEXPORTS
--- a/fbs/fontandbitmapserver/group/FBSCLI.MMP Mon Mar 15 12:45:41 2010 +0200
+++ b/fbs/fontandbitmapserver/group/FBSCLI.MMP Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-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"
@@ -28,7 +28,6 @@
SOURCEPATH ../sfbs
userinclude ../inc
-userinclude ../../../../textandloc/fontservices/fontstore/src
OS_LAYER_SYSTEMINCLUDE_SYMBIAN
--- a/fbs/fontandbitmapserver/group/fbscli_fmm.mmp Mon Mar 15 12:45:41 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-// Copyright (c) 1998-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:
-// fbscli.dll Font & Bitmap server client-side library
-//
-//
-
-/**
- @file
-*/
-
-target fbscli_fmm.dll
-CAPABILITY All -Tcb
-targettype DLL
-
-UID 0x1000008D 0x10003A15
-VENDORID 0x70000001
-SOURCEPATH ../sfbs
-
-userinclude ../inc
-userinclude ../../../../textandloc/fontservices/fontstore/src
-OS_LAYER_SYSTEMINCLUDE_SYMBIAN
-
-source BITBMP.CPP
-source BITCOMP.CPP
-source BITBMPEX.CPP
-source BMPASTR.CPP
-source BMPUTIL.CPP
-source FBSBMP.CPP
-source FBSFONT.CPP
-source PILE.CPP
-source SESSION.CPP
-source TFSTORE.CPP
-source FbsRalc.cpp
-source fbshelper.cpp
-source ShiftedFileStore.cpp
-source BitmapCompr.cpp
-source patchableconstantscli.cpp
-
-library euser.lib
-library efsrv.lib
-library estor.lib
-library gdi.lib
-library fntstr.lib
-library scdv.lib
-library palette.lib
-library lookuptable.lib
-library hal.lib
-#if !defined(WINS)
-library fbsrasterizer.lib
-#endif
-
-deffile FBSCLI2.DEF
-
-
-START WINS
-BASEADDRESS 0x41400000
-END
-//configurable value to control bitmap heap management by setting
-//large bitmap threshold (requires rebuild)
-MACRO KMaxLargeBitmapAlloc=0x4000
-//MACRO SYMBIAN_DISABLE_HARDWARE_BITMAP_WHITEFILL // Uncomment this macro to disable whitefill of hardware bitmaps on creation
-
-// KCompressionThreshold is used to determine whether a bitmap gets compressed. Values of 0 -> 256 represent 0% to 100%
-// where 0% = no compression. A value of 205 means that bitmaps are only compressed when the resulting size is 80% or
-// less of the original size.
-MACRO KCompressionThreshold=205
-
-MACRO FNTSTORE_SUPPORT_FMM
-
-UNPAGED
-
-
-SMPSAFE
-
--- a/fbs/fontandbitmapserver/group/fbserv.iby Mon Mar 15 12:45:41 2010 +0200
+++ b/fbs/fontandbitmapserver/group/fbserv.iby Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-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"
@@ -47,8 +47,8 @@
#define FBSERV_PAGEDDATA_CONFIG unpageddata
#endif
- file=ABI_DIR\BUILD_DIR\fbserv_fmm.exe \sys\bin\fbserv.exe FBSERV_PAGEDDATA_CONFIG
- file=ABI_DIR\BUILD_DIR\fbscli_fmm.dll \sys\bin\fbscli.dll
+ file=ABI_DIR\BUILD_DIR\fbserv.exe \sys\bin\fbserv.exe FBSERV_PAGEDDATA_CONFIG
+ file=ABI_DIR\BUILD_DIR\fbscli.dll \sys\bin\fbscli.dll
#else
file=ABI_DIR\DEBUG_DIR\fbserv.exe sys\bin\fbserv.exe
file=ABI_DIR\DEBUG_DIR\fbscli.dll sys\bin\fbscli.dll
--- a/fbs/fontandbitmapserver/group/fbserv_fmm.mmp Mon Mar 15 12:45:41 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-// Copyright (c) 1998-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:
-// fbserv.exe Font & Bitmap server
-//
-//
-
-/**
- @file
-*/
-
-// Default stack size(8K) is too small and causes stack overflow
-// in the hardware test udeb
-EPOCSTACKSIZE 16384
-EPOCHEAPSIZE 0x10000 0x200000
-
-target fbserv_fmm.exe
-
-EPOCFIXEDPROCESS
-CAPABILITY ProtServ
-targettype exexp
-
-uid 0x1000008C 0x10003A16
-VENDORID 0x70000001
-
-userinclude ../inc
-userinclude ../sfbs
-userinclude ../../../../textandloc/fontservices/fontstore/src
-
-OS_LAYER_SYSTEMINCLUDE_SYMBIAN
-OS_LAYER_ESTLIB_SYSTEMINCLUDE
-
-sourcepath ../sfbs
-
-source FBSCLI.CPP
-source FBSMAIN.CPP
-source FBSTOP.CPP
-source BackGroundCompression.CPP
-source SERVER.CPP
-source FBSMBMC.CPP
-source ShiftedFileStore.cpp
-source HASHMAP.CPP
-source patchableconstants.cpp
-
-library euser.lib
-library efsrv.lib
-library gdi.lib
-library fntstr.lib
-library fbscli.lib
-library estor.lib
-library ecom.lib
-library hal.lib
-
-start wins
-baseaddress 0x41500000
-end
-
-deffile fbserv.def
-
-MACRO KFBSERVInitialHeapSize=0x10000
-MACRO KFBSERVHeapGrowByMultiplier=4
-MACRO KFBSERVSharedBitmapHashTableSizeInBits=12
-MACRO FNTSTORE_SUPPORT_FMM
-UNPAGEDCODE //Configure data paging via fbserv.iby
-
-
-SMPSAFE
--- a/fbs/fontandbitmapserver/sfbs/FBSCLI.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/fbs/fontandbitmapserver/sfbs/FBSCLI.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-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"
@@ -35,7 +35,7 @@
{
if (aAny && aHeapBase)
{
- return (TInt)aAny - (TInt)aHeapBase;
+ return reinterpret_cast<TInt>(aAny) - aHeapBase;
}
return 0;
}
@@ -47,11 +47,11 @@
@return A pointer relative to the passed heap base.
@see PointerToOffset()
*/
-LOCAL_C TAny* OffsetToPointer(const TInt aOffset, TInt aHeapBase)
+LOCAL_C TAny* OffsetToPointer(TInt aOffset, TInt aHeapBase)
{
if (aOffset && aHeapBase)
{
- return (TAny*)(aOffset + (TInt)aHeapBase);
+ return reinterpret_cast<TAny*>(aOffset + aHeapBase);
}
return NULL;
}
--- a/fbs/fontandbitmapserver/sfbs/FBSFONT.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/fbs/fontandbitmapserver/sfbs/FBSFONT.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-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"
@@ -38,7 +38,7 @@
{
if (aAny && aHeapBase)
{
- return (TInt)aAny - (TInt)aHeapBase;
+ return reinterpret_cast<TInt>(aAny) - reinterpret_cast<TInt>(aHeapBase);
}
return 0;
}
@@ -50,11 +50,11 @@
@return A pointer relative to the passed heap base.
@see PointerToOffset()
*/
-LOCAL_C TAny* OffsetToPointer(const TInt aOffset, TUint8* aHeapBase)
+LOCAL_C TAny* OffsetToPointer(TInt aOffset, TUint8* aHeapBase)
{
if (aOffset && aHeapBase)
{
- return (TAny*)(aOffset + (TInt)aHeapBase);
+ return reinterpret_cast<TAny*>(aOffset + reinterpret_cast<TInt>(aHeapBase));
}
return NULL;
}
@@ -469,10 +469,10 @@
{
// Translate the offsets sent to the server back to pointers relative to
// the heap base of the current process
- const TOpenFontCharMetrics* temp = (const TOpenFontCharMetrics*)OffsetToPointer(paramsBuf().iMetricsOffset, iFbs->HeapBase());
- if (temp)
+ const TOpenFontCharMetrics* metrics = (const TOpenFontCharMetrics*)OffsetToPointer(paramsBuf().iMetricsOffset, iFbs->HeapBase());
+ if (metrics)
{
- aMetrics = *temp;
+ aMetrics = *metrics;
}
aBitmap = static_cast<TUint8*>(OffsetToPointer(paramsBuf().iBitmapPointerOffset, iFbs->HeapBase()));
}
@@ -587,7 +587,7 @@
EXPORT_C TBool CFbsFont::HasCharacter(TInt aCode) const
{
if (iHandle)
- {
+ {
return iFbs->SendCommand(EFbsMessHasCharacter,iHandle,aCode);
}
return EFalse;
@@ -621,7 +621,7 @@
/** help DoExtendedFunction to perform KFontDeleteShaping function
@param aParam Input parameter block
-@return KErrNone if successful, KErrBadHandle if the font does not have a valid handle.
+@return KErrNone if successful, KErrGeneral if the font does not have a valid handle.
*/
TInt CFbsFont::DoFontDeleteShaping(TFontShapeDeleteFunctionParameters* aParam) const
{
@@ -677,3 +677,4 @@
}
return CFont::DoExtendedFunction(aFunctionId, aParam);
}
+
--- a/fbs/fontandbitmapserver/tfbs/TFBS.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/fbs/fontandbitmapserver/tfbs/TFBS.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-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"
@@ -84,7 +84,7 @@
void CTFbs::ConstructL()
{
ExpandCleanupStackL();
-
+ User::LeaveIfError(Logger().ShareAuto());
TestConstruction();
AllocScanLineBuf();
@@ -2145,6 +2145,8 @@
are the same, thereby avoiding any unneccessary IPC calls.
@SYMTestActions
+ Try to open a global semaphore called "FBSSessionCacheSemaphore" (this is a temporary measure to
+ ensure successful propagation of ou1cimx1#250526).
Create a large font which consumes a lot of memory.
Create a CFbsBitGc and a CFbsBitmap target.
Use the CFbsBitGc to render some text, thereby filling the font glyph cache.
@@ -2156,6 +2158,7 @@
returned from CBitmapFont::GetCharacterData().
@SYMTestExpectedResults
+ No global semaphore called "FBSSessionCacheSemaphore" should exist.
When using KNullHandle, CharacterNeedsToBeRasterized() with the first character, is expected to pass
proving that the font cache is working as expected when glyphs can fit into it.
When using KNullHandle, CharacterNeedsToBeRasterized() with the last character, it expected to fail,
@@ -2172,6 +2175,11 @@
{
INFO_PRINTF1(_L("Test Font Session-cache Lookup"));
+ // Make sure the global semaphore is gone for good
+ _LIT(KSessionCacheSemaphoreName, "FBSSessionCacheSemaphore");
+ RSemaphore sem;
+ TEST(sem.OpenGlobal(KSessionCacheSemaphoreName) == KErrNotFound);
+
User::LeaveIfError(RFbsSession::Connect());
RFbsSession* fbsSession = RFbsSession::GetSession();
CFbsTypefaceStore* ts = CFbsTypefaceStore::NewL(NULL);
@@ -2273,170 +2281,96 @@
TEST(KErrNone == iFbs->SendCommand(EFbsMessSetTwipsHeight, fontHandle, 49));
// In a second thread, send a IPC command to set the font's height with the
// bitmap's handle. Should panic with FBServ -6.
- TFbsTestThreadInfo threadInfo = {EFbsSecondThreadInvalidHandleInIpcCall};
- TExitCategoryName exitCategoryName(KFbsPanicCategory);
_LIT(KTestName, "TestInvalidHandlesInIpcCall");
- CreateSecondThreadAndCheckPanicL(threadInfo, -6, exitCategoryName, KTestName);
+ CreateSecondThreadAndCheckPanicL(SecondThreadPanicInvalidHandleInIpcCallL, KErrArgument, KFbsPanicCategory, KTestName);
iTs->ReleaseFont(font);
delete bmp;
}
/**
-Creates a second thread and do some panic tests in it.
-@param aTestInfo The information for the tests
-@param aPanicCode The expected panic code
-@param aExitCategory The expected panic category
-@param aThreadName The name of the new thread
-@leave Gets system wide error code
+Second thread function for test GRAPHICS-FBSERV-0650. It should panic with FBSERV -6 if the test is successful.
+ */
+void CTFbs::SecondThreadPanicInvalidHandleInIpcCallL()
+ {
+ User::LeaveIfError(RFbsSession::Connect());
+ RFbsSession* fbs = RFbsSession::GetSession();
+ CFbsBitmapEx* bmp = new(ELeave) CFbsBitmapEx();
+ CleanupStack::PushL(bmp);
+ User::LeaveIfError(bmp->Create(TSize(1,1), EGray2));
+ CFbsTypefaceStore* ts = CFbsTypefaceStore::NewL(NULL);
+ CleanupStack::PushL(ts);
+ CFbsFont* font=NULL;
+ User::LeaveIfError(ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KTypefaceName, 15)));
+ TInt bitmapHandle = bmp->BitmapHandle();
+
+ // Send a IPC command to set twips height of font with a bitmap handle
+ (void)fbs->SendCommand(EFbsMessSetTwipsHeight, bitmapHandle, 49);
+
+ ts->ReleaseFont(font);
+ CleanupStack::PopAndDestroy(2);
+ RFbsSession::Disconnect();
+ }
+
+
+struct TFbsTestDelegator
+ {
+ CTFbs* iTestBase;
+ void (CTFbs::*iMethodPtr)();
+ };
+
+/**
+Creates a second thread and checks that it panics.
+@param aMethodL The leaving method of CTFbs that the second thread is going to execute.
+@param aPanicCode The expected panic code.
+@param aPanicCategory The expected panic category.
+@param aThreadName The name of the new thread.
*/
-void CTFbs::CreateSecondThreadAndCheckPanicL(TFbsTestThreadInfo& aTestInfo, TInt aPanicCode, TExitCategoryName aExitCategory, const TDesC &aThreadName)
+void CTFbs::CreateSecondThreadAndCheckPanicL(void (CTFbs::*aMethodL)(), TInt aPanicCode, const TDesC& aPanicCategory, const TDesC& aThreadName)
{
RThread secondThread;
- User::LeaveIfError(secondThread.Create(aThreadName, SecondThreadStart, KDefaultStackSize, 0x1000, 0x1000, &aTestInfo));
+ TFbsTestDelegator delegator;
+ delegator.iTestBase = this;
+ delegator.iMethodPtr = aMethodL;
+ User::LeaveIfError(secondThread.Create(aThreadName, MethodDelegatorThreadFunction, KDefaultStackSize, 0x1000, 0x1000, &delegator));
// Launch second thread
TRequestStatus statusSecondThread;
secondThread.Logon(statusSecondThread);
- secondThread.SetPriority(EPriorityLess);
- secondThread.Resume();
-
+ secondThread.Resume();
+ // Wait until second thread is finished
User::WaitForRequest(statusSecondThread);
-
- if(EExitPanic != secondThread.ExitType())
+ // Check results
+ if (EExitPanic != secondThread.ExitType())
{
- ERR_PRINTF3(_L("Expected exit type: %d, Actual exit type: %d"), EExitPanic, secondThread.ExitType());
+ ERR_PRINTF2(_L("Expected exit type: EExitPanic, actual exit type: %d"), secondThread.ExitType());
TEST(EFalse);
}
-
- if(aPanicCode != secondThread.ExitReason())
+ if (aPanicCode != secondThread.ExitReason())
{
- ERR_PRINTF3(_L("Expected panic code: %d, Actual panic code: %d"), aPanicCode, secondThread.ExitReason());
+ ERR_PRINTF3(_L("Expected exit reason: %d, actual exit reason: %d"), aPanicCode, secondThread.ExitReason());
TEST(EFalse);
}
-
TExitCategoryName secondThreadExitCategory = secondThread.ExitCategory();
- if(aExitCategory != secondThreadExitCategory)
+ if (aPanicCategory != secondThreadExitCategory)
{
- ERR_PRINTF3(_L("Expected panic category: %S, Actual panic category: %S"), &aExitCategory, &secondThreadExitCategory);
+ ERR_PRINTF3(_L("Expected exit category: %S, actual exit category: %S"), &aPanicCategory, &secondThreadExitCategory);
TEST(EFalse);
}
-
- //Close the handle
+ // Dispose of the remains of the second thread
secondThread.Close();
}
-/**
-Second thread entry function.
-*/
-TInt CTFbs::SecondThreadStart(TAny* aTestInfo)
+TInt CTFbs::MethodDelegatorThreadFunction(TAny* aDelegator)
{
-
- __UHEAP_MARK;
- TInt procHandles1 =0;
- TInt threadHandles1=0;
- RThread().HandleCount(procHandles1, threadHandles1);
CTrapCleanup* cleanupStack = CTrapCleanup::New();
-
if (!cleanupStack)
{
- __UHEAP_MARKEND;
return KErrNoMemory;
}
-
- TInt result = KErrNone;
- TRAP(result, SecondThreadMainL(static_cast<TFbsTestThreadInfo*>(aTestInfo)));
-
+ TFbsTestDelegator* delegator = static_cast<TFbsTestDelegator*>(aDelegator);
+ TRAPD(err, (delegator->iTestBase->*delegator->iMethodPtr)());
delete cleanupStack;
-
- TInt procHandles2 =0;
- TInt threadHandles2=0;
- RThread().HandleCount(procHandles2,threadHandles2);
- if (threadHandles1 != threadHandles2)
- {
- result = KErrGeneral; // Thread-owned handles not closed
- }
- __UHEAP_MARKEND;
-
- return result;
- }
-
-/**
-Run the test contained within the TFbsTestThreadInfo object. A new thread is
-created for each test and only one of the cases in the switch statements
-below will be used.
-
-@param aTestInfo The parameters for the test
-@return One of the system wide error codes or an enumeration of passed tests.
- */
-TInt CTFbs::SecondThreadMainL(TFbsTestThreadInfo* aTestInfo)
- {
- TInt result = 0;
- TFbsMultiThreadTestCase testcase = aTestInfo->iTestCase;
-
- //test cases without the need of an initialised driver
- switch (testcase)
- {
- case EFbsSecondThreadInvalidHandleInIpcCall:
- result = SecondThreadPanicInvalidHandleInIpcCall();
- break;
- }
- return result;
- }
-
-/**
-Implementation of SecondThread test EFbsSecondThreadInvalidHandleInIpcCall
-
-@panic FBSERV -6 If the test is successful
-
-@return One of the system wide error codes.
- */
-TInt CTFbs::SecondThreadPanicInvalidHandleInIpcCall()
- {
- TInt result = RFbsSession::Connect();
- if (KErrNone != result)
- {
- return result;
- }
- RFbsSession* fbs = RFbsSession::GetSession();
- CFbsBitmapEx* bmp = new CFbsBitmapEx();
- if (!bmp)
- {
- return KErrGeneral;
- }
- result = bmp->Create(TSize(1,1),EGray2);
- if(KErrNone != result)
- {
- delete bmp;
- return KErrGeneral;
- }
-
- CFbsTypefaceStore* ts = NULL;
- ts = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL);
- if (!ts)
- {
- delete bmp;
- return KErrGeneral;
- }
-
- CFbsFontEx* font=NULL;
- result = ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KTypefaceName, 15));
- if (!font)
- {
- delete bmp;
- delete ts;
- return KErrGeneral;
- }
-
- TInt fontHandle = font->FontHandle();
- TInt bitmapHandle = bmp->BitmapHandle();
-
- // Send a IPC command to set twips height of font with a bitmap handle
- result = fbs->SendCommand(EFbsMessSetTwipsHeight, bitmapHandle, 49);
-
- ts->ReleaseFont(font);
- delete bmp;
- delete ts;
- return result;
+ return err;
}
/**
--- a/fbs/fontandbitmapserver/tfbs/TFBS.H Mon Mar 15 12:45:41 2010 +0200
+++ b/fbs/fontandbitmapserver/tfbs/TFBS.H Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1995-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"
@@ -20,7 +20,6 @@
#include <gdi.h>
#include <test/fontinjector.h>
#include <test/TGraphicsHarness.h>
-#include "tfbsmultithread.h"
_LIT(KTempFilename,"c:\\temp.mbm");
_LIT(KTestBitmapOnZ,"z:\\system\\data\\tfbs.mbm");
@@ -138,10 +137,9 @@
TInt LoadOpenFontLibraries();
TBool CheckTypefacesSupport(const TTypefaceSupport& aInfo1, const TTypefaceSupport& aInfo2);
void LoadFontsL(const TDesC& aFontsDir);
- void CreateSecondThreadAndCheckPanicL(TFbsTestThreadInfo& aTestCase, TInt aPanicCode, TExitCategoryName aExitCategory, const TDesC &aThreadName);
- static TInt SecondThreadStart(TAny* aTestInfo);
- static TInt SecondThreadMainL(TFbsTestThreadInfo* aTestInfo);
- static TInt SecondThreadPanicInvalidHandleInIpcCall();
+ void SecondThreadPanicInvalidHandleInIpcCallL();
+ void CreateSecondThreadAndCheckPanicL(void (CTFbs::*aMethodL)(), TInt aPanicCode, const TDesC& aPanicCategory, const TDesC &aThreadName);
+ static TInt MethodDelegatorThreadFunction(TAny* aDelegator);
private:
TInt iHandle;
--- a/fbs/fontandbitmapserver/tfbs/tfbsmultithread.h Mon Mar 15 12:45:41 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-// 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:
-//
-
-#ifndef TFBSMULTITHREAD_H
-#define TFBSMULTITHREAD_H
-
-/**
-* Enums for passing between the test thread and the second thead used in testing,
-* used to define which test should be run on the second thread.
-*/
-enum TFbsMultiThreadTestCase
- {
- EFbsSecondThreadInvalidHandleInIpcCall,
- };
-
-/**
- * Class for passing test info to other threads.
- */
-struct TFbsTestThreadInfo
- {
- TFbsMultiThreadTestCase iTestCase;
- };
-
-#endif // TFBSMULTITHREAD_H
--- a/graphicsdeviceinterface/gdi/bwins/GDI2U.def Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/gdi/bwins/GDI2U.def Wed Mar 31 23:34:07 2010 +0300
@@ -290,4 +290,34 @@
?DrawTextVertical@CGraphicsContext@@QAEXABVTDesC16@@PBVTTextParameters@1@ABVTPoint@@H@Z @ 289 NONAME ; void CGraphicsContext::DrawTextVertical(class TDesC16 const &, class CGraphicsContext::TTextParameters const *, class TPoint const &, int)
?DrawTextVertical@CGraphicsContext@@QAEXABVTDesC16@@PBVTTextParameters@1@ABVTRect@@HHW4TTextAlign@1@H@Z @ 290 NONAME ; void CGraphicsContext::DrawTextVertical(class TDesC16 const &, class CGraphicsContext::TTextParameters const *, class TRect const &, int, int, enum CGraphicsContext::TTextAlign, int)
?TextWidthInPixels@CFont@@QBEHABVTDesC16@@PBVTMeasureTextInput@1@@Z @ 291 NONAME ; int CFont::TextWidthInPixels(class TDesC16 const &, class CFont::TMeasureTextInput const *) const
+ ?Open@RFontTable@@QAEHAAVCFont@@K@Z @ 292 NONAME ABSENT ; int RFontTable::Open(class CFont &, unsigned long)
+ ?Next@RGlyphOutlineIterator@@QAEHXZ @ 293 NONAME ABSENT ; int RGlyphOutlineIterator::Next(void)
+ ?TableLength@RFontTable@@QBEHXZ @ 294 NONAME ABSENT ; int RFontTable::TableLength(void) const
+ ?OutlineLength@RGlyphOutlineIterator@@QBEHXZ @ 295 NONAME ABSENT ; int RGlyphOutlineIterator::OutlineLength(void) const
+ ?Outline@RGlyphOutlineIterator@@QBEPBEXZ @ 296 NONAME ABSENT ; unsigned char const * RGlyphOutlineIterator::Outline(void) const
+ ?TableContent@RFontTable@@QBEPBEXZ @ 297 NONAME ABSENT ; unsigned char const * RFontTable::TableContent(void) const
+ ?Close@RGlyphOutlineIterator@@QAEXXZ @ 298 NONAME ABSENT ; void RGlyphOutlineIterator::Close(void)
+ ?Close@RFontTable@@QAEXXZ @ 299 NONAME ABSENT ; void RFontTable::Close(void)
+ ??0RGlyphOutlineIterator@@QAE@XZ @ 300 NONAME ABSENT ; RGlyphOutlineIterator::RGlyphOutlineIterator(void)
+ ?Open@RGlyphOutlineIterator@@QAEHAAVCFont@@PAIHH@Z @ 301 NONAME ABSENT ; int RGlyphOutlineIterator::Open(class CFont &, unsigned int *, int, int)
+ ??0RFontTable@@QAE@XZ @ 302 NONAME ABSENT ; RFontTable::RFontTable(void)
+ ?Image@RGlyphDataIterator@@QBEABVRSgImage@@XZ @ 303 NONAME ABSENT ; class RSgImage const & RGlyphDataIterator::Image(void) const
+ ??0RGlyphMetricsArray@@QAE@XZ @ 304 NONAME ABSENT ; RGlyphMetricsArray::RGlyphMetricsArray(void)
+ ?Count@RGlyphMetricsArray@@QBEHXZ @ 305 NONAME ABSENT ; int RGlyphMetricsArray::Count(void) const
+ ?Metrics@RGlyphDataIterator@@QBEABVTOpenFontCharMetrics@@XZ @ 306 NONAME ABSENT ; class TOpenFontCharMetrics const & RGlyphDataIterator::Metrics(void) const
+ ??0RGlyphDataIterator@@QAE@XZ @ 307 NONAME ABSENT ; RGlyphDataIterator::RGlyphDataIterator(void)
+ ??ARGlyphMetricsArray@@QBEABVTOpenFontCharMetrics@@H@Z @ 308 NONAME ABSENT ; class TOpenFontCharMetrics const & RGlyphMetricsArray::operator[](int) const
+ ?GlyphCode@RGlyphDataIterator@@QBEIXZ @ 309 NONAME ABSENT ; unsigned int RGlyphDataIterator::GlyphCode(void) const
+ ?Rect@RGlyphDataIterator@@QBEABVTRect@@XZ @ 310 NONAME ABSENT ; class TRect const & RGlyphDataIterator::Rect(void) const
+ ?Next@RGlyphDataIterator@@QAEHXZ @ 311 NONAME ABSENT ; int RGlyphDataIterator::Next(void)
+ ?Close@RGlyphMetricsArray@@QAEXXZ @ 312 NONAME ABSENT ; void RGlyphMetricsArray::Close(void)
+ ?Get@RGlyphMetricsArray@@QAEHAAVCFont@@PBIH@Z @ 313 NONAME ABSENT ; int RGlyphMetricsArray::Get(class CFont &, unsigned int const *, int)
+ ?Close@RGlyphDataIterator@@QAEXXZ @ 314 NONAME ABSENT ; void RGlyphDataIterator::Close(void)
+ ?Open@RGlyphDataIterator@@QAEHAAVCFont@@PBIH@Z @ 315 NONAME ABSENT ; int RGlyphDataIterator::Open(class CFont &, unsigned int const *, int)
+ ?SetName@TTypeface@@QAEXABVTDesC16@@@Z @ 316 NONAME ; void TTypeface::SetName(class TDesC16 const &)
+ ?Name@TTypeface@@QBEABVTDesC16@@XZ @ 317 NONAME ; class TDesC16 const & TTypeface::Name(void) const
+ ?At@RHexTreeBase@@IBEPAXI@Z @ 318 NONAME ; void * RHexTreeBase::At(unsigned int) const
+ ??0RHexTreeBase@@IAE@PAVRHeap@@@Z @ 319 NONAME ; RHexTreeBase::RHexTreeBase(class RHeap *)
+ ?SetAt@RHexTreeBase@@IAEHIPAX@Z @ 320 NONAME ; int RHexTreeBase::SetAt(unsigned int, void *)
+ ?ResetAndDestroy@RHexTreeBase@@QAEXXZ @ 321 NONAME ; void RHexTreeBase::ResetAndDestroy(void)
--- a/graphicsdeviceinterface/gdi/eabi/GDI2U.def Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/gdi/eabi/GDI2U.def Wed Mar 31 23:34:07 2010 +0300
@@ -361,4 +361,39 @@
_ZN16CGraphicsContext8DrawTextERK7TDesC16PKNS_15TTextParametersERK6TPoint @ 360 NONAME
_ZN16CGraphicsContext8DrawTextERK7TDesC16PKNS_15TTextParametersERK6TPointRKNS_14TDrawTextParamE @ 361 NONAME
_ZNK5CFont17TextWidthInPixelsERK7TDesC16PKNS_17TMeasureTextInputE @ 362 NONAME
+ _ZN10RFontTable4OpenER5CFontm @ 363 NONAME ABSENT
+ _ZN10RFontTable5CloseEv @ 364 NONAME ABSENT
+ _ZN10RFontTableC1Ev @ 365 NONAME ABSENT
+ _ZN10RFontTableC2Ev @ 366 NONAME ABSENT
+ _ZN21RGlyphOutlineIterator4NextEv @ 367 NONAME ABSENT
+ _ZN21RGlyphOutlineIterator4OpenER5CFontPjii @ 368 NONAME ABSENT
+ _ZN21RGlyphOutlineIterator5CloseEv @ 369 NONAME ABSENT
+ _ZN21RGlyphOutlineIteratorC1Ev @ 370 NONAME ABSENT
+ _ZN21RGlyphOutlineIteratorC2Ev @ 371 NONAME ABSENT
+ _ZNK10RFontTable11TableLengthEv @ 372 NONAME ABSENT
+ _ZNK10RFontTable12TableContentEv @ 373 NONAME ABSENT
+ _ZNK21RGlyphOutlineIterator13OutlineLengthEv @ 374 NONAME ABSENT
+ _ZNK21RGlyphOutlineIterator7OutlineEv @ 375 NONAME ABSENT
+ _ZN18RGlyphDataIterator4NextEv @ 376 NONAME ABSENT
+ _ZN18RGlyphDataIterator4OpenER5CFontPKji @ 377 NONAME ABSENT
+ _ZN18RGlyphDataIterator5CloseEv @ 378 NONAME ABSENT
+ _ZN18RGlyphDataIteratorC1Ev @ 379 NONAME ABSENT
+ _ZN18RGlyphDataIteratorC2Ev @ 380 NONAME ABSENT
+ _ZN18RGlyphMetricsArray3GetER5CFontPKji @ 381 NONAME ABSENT
+ _ZN18RGlyphMetricsArray5CloseEv @ 382 NONAME ABSENT
+ _ZN18RGlyphMetricsArrayC1Ev @ 383 NONAME ABSENT
+ _ZN18RGlyphMetricsArrayC2Ev @ 384 NONAME ABSENT
+ _ZNK18RGlyphDataIterator4RectEv @ 385 NONAME ABSENT
+ _ZNK18RGlyphDataIterator5ImageEv @ 386 NONAME ABSENT
+ _ZNK18RGlyphDataIterator7MetricsEv @ 387 NONAME ABSENT
+ _ZNK18RGlyphDataIterator9GlyphCodeEv @ 388 NONAME ABSENT
+ _ZNK18RGlyphMetricsArray5CountEv @ 389 NONAME ABSENT
+ _ZNK18RGlyphMetricsArrayixEi @ 390 NONAME ABSENT
+ _ZN9TTypeface7SetNameERK7TDesC16 @ 391 NONAME
+ _ZNK9TTypeface4NameEv @ 392 NONAME
+ _ZN12RHexTreeBase15ResetAndDestroyEv @ 393 NONAME
+ _ZN12RHexTreeBase5SetAtEjPv @ 394 NONAME
+ _ZN12RHexTreeBaseC1EP5RHeap @ 395 NONAME
+ _ZN12RHexTreeBaseC2EP5RHeap @ 396 NONAME
+ _ZNK12RHexTreeBase2AtEj @ 397 NONAME
--- a/graphicsdeviceinterface/gdi/group/BLD.INF Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/gdi/group/BLD.INF Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1999-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"
@@ -45,6 +45,9 @@
../inc/gdiconsts.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/gdi/gdiconsts.h)
../inc/gdiinline.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(graphics/gdi/gdiinline.inl)
+../inc/hextree.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(hextree.h)
+../inc/hextree.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(hextree.inl)
+
../group/gdi.iby /epoc32/rom/include/gdi.iby
--- a/graphicsdeviceinterface/gdi/group/GDI.MMP Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/gdi/group/GDI.MMP Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-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"
@@ -53,6 +53,7 @@
SOURCE FontIndic.cpp
SOURCE ShaperCli.cpp
SOURCE GDI.CPP
+SOURCE hextree.cpp
LIBRARY euser.lib
LIBRARY efsrv.lib
--- a/graphicsdeviceinterface/gdi/inc/GDI.H Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/gdi/inc/GDI.H Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-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"
@@ -140,7 +140,12 @@
/** Insufficient text for successful completion of the method */
EGdiPanic_OutOfText = 2,
/** Internal failure. */
- EGdiPanic_Invariant = 3
+ EGdiPanic_Invariant = 3,
+ /** Reserved panic codes. Not to be used. */
+ EGdiPanic_Reserved1 = 4,
+ EGdiPanic_Reserved2 = 5,
+ /** Setting a typeface name that is too long */
+ EGdiPanic_TypefaceNameOverflow = 6,
};
@@ -560,6 +565,8 @@
IMPORT_C void SetScriptTypeForMetrics(TLanguage aLanguage);
IMPORT_C void SetScriptTypeForMetrics(TInt aScript);
IMPORT_C TInt ScriptTypeForMetrics() const;
+ IMPORT_C void SetName(const TDesC& aName);
+ IMPORT_C const TDesC& Name() const;
private:
void ResetAttributes();
void ResetScriptType();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/gdi/inc/hextree.h Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,74 @@
+// 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:
+// Hexadecimal trees - declaration
+//
+
+#ifndef HEXTREE_H
+#define HEXTREE_H
+
+#include <e32std.h>
+
+/**
+Base class that provides the implementation for RHexTree, which is just a thin
+template.
+
+An instance of this class can have up to eight 16-way prefix trees, with heights
+from 1 to 8. All the values are stored in the leaves. To find a value from a
+32-bit key, first the key is decomposed into 8 hexadecimal digits and then the
+prefix tree with height matching the number of digits in the key (ignoring zeros
+to the left) is traversed using the sequence of digits in the key as the
+indexing string. Offsets are internally used instead of pointers to allow
+instances to be placed in a heap shared between several processes.
+*/
+class RHexTreeBase
+ {
+public:
+ IMPORT_C void ResetAndDestroy();
+protected:
+ IMPORT_C RHexTreeBase(RHeap* aHeap);
+ IMPORT_C TInt SetAt(TUint aKey, TAny* aValue);
+ IMPORT_C TAny* At(TUint aKey) const;
+private:
+ TInt SetAt(TUint aKey, TAny* aLeaf, TInt aHeight);
+ TInt SetAt(TUint aKey, TAny* aLeaf, TInt aHeight, TAny* aNode, TInt aLevel);
+ TAny* At(TUint aKey, TInt aHeight) const;
+ void ResetAndDestroy(TInt aHeight, TAny* aNode, TInt aLevel);
+private:
+ enum { EMaxNumHexDigits = 8 };
+private:
+ RHeap* iHeap;
+ TInt iRootOffsets[EMaxNumHexDigits];
+ };
+
+/**
+An associative array implementation optimised for the case where the keys are
+32-bit codes with spatial locality of reference. The values can be of any
+self-contained data type (that is, without destructor or clean-up functions).
+It allows multiple-readers, single-writer concurrent access from different
+processes in an SMP-safe manner without locking, excluding deletion of
+individual key-value pairs.
+*/
+template<class T>
+class RHexTree : public RHexTreeBase
+ {
+public:
+ inline RHexTree(RHeap* aHeap);
+ inline TInt SetAt(TUint aKey, T* aValue);
+ inline const T* At(TUint aKey) const;
+ inline T* At(TUint aKey);
+ };
+
+#include <hextree.inl>
+
+#endif // HEXTREE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/gdi/inc/hextree.inl Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,83 @@
+// 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:
+// Hexadecimal trees - inline functions
+//
+
+#ifndef HEXTREE_INL
+#define HEXTREE_INL
+
+/**
+Constructor. It constructs an associative array with no key-value pairs.
+
+@param aHeap A pointer to the heap to be used by the associative array
+ implementation to allocate memory for internal data structures. This
+ heap can be shared between several processes.
+*/
+template<class T>
+inline RHexTree<T>::RHexTree(RHeap* aHeap)
+ : RHexTreeBase(aHeap)
+ {
+ }
+
+/**
+Adds a key-value pair to this associative array.
+
+@param aKey The 32-bit key to add to this associative array.
+@param aValue A pointer to the value to associate with aKey. It must have been
+ allocated on the same heap as the one used by the associative array
+ implementation to allocate memory for internal data structures. Ownership
+ is transferred to this associative array.
+@return KErrNone if the key-value pair was added successfully. KErrNoMemory if
+ there was not enough memory in the heap for internal data structures.
+ KErrAlreadyExists if an attempt was made to add a duplicate key.
+*/
+template<class T>
+inline TInt RHexTree<T>::SetAt(TUint aKey, T* aValue)
+ {
+ return RHexTreeBase::SetAt(aKey, aValue);
+ }
+
+/**
+Looks up a given key in this associative array and returns a pointer to the
+corresponding value.
+
+@param aKey The 32-bit key to look up.
+@return A pointer to the corresponding value in this associative array, if the
+ given key was found. The value may not be modified via this pointer.
+ NULL if the given key was not found.
+*/
+template<class T>
+inline const T* RHexTree<T>::At(TUint aKey) const
+ {
+ return static_cast<T*>(RHexTreeBase::At(aKey));
+ }
+
+/**
+Looks up a given key in this associative array and returns a pointer to the
+corresponding value. Note that if values are modified after being added to an
+associative array, then the user is responsible for synchronisation when
+concurrent access is needed.
+
+@param aKey The 32-bit key to look up.
+@return A pointer to the corresponding value in this associative array, if the
+ given key was found. The value may be modified via this pointer.
+ NULL if the given key was not found.
+*/
+template<class T>
+inline T* RHexTree<T>::At(TUint aKey)
+ {
+ return static_cast<T*>(RHexTreeBase::At(aKey));
+ }
+
+#endif // HEXTREE_INL
--- a/graphicsdeviceinterface/gdi/sgdi/FONT.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/gdi/sgdi/FONT.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-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"
@@ -345,10 +345,13 @@
The object's font style is set to the default: EPostureUpright, EStrokeWeightNormal,
and EPrintPosNormal.
-@param aTypefaceName The name of the typeface (e.g. "Roman").
-@param aHeight The height of the typeface, in twips. */
+@param aTypefaceName The name of the typeface (e.g. "Roman"). It should be no
+ longer than KMaxTypefaceNameLength characters in length.
+@param aHeight The height of the typeface, in twips.
+@panic GDI 6, if aTypefaceName is more than KMaxTypefaceNameLength characters long.
+*/
{
- iTypeface.iName=aTypefaceName;
+ iTypeface.SetName(aTypefaceName);
}
@@ -605,6 +608,29 @@
return (KTTypefaceMaskScript & iFlags) >> KTTypefaceBitsNumAttrib;
}
+/**
+Sets the name of the typeface. This method should be used rather than
+directly accessing the iName public member.
+@param aName The name of the typeface (e.g. "Roman"). It should be no
+ longer than KMaxTypefaceNameLength characters in length.
+@panic GDI 6, if aName is more than KMaxTypefaceNameLength characters
+ long.
+*/
+EXPORT_C void TTypeface::SetName(const TDesC& aName)
+ {
+ GDI_ASSERT_ALWAYS(aName.Length() <= KMaxTypefaceNameLength, EGdiPanic_TypefaceNameOverflow);
+ iName=aName;
+ }
+
+/**
+Returns the name of the typeface.
+@return The name of the typeface.
+*/
+EXPORT_C const TDesC& TTypeface::Name() const
+ {
+ return iName;
+ }
+
//
// CFont
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/gdi/sgdi/hextree.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,195 @@
+// 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:
+// Hexadecimal trees - implementation
+//
+
+#include <hextree.h>
+#include <e32atomics.h>
+
+EXPORT_C RHexTreeBase::RHexTreeBase(RHeap* aHeap)
+ : iHeap(aHeap)
+ {
+ Mem::FillZ(iRootOffsets, sizeof(iRootOffsets));
+ }
+
+EXPORT_C TInt RHexTreeBase::SetAt(TUint aKey, TAny* aValue)
+ {
+ TUint mask = 0xF0000000;
+ for (TInt height = EMaxNumHexDigits; height > 1; --height)
+ {
+ if ((aKey & mask) != 0)
+ {
+ return SetAt(aKey, aValue, height);
+ }
+ mask >>= 4;
+ }
+ return SetAt(aKey, aValue, 1);
+ }
+
+EXPORT_C TAny* RHexTreeBase::At(TUint aKey) const
+ {
+ TUint mask = 0xF0000000;
+ for (TInt height = EMaxNumHexDigits; height > 1; --height)
+ {
+ if ((aKey & mask) != 0)
+ {
+ return At(aKey, height);
+ }
+ mask >>= 4;
+ }
+ return At(aKey, 1);
+ }
+
+/**
+Empties this associative array and frees all memory allocated both for the
+associative array implementation and for the values that have been added to
+this associative array.
+
+The internal state of this associative array is reset so that it can be reused
+or allowed to go out of scope after a call to this function.
+*/
+EXPORT_C void RHexTreeBase::ResetAndDestroy()
+ {
+ for (TInt height = 1; height <= EMaxNumHexDigits; ++height)
+ {
+ TInt offset = iRootOffsets[height - 1];
+ if (offset != 0)
+ {
+ TAny* root = PtrAdd(this, offset);
+ ResetAndDestroy(height, root, 1);
+ iRootOffsets[height - 1] = 0;
+ }
+ }
+ }
+
+TInt RHexTreeBase::SetAt(TUint aKey, TAny* aLeaf, TInt aHeight)
+ {
+ TInt err;
+ TInt offset = iRootOffsets[aHeight - 1];
+ if (offset == 0)
+ {
+ TAny* root = iHeap->AllocZ(aHeight > 1 ? sizeof(TInt) * 15 : sizeof(TInt) * 16);
+ if (!root)
+ {
+ return KErrNoMemory;
+ }
+ err = SetAt(aKey, aLeaf, aHeight, root, 1);
+ if (err == KErrNone)
+ {
+ __e32_atomic_store_rel32(&iRootOffsets[aHeight - 1], reinterpret_cast<TInt>(root) - reinterpret_cast<TInt>(this));
+ }
+ else
+ {
+ iHeap->Free(root);
+ }
+ }
+ else
+ {
+ TAny* root = PtrAdd(this, offset);
+ err = SetAt(aKey, aLeaf, aHeight, root, 1);
+ }
+ return err;
+ }
+
+TInt RHexTreeBase::SetAt(TUint aKey, TAny* aLeaf, TInt aHeight, TAny* aNode, TInt aLevel)
+ {
+ TInt err = KErrNone;
+ TInt branch = (aKey >> ((aHeight - aLevel) << 2)) & 0xF;
+ if (aLevel == 1 && aHeight > 1)
+ {
+ --branch;
+ }
+ TInt offset = static_cast<TInt*>(aNode)[branch];
+ if (aLevel == aHeight)
+ {
+ if (offset == 0)
+ {
+ __e32_atomic_store_rel32(&static_cast<TInt*>(aNode)[branch], reinterpret_cast<TInt>(aLeaf) - reinterpret_cast<TInt>(aNode));
+ }
+ else
+ {
+ err = KErrAlreadyExists;
+ }
+ }
+ else if (offset == 0)
+ {
+ TAny* newNode = iHeap->AllocZ(sizeof(TInt) * 16);
+ if (!newNode)
+ {
+ return KErrNoMemory;
+ }
+ err = SetAt(aKey, aLeaf, aHeight, newNode, aLevel + 1);
+ if (err == KErrNone)
+ {
+ __e32_atomic_store_rel32(&static_cast<TInt*>(aNode)[branch], reinterpret_cast<TInt>(newNode) - reinterpret_cast<TInt>(aNode));
+ }
+ else
+ {
+ iHeap->Free(newNode);
+ }
+ }
+ else
+ {
+ TAny* nextNode = PtrAdd(aNode, offset);
+ err = SetAt(aKey, aLeaf, aHeight, nextNode, aLevel + 1);
+ }
+ return err;
+ }
+
+TAny* RHexTreeBase::At(TUint aKey, TInt aHeight) const
+ {
+ TInt offset = __e32_atomic_load_acq32(&iRootOffsets[aHeight - 1]);
+ if (offset == 0)
+ {
+ return NULL;
+ }
+ const TAny* node = PtrAdd(this, offset);
+ for (TInt level = 1; level <= aHeight; ++level)
+ {
+ TInt branch = (aKey >> ((aHeight - level) << 2)) & 0xF;
+ if (level == 1 && aHeight > 1)
+ {
+ --branch;
+ }
+ offset = __e32_atomic_load_acq32(&static_cast<const TInt*>(node)[branch]);
+ if (offset == 0)
+ {
+ return NULL;
+ }
+ node = PtrAdd(node, offset);
+ }
+ return const_cast<TAny*>(node);
+ }
+
+void RHexTreeBase::ResetAndDestroy(TInt aHeight, TAny* aNode, TInt aLevel)
+ {
+ TInt maxNumBranches = (aLevel == 1 && aHeight > 1 ? 15 : 16);
+ for (TInt branch = 0; branch < maxNumBranches; ++branch)
+ {
+ TInt offset = static_cast<TInt*>(aNode)[branch];
+ if (offset != 0)
+ {
+ TAny* nextNode = PtrAdd(aNode, offset);
+ if (aLevel == aHeight)
+ {
+ iHeap->Free(nextNode);
+ }
+ else
+ {
+ ResetAndDestroy(aHeight, nextNode, aLevel + 1);
+ }
+ }
+ }
+ iHeap->Free(aNode);
+ }
--- a/graphicsdeviceinterface/screendriver/sbit/Cdsb.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/screendriver/sbit/Cdsb.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1998-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"
@@ -17,7 +17,6 @@
#include <cdsb.h>
#include <e32hal.h>
-
#ifdef SYMBIAN_GRAPHICS_GCE
#undef __WINS__
#include "../sgeneric/scdraw.h"
@@ -73,8 +72,6 @@
#ifdef SYMBIAN_GRAPHICS_GCE
CScreenDeviceHelper iSurfaceUpdater;
TUidPixelFormat iPixelFormat;
- TBool iDsaBufferIsBusy;
- TRequestStatus iDsaBufferAvailable;
#endif
TAcceleratedBitmapInfo iBitmapInfo;
TUint32 iSettingsFlags;
@@ -110,9 +107,6 @@
#ifndef __WINS__
iVideoAddress(NULL),
#endif
-#ifdef SYMBIAN_GRAPHICS_GCE
- iDsaBufferIsBusy(EFalse),
-#endif
iBitmapInfo(),
iSettingsFlags(ENone),
iUpdateRect(),
@@ -163,12 +157,16 @@
{
return r;
}
-
+
__ASSERT_ALWAYS(aScreenRect.iTl.iX >= 0 &&
- aScreenRect.iTl.iY >= 0 &&
- aScreenRect.Width() <= screenWidth &&
- aScreenRect.Height() <= screenHeight, Panic(EPanicOutOfBounds));
-
+ aScreenRect.iTl.iY >= 0 &&
+ ((aScreenRect.Width() <= screenWidth &&
+ aScreenRect.Height() <= screenHeight)
+ ||
+ (aScreenRect.Width() <= screenHeight &&
+ aScreenRect.Height() <= screenWidth)),
+ Panic(EPanicOutOfBounds));
+
__ASSERT_ALWAYS(aScreenRect.Width() > 0 &&
aScreenRect.Height() > 0, Panic(EPanicInvalidRect));
@@ -529,14 +527,7 @@
#else
TUint8* pD = (TUint8*)iVideoAddress;
const TUint dD = iDisplayOffsetLines;
-#ifdef SYMBIAN_GRAPHICS_GCE
- if (iDsaBufferIsBusy)
- {
- User::WaitForRequest(iDsaBufferAvailable);
- __ASSERT_DEBUG(iDsaBufferAvailable != KRequestPending, Panic(EPanicIncompleteRequest));
- iDsaBufferIsBusy=EFalse;
- }
-#endif
+
for(TInt y=iUpdateRect.Height(); y>0; y--)
{
Mem::Move((void *)pD, (void *)pS, dS);
@@ -546,17 +537,18 @@
#endif
#ifdef SYMBIAN_GRAPHICS_GCE
- iDsaBufferIsBusy=ETrue;
+ // update the region and complete notification on the client's TRequestStatus
+ // This means the backbuffer is held up until the surface update has completed
+ // notification.
iSurfaceUpdater.UpdateRegion(iUpdateRect);
- iDsaBufferAvailable = KRequestPending;
- iSurfaceUpdater.NotifyWhenAvailable(iDsaBufferAvailable);
- iSurfaceUpdater.Update();
+ iSurfaceUpdater.Update(aComplete);
+#else
+ // In the generic implementation, complete the request immediately to allow the client
+ // to render to the back buffer
+ TRequestStatus* pComplete=&aComplete;
+ User::RequestComplete(pComplete,KErrNone);
#endif
- // In the generic implementation, complete the request immediately to allow the client
- // to render to the back buffer
- TRequestStatus* pComplete=&aComplete;
- User::RequestComplete(pComplete,KErrNone);
}
//
@@ -606,15 +598,6 @@
TUint8* pS = iBitmapInfo.iAddress + offX + (offY*dS);
TUint8* pD = (TUint8*)iVideoAddress + offX + (offY*dD);
-#ifdef SYMBIAN_GRAPHICS_GCE
- if (iDsaBufferIsBusy)
- {
- User::WaitForRequest(iDsaBufferAvailable);
- __ASSERT_DEBUG(iDsaBufferAvailable != KRequestPending, Panic(EPanicIncompleteRequest));
- iDsaBufferIsBusy=EFalse;
- }
-#endif
-
for(TInt y=aScreenRect.Height(); y>0; y--)
{
Mem::Move((void *)pD, (void *)pS, bytesToCopy);
@@ -624,16 +607,18 @@
#endif
#ifdef SYMBIAN_GRAPHICS_GCE
- iDsaBufferIsBusy=ETrue;
+ // update the region and complete notification on the client's TRequestStatus
+ // This means the backbuffer is held up until the surface update has completed
+ // notification.
iSurfaceUpdater.UpdateRegion(iUpdateRect);
- iDsaBufferAvailable = KRequestPending;
- iSurfaceUpdater.NotifyWhenAvailable(iDsaBufferAvailable);
- iSurfaceUpdater.Update();
+ iSurfaceUpdater.Update(aComplete);
+#else
+ // In the generic implementation, complete the request immediately to allow the client
+ // to render to the back buffer
+ TRequestStatus* pComplete=&aComplete;
+ User::RequestComplete(pComplete,KErrNone);
#endif
- // In the generic implementation, complete the request immediately.
- TRequestStatus* pComplete=&aComplete;
- User::RequestComplete(pComplete,KErrNone);
}
#ifdef __WINS__
@@ -728,6 +713,7 @@
}
#endif
+
//
// Close - Deallocate resources and cancel outstanding updates
//
@@ -735,6 +721,9 @@
{
if(iCreated)
{
+#ifdef SYMBIAN_GRAPHICS_GCE
+ iSurfaceUpdater.CancelUpdateNotification();
+#endif
User::Free(iBitmapInfo.iAddress);
iBitmapInfo.iAddress = NULL;
iCreated = EFalse;
--- a/graphicsdeviceinterface/screendriver/sgeneric/scdraw.h Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/screendriver/sgeneric/scdraw.h Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-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"
@@ -61,10 +61,13 @@
inline TInt ScreenNumber() const { return iSurface.iInternal[TSurfaceId::TScreenSurfaceUsage::EScreenField]; }
void Update();
+ void Update(TRequestStatus& aStatus);
+
void Update(const TRegion& aRegion);
void UpdateRegion(const TRect& aRect);
void ResetUpdateRegion();
void NotifyWhenAvailable(TRequestStatus& aStatus);
+ void CancelUpdateNotification();
void GetSurface(TSurfaceId& aSid) const ;
TUint DeviceOrientationsAvailable(const TSize& aScreenSize) const ;
--- a/graphicsdeviceinterface/screendriver/sgeneric/scnew.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/screendriver/sgeneric/scnew.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2006-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"
@@ -340,6 +340,11 @@
iSurfaceUpdateSession.NotifyWhenAvailable(aStatus);
}
+void CScreenDeviceHelper::CancelUpdateNotification()
+ {
+ iSurfaceUpdateSession.CancelAllUpdateNotifications();
+ }
+
/**
Implementation of corresponding function in CDrawDevice, utilizing a tracked
update region. Updates the screen from the surface, if the update region is
@@ -347,11 +352,24 @@
*/
void CScreenDeviceHelper::Update()
{
- if (iUpdateRegion.IsEmpty())
- return;
+ TRequestStatus updateComplete = KRequestPending;
+ Update(updateComplete);
+ User::WaitForRequest(updateComplete);
+ }
- iSurfaceUpdateSession.SubmitUpdate(KAllScreens, iSurface, 0, &iUpdateRegion);
- iUpdateRegion.Clear();
+void CScreenDeviceHelper::Update(TRequestStatus& aStatus)
+ {
+ if (!iUpdateRegion.IsEmpty())
+ {
+ iSurfaceUpdateSession.NotifyWhenAvailable(aStatus);
+ iSurfaceUpdateSession.SubmitUpdate(KAllScreens, iSurface, 0, &iUpdateRegion);
+ iUpdateRegion.Clear();
+ }
+ else
+ {
+ TRequestStatus* pComplete=&aStatus;
+ User::RequestComplete(pComplete,KErrNone);
+ }
}
/**
--- a/graphicsdeviceinterface/screendriver/tsrc/TDirectScreenBitmap.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicsdeviceinterface/screendriver/tsrc/TDirectScreenBitmap.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -546,7 +546,7 @@
TRAPD(err,pDev = CFbsDrawDevice::NewScreenDeviceL(0, aDisplayMode));
if (err)
{
- INFO_PRINTF2(_L("Warning: Failed to create screen device for display mode %i - not supported on this config?"),aDisplayMode);
+ INFO_PRINTF2(_L("Note: Failed to create screen device for display mode %i - not supported on this config?"),aDisplayMode);
}
else
@@ -655,7 +655,7 @@
TRAPD(err,pDev = CFbsDrawDevice::NewScreenDeviceL(0, aDisplayMode));
if (err)
{
- INFO_PRINTF2(_L("Warning: Failed to create screen device for display mode %i - not supported on this config?"),iDispMode);
+ INFO_PRINTF2(_L("Note: Failed to create screen device for display mode %i - not supported on this config?"),iDispMode);
}
else
@@ -786,7 +786,7 @@
TRAPD(err,pDev = CFbsDrawDevice::NewScreenDeviceL(0, aDisplayMode));
if (err)
{
- INFO_PRINTF2(_L("Warning: Failed to create screen device for display mode %i - not supported on this config?"),iDispMode);
+ INFO_PRINTF2(_L("Note: Failed to create screen device for display mode %i - not supported on this config?"),iDispMode);
}
else
{
@@ -936,7 +936,7 @@
TRAPD(err,pDev = CFbsDrawDevice::NewScreenDeviceL(0,aDrawDeviceDispMode));
if (err !=KErrNone)
{
- INFO_PRINTF2(_L("Warning: Failed to create screen device for display mode %i - not supported on this config?"),iDispMode);
+ INFO_PRINTF2(_L("Note: Failed to create screen device for display mode %i - not supported on this config?"),iDispMode);
}
else
{
--- a/graphicstest/graphicstestharness/automation/h4/tests_07.txt Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicstest/graphicstestharness/automation/h4/tests_07.txt Wed Mar 31 23:34:07 2010 +0300
@@ -43,3 +43,6 @@
# WServ
TESTEXECUTE, \logs\testexecute\wsgcetests_hw_color64k_screen1.htm, , z:\wstest\wsgcetests_hw_color64k_screen1.script, 800
+
+# WServ
+TESTEXECUTE, \logs\testexecute\graphics-wserv-nativeorientation-test.htm, , z:\wstest\tnativeorientation\graphics-wserv-nativeorientation-test.script, 800
--- a/graphicstest/graphicstestharness/automation/h6/tests_07.txt Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicstest/graphicstestharness/automation/h6/tests_07.txt Wed Mar 31 23:34:07 2010 +0300
@@ -43,3 +43,6 @@
# WServ
TESTEXECUTE, \logs\testexecute\wsgcetests_hw_color64k_screen1.htm, , z:\wstest\wsgcetests_hw_color64k_screen1.script, 800
+
+# WServ
+TESTEXECUTE, \logs\testexecute\graphics-wserv-nativeorientation-test.htm, , z:\wstest\tnativeorientation\graphics-wserv-nativeorientation-test.script, 800
\ No newline at end of file
--- a/graphicstest/graphicstestharness/automation/ne1/tests_07.txt Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicstest/graphicstestharness/automation/ne1/tests_07.txt Wed Mar 31 23:34:07 2010 +0300
@@ -30,3 +30,6 @@
# Surface Update
TESTEXECUTE, \logs\testexecute\surfaceupdate.htm, , z:\surfaceupdate\surfaceupdate.script, 800
+
+# WServ
+TESTEXECUTE, \logs\testexecute\graphics-wserv-nativeorientation-test.htm, , z:\wstest\tnativeorientation\graphics-wserv-nativeorientation-test.script, 800
\ No newline at end of file
--- a/graphicstest/graphicstestharness/group/graphicsimagecomparison.mmp Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicstest/graphicstestharness/group/graphicsimagecomparison.mmp Wed Mar 31 23:34:07 2010 +0300
@@ -16,14 +16,13 @@
/**
@file
@test
- @internalComponent - Internal Symbian test code
*/
TARGET graphicsimagecomparison.dll
TARGETTYPE dll
-CAPABILITY none
+CAPABILITY All -Tcb
OS_LAYER_SYSTEMINCLUDE_SYMBIAN
MW_LAYER_SYSTEMINCLUDE_SYMBIAN
--- a/graphicstest/graphicstestharness/group/graphicsscreencomparison.mmp Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicstest/graphicstestharness/group/graphicsscreencomparison.mmp Wed Mar 31 23:34:07 2010 +0300
@@ -16,14 +16,13 @@
/**
@file
@test
- @internalComponent - Internal Symbian test code
*/
TARGET graphicsscreencomparison.dll
TARGETTYPE dll
-CAPABILITY none
+CAPABILITY All -Tcb
OS_LAYER_SYSTEMINCLUDE_SYMBIAN
MW_LAYER_SYSTEMINCLUDE_SYMBIAN
--- a/graphicstest/graphicstestharness/rom/graphics_test2.iby Mon Mar 15 12:45:41 2010 +0200
+++ b/graphicstest/graphicstestharness/rom/graphics_test2.iby Wed Mar 31 23:34:07 2010 +0300
@@ -29,6 +29,13 @@
#include <surfaceupdatetest.iby>
#include <graphics_screencomparison.iby>
#include <graphics_imagecomparison.iby>
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+#include <t_nativeorientation.iby>
#endif
+#endif
+
+
+
#endif
\ No newline at end of file
--- a/m3g/m3gcore11/BWINS/m3gcoreU.DEF Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/BWINS/m3gcoreU.DEF Wed Mar 31 23:34:07 2010 +0300
@@ -342,4 +342,5 @@
m3gSetAlphaWrite @ 341 NONAME
m3gGetAlphaWrite @ 342 NONAME
m3gInvalidateMemoryTarget @ 343 NONAME
+ m3gFreeGLESResources @ 344 NONAME
--- a/m3g/m3gcore11/EABI/m3gcoreU.DEF Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/EABI/m3gcoreU.DEF Wed Mar 31 23:34:07 2010 +0300
@@ -342,4 +342,5 @@
m3gSetAlphaWrite @ 341 NONAME
m3gGetAlphaWrite @ 342 NONAME
m3gInvalidateMemoryTarget @ 343 NONAME
+ m3gFreeGLESResources @ 344 NONAME
--- a/m3g/m3gcore11/group/m3g.mmp Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/group/m3g.mmp Wed Mar 31 23:34:07 2010 +0300
@@ -26,14 +26,14 @@
CAPABILITY CAP_GENERAL_DLL
// Modify default options to optimize for speed over size in this module.
-OPTION ARMCC -O3
-OPTION ARMCC -Otime
+OPTION ARMCC -O3 -Otime
ALWAYS_BUILD_AS_ARM
// Uncomment the following flags to enable ARMv6 and/or VFP optimizations.
-//#define __ARMV6_SUPPORT
-//#define __VFPV2_SUPPORT
+#define __ARMV6_SUPPORT
+#define __VFPV2_SUPPORT
+#ifdef ARMCC
#ifdef __ARMV6_SUPPORT
MACRO M3G_HW_ARMV6
OPTION_REPLACE ARMCC --cpu 6
@@ -44,6 +44,7 @@
MACRO M3G_HW_FLOAT_VFPV2
OPTION_REPLACE ARMCC --fpu softvfp+vfpv2 --fpmode fast
#endif
+#endif
#if defined(UDEB)
@@ -69,3 +70,5 @@
LIBRARY euser.lib estlib.lib fbscli.lib
LIBRARY efsrv.lib ws32.lib
LIBRARY libGLESv1_CM.lib ezlib.lib libEGL.lib
+
+SMPSAFE
--- a/m3g/m3gcore11/inc/m3g_config.h Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/inc/m3g_config.h Wed Mar 31 23:34:07 2010 +0300
@@ -32,6 +32,21 @@
/* Support antialiasing */
#define M3G_SUPPORT_ANTIALIASING M3G_TRUE
+/*!
+ * \internal
+ * \def M3G_ENABLE_GLES_RESOURCE_HANDLING
+ * \brief Allow GLES resource freeing
+ *
+ * This feature can be used with HW renderers with external memory architecture
+ * to free all graphics resources allocated by M3G.
+ *
+ * Enabling this feature is likely to increase host memory consumption (a copy of
+ * all texture image data has to be kept kept in host memory), so it's advised to
+ * undefine the flag when using SW GLES or HW GLES with unified memory architecture.
+ */
+#define M3G_ENABLE_GLES_RESOURCE_HANDLING
+
+
#if defined(M3G_DEBUG)
/*
#define M3G_ENABLE_PROFILING
--- a/m3g/m3gcore11/inc/m3g_interface.h Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/inc/m3g_interface.h Wed Mar 31 23:34:07 2010 +0300
@@ -132,8 +132,11 @@
* Other internal functions
*------------------------------------------------------------------*/
-static void m3gAddChildObject(Interface *m3g);
-static void m3gDelChildObject(Interface *m3g);
+static void m3gAddChildObject(Interface *m3g, Object *obj);
+static void m3gDelChildObject(Interface *m3g, Object *obj);
+
+#include "m3g_array.h"
+static void m3gGetObjectsWithClassID(Interface *m3g, M3GClass classID, PointerArray* objects);
#if !defined(M3G_NGL_TEXTURE_API)
static void m3gDeleteGLTextures(Interface *m3g, M3Gsizei n, M3Guint *t);
--- a/m3g/m3gcore11/src/m3g_image.c Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/src/m3g_image.c Wed Mar 31 23:34:07 2010 +0300
@@ -1302,6 +1302,12 @@
return NULL;
}
+#ifdef M3G_ENABLE_GLES_RESOURCE_HANDLING
+ /* If GLES resource freeing (see function m3gFreeGLESResources)
+ is enabled, the GL texture might get deleted at any point, so
+ a copy of the texture data has to be always kept in memory. */
+ img->pinned = M3G_TRUE;
+#else
/* Lock the image data in memory if the image is dynamic,
* or the format has alpha information; otherwise, we'll
* be able to get rid of an extra copy when generating a
@@ -1312,7 +1318,7 @@
img->format != M3G_LUMINANCE)) {
img->pinned = M3G_TRUE;
}
-
+#endif
/* If the image can be used as a rendering target, clear
* to opaque white by default */
@@ -1368,13 +1374,14 @@
image->flags = flags;
+#ifdef M3G_ENABLE_GLES_RESOURCE_HANDLING
/* If the image format has no alpha information, we can discard
* the image data under suitable conditions */
if (image->format == M3G_RGB || image->format == M3G_LUMINANCE) {
image->pinned = M3G_FALSE;
}
-
+#endif
M3G_LOG1(M3G_LOG_IMAGES, "Image 0x%08X made immutable\n",
(unsigned) image);
}
--- a/m3g/m3gcore11/src/m3g_interface.c Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/src/m3g_interface.c Wed Mar 31 23:34:07 2010 +0300
@@ -68,8 +68,6 @@
/*@shared@*/ m3gReleaseTargetFunc *releaseTarget;
} func;
- /*Object *objects;*/
-
/*! \internal \brief Latest error code for this interface */
M3Genum error;
@@ -90,6 +88,8 @@
M3Gint glRefCount;
# endif
+ /* \internal \brief List of live objects */
+ PointerArray objects;
/*! \internal \brief Number of objects registered for this interface */
M3Gint objCount;
@@ -946,20 +946,26 @@
* \internal
* \brief
*/
-static void m3gAddChildObject(Interface *m3g)
+static void m3gAddChildObject(Interface *m3g, Object *obj)
{
M3G_ASSERT(!m3g->shutdown);
M3G_ASSERT(m3gInRange(m3g->objCount, 0, 0x7FFFFFFF));
++m3g->objCount;
+
+ /* Add the object to the list of live objects */
+ m3gArrayAppend(&m3g->objects, obj, m3g);
}
/*!
* \internal
* \brief
*/
-static void m3gDelChildObject(Interface *m3g)
+static void m3gDelChildObject(Interface *m3g, Object *obj)
{
M3G_ASSERT(m3g->objCount > 0);
+
+ /* Remove the object from the list of live objects */
+ m3gArrayDelete(&m3g->objects, m3gArrayFind(&m3g->objects, obj));
if (--m3g->objCount == 0 && m3g->shutdown) {
m3gDeleteInterface(m3g);
}
@@ -968,6 +974,19 @@
#if !defined(M3G_NGL_TEXTURE_API)
/*!
* \internal
+ * \brief Get a list of live objects with matching class ID
+ */
+static void m3gGetObjectsWithClassID(Interface *m3g, M3GClass classID, PointerArray* objects)
+{
+ M3Gsizei i = m3gArraySize(&m3g->objects);
+ while (i > 0) {
+ M3GObject obj = (M3GObject)m3gGetArrayElement(&m3g->objects, --i);
+ if (m3gGetClass(obj) == classID)
+ m3gArrayAppend(objects, obj, m3g);
+ }
+}
+/*!
+ * \internal
* \brief Queue OpenGL texture objects for deletion
*
* The objects will be deleted when a GL context is next made current.
@@ -1661,6 +1680,7 @@
/* All done! Now we can allocate the more trival stuff */
m3g->tcache = m3gCreateTransformCache(m3g);
+ m3gInitArray(&m3g->objects);
M3G_LOG1(M3G_LOG_INTERFACE,
"Interface 0x%08X initialized\n", (unsigned) m3g);
@@ -1690,6 +1710,7 @@
return;
}
+ m3gDestroyArray(&m3g->objects, m3g);
# if !defined(M3G_NGL_TEXTURE_API)
/* Free the list of dead GL objects (those will have been deleted
* along with the owning contexts by now) */
--- a/m3g/m3gcore11/src/m3g_object.c Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/src/m3g_object.c Wed Mar 31 23:34:07 2010 +0300
@@ -56,7 +56,7 @@
M3G_VALIDATE_OBJECT(obj);
- m3gAddChildObject(interface);
+ m3gAddChildObject(interface, obj);
m3gMarkObject(obj);
m3gIncStat(M3G_INTERFACE(obj), M3G_STAT_OBJECTS, 1);
@@ -86,7 +86,7 @@
m3gFree(obj->interface, obj->animTracks);
}
- m3gDelChildObject(obj->interface);
+ m3gDelChildObject(obj->interface, obj);
m3gUnmarkObject(obj);
m3gIncStat(M3G_INTERFACE(obj), M3G_STAT_OBJECTS, -1);
--- a/m3g/m3gcore11/src/m3g_rendercontext.c Mon Mar 15 12:45:41 2010 +0200
+++ b/m3g/m3gcore11/src/m3g_rendercontext.c Wed Mar 31 23:34:07 2010 +0300
@@ -403,6 +403,69 @@
return ctx->alphaWrite;
}
+/*!
+ * \brief Frees all GLES resources allocated by the M3G API
+ * (EGL surfaces, contexts and texture objects).
+ *
+ * \note M3G must not be bound to any target when calling this.
+ *
+ */
+M3G_API void m3gFreeGLESResources(M3GRenderContext ctx)
+{
+#ifdef M3G_ENABLE_GLES_RESOURCE_HANDLING
+
+ PointerArray image2DObjects;
+ M3Gint i;
+
+ /* M3G must not be bound to a rendering target at this point. */
+ if (ctx->target.type != SURFACE_NONE) {
+ m3gRaiseError(M3G_INTERFACE(ctx), M3G_INVALID_OPERATION);
+ }
+
+ /* EGL might not be initialized yet, so do it here just in case. */
+ eglInitialize(eglGetDisplay(EGL_DEFAULT_DISPLAY), NULL, NULL);
+ eglMakeCurrent(eglGetDisplay(EGL_DEFAULT_DISPLAY), NULL, NULL, NULL);
+
+ /* Delete EGL surfaces */
+ for (i = 0; i < M3G_MAX_GL_SURFACES; ++i) {
+ GLSurfaceRecord *surf = &ctx->glSurface[i];
+ if (surf->handle) {
+ m3gDeleteGLSurface(surf->handle);
+ }
+ m3gZero(surf, sizeof(GLSurfaceRecord));
+ }
+ if (ctx->backBuffer.glSurface != NULL) {
+ m3gDeleteGLSurface(ctx->backBuffer.glSurface);
+ m3gZero(&ctx->backBuffer, sizeof(BackBuffer));
+ }
+
+ /* Delete EGL contexts */
+ for (i = 0; i < M3G_MAX_GL_CONTEXTS; ++i) {
+ GLContextRecord *context = &ctx->glContext[i];
+ if (context->handle) {
+ m3gDeleteGLContext(context->handle);
+ }
+ m3gZero(context, sizeof(GLContextRecord));
+ }
+
+ /* Delete references to GLES texture objects from all live Image2D objects.
+ Texture objects themselves have already been destroyed with the last GL context. */
+
+ m3gInitArray(&image2DObjects);
+ m3gGetObjectsWithClassID(M3G_INTERFACE(ctx), M3G_CLASS_IMAGE, &image2DObjects);
+
+ i = m3gArraySize(&image2DObjects);
+
+ while (i > 0) {
+ Image *image = (Image*)m3gGetArrayElement(&image2DObjects, --i);
+
+ m3gInvalidateImage(image);
+ image->texObject = 0;
+ }
+ m3gDestroyArray(&image2DObjects, M3G_INTERFACE(ctx));
+#endif
+}
+
/*!
* \internal
--- a/windowing/windowserver/SERVER/w32cmd.h Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/SERVER/w32cmd.h Wed Mar 31 23:34:07 2010 +0300
@@ -426,8 +426,11 @@
EWsWinOpScreenNumber,
EWsWinOpEnableAdvancedPointers,
#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS
- EWsWinOpSetSurfaceTransparency,
+ EWsWinOpSetSurfaceTransparency=EWsWinOpEnableAdvancedPointers+1, // Explicit offset to prevent clash with EWsWinOpFixNativeOrientation
#endif
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ EWsWinOpFixNativeOrientation=EWsWinOpEnableAdvancedPointers+2, // Offset to prevent clash with EWsWinOpSetSurfaceTransparency
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
EWsWinOpTestLowPriorityRedraw=0x2000, //Specific opcode for testing redraw queue priorities
};
@@ -1915,13 +1918,17 @@
enum TW32Assert // used for w32 code errors
{
- EW32AssertOddLengthData,
- EW32AssertNotImplemented,
- EW32AssertIllegalOpcode,
- EW32AssertDirectMisuse,
- EW32AssertBufferLogic,
- EW32AssertUnexpectedOutOfRangePointerNumber, // Used for an out-of-range pointer number error within the old API's which doesn't take a pointer number.
- EW32AssertWindowSizeCacheFailure,
+ EW32AssertOddLengthData=0,
+ EW32AssertNotImplemented=1,
+ EW32AssertIllegalOpcode=2,
+ EW32AssertDirectMisuse=3,
+ EW32AssertBufferLogic=4,
+ EW32AssertUnexpectedOutOfRangePointerNumber=5, // Used for an out-of-range pointer number error within the old API's which doesn't take a pointer number.
+ EW32AssertWindowSizeCacheFailure=6,
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ EW32AssertWindowNativeSizeCacheFailure=7,
+ EW32AssertInvalidOrientation=8,
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
};
enum TW32Panic // used for application errors
@@ -2073,6 +2080,9 @@
EWservPanicWrongScreen=82, // Child apps can only be constructed on the same screen as their parent. See RWindowGroup::ConstructChildApp
EWservPanicScreenCaptureInvalidRequest=83, // With Screen Capture disabled, an unexpected invalid request has been received
EWservPanicInvalidDisplayConfiguration=84, // Use of a display configuration without valid members
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ EWservPanicFixNativeOrientation=85, // Invalid use of FixNativeOrientation()
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
};
#if defined(__WINS__)
--- a/windowing/windowserver/bwins/WS322U.DEF Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/bwins/WS322U.DEF Wed Mar 31 23:34:07 2010 +0300
@@ -574,4 +574,7 @@
?Session@RWindowTreeNode@@QBEPAVRWsSession@@XZ @ 573 NONAME ; class RWsSession * RWindowTreeNode::Session(void) const
?HeapSetBurstFail@RWsSession@@QAEXHHH@Z @ 574 NONAME ; void RWsSession::HeapSetBurstFail(int, int, int)
?EnableWindowSizeCacheL@RWsSession@@QAEXXZ @ 575 NONAME ; void RWsSession::EnableWindowSizeCacheL(void)
- ?SetSurfaceTransparency@RWindowBase@@QAEXH@Z @ 576 NONAME ; void RWindowBase::SetSurfaceTransparency(int)
+ ?SetSurfaceTransparency@RWindowBase@@QAEXH@Z @ 576 NONAME ; void RWindowBase::SetSurfaceTransparency(int)
+ ?SizeForEgl@RWindowBase@@QBE?AVTSize@@XZ @ 577 NONAME ; class TSize RWindowBase::SizeForEgl(void) const
+ ?FixNativeOrientation@RWindowBase@@QAEHXZ @ 578 NONAME ; int RWindowBase::FixNativeOrientation(void)
+
--- a/windowing/windowserver/bwins/ws32switchu.def Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/bwins/ws32switchu.def Wed Mar 31 23:34:07 2010 +0300
@@ -575,3 +575,6 @@
call_vector_574 @ 574 NONAME ; void RWsSession::HeapSetBurstFail(int, int, int)
call_vector_575 @ 575 NONAME ; void RWsSession::EnableWindowSizeCacheL(void)
call_vector_576 @ 576 NONAME ; void RWindowBase::SetSurfaceTransparency(int)
+ call_vector_577 @ 577 NONAME ; class TSize RWindowBase::SizeForEgl(void) const
+ call_vector_578 @ 578 NONAME ; int RWindowBase::FixNativeOrientation(void)
+
--- a/windowing/windowserver/debuglog/DECODER.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/debuglog/DECODER.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -1392,6 +1392,14 @@
aText.AppendFormat(LogWinClearRedrawStore);
}
break;
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ case EWsWinOpFixNativeOrientation:
+ {
+ _LIT(LogWinFixNativeOrientation,"FixNativeOrientation()");
+ aText.AppendFormat(LogWinFixNativeOrientation);
+ }
+ break;
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
default:
UnKnownOpcode(aText, aOpcode);
break;
--- a/windowing/windowserver/eabi/WS322U.DEF Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/eabi/WS322U.DEF Wed Mar 31 23:34:07 2010 +0300
@@ -649,4 +649,6 @@
_ZN10RWsSession16HeapSetBurstFailEiii @ 648 NONAME
_ZN10RWsSession22EnableWindowSizeCacheLEv @ 649 NONAME
_ZN11RWindowBase22SetSurfaceTransparencyEi @ 650 NONAME
+ _ZN11RWindowBase20FixNativeOrientationEv @ 651 NONAME
+ _ZNK11RWindowBase10SizeForEglEv @ 652 NONAME
--- a/windowing/windowserver/inc/Graphics/openwfc/WSGRAPHICDRAWERINTERFACE.H Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/inc/Graphics/openwfc/WSGRAPHICDRAWERINTERFACE.H Wed Mar 31 23:34:07 2010 +0300
@@ -40,6 +40,7 @@
class MEventHandler;
class MWsElement;
class MWsGraphicsContext;
+class MWsAnimationScheduler;
/**
@publishedPartner
@@ -134,57 +135,6 @@
virtual TBool RedrawInvalid(const TArray<TGraphicDrawerId>& aInvalid) = 0;
};
-class MWsAnimationScheduler: public MWsObjectProvider
-/** A system mechanism for customising the animation timer to a particular hardware variant or to a
- particular external compositor e.g. an out-of-scene transition engine.
- The default animation scheduler in WSERV does not understand device-dependant parameters e.g.
- screen refresh rates
- @publishedPartner
- @released
- to be adapted when WSERV migrates to surfaces
-*/ {
-public:
- /** Called to schedule an animation event for a screen to occur not before some point
- A screen may be scheduled to animate several times without actually receiving an animation event from the scheduler
- If the scheduler cannot honour the request e.g. device constraints, it ignores the request.
- @param aScreen the screen to recieve the event
- @param aWhen the point in time the event need not occur before
- */
- virtual void ScheduleAnimation(MWsScreen& aScreen,const TTime& aWhen) = 0;
- /** Called if a screen determines that it no longer needs to schedule any animation
- @param aScreen the screen not needing to receive any animation events
- */
- virtual void UnscheduleAnimation(MWsScreen& aScreen) = 0;
- /** Called to schedule the redrawing of all screens containing this graphic.
- The redrawing of affected screens can be deferred by the scheduler.
- @param aId the ID of the graphic to be redrawn. The graphic itself need not exist
- (e.g. it has just been deleted, hence the need to redraw all potentially affected screens). */
- virtual void Invalidate(const TGraphicDrawerId& aId) = 0;
- /** Called when the Window Server receives a TRawEvent::EInactive event, to signal power-saving */
- virtual void OnInactive() = 0;
- /** Called when the Window Server receives a TRawEvent::EActive event, to signal screen back on */
- virtual void OnActive() = 0;
-
- /** Called to schedule a redraw for a screen which is out of date
- A screen may be scheduled to redraw several times without actually receiving aredraw event from the scheduler
- If this request is ignored then the screen will be draw incorrectly untill a such a request is not ignored.
- @param aScreen the screen to recieve the event
- @param aWhen the point in time the event need not occur before
- */
- virtual void ScheduleRedraw(MWsScreen& aScreen,const TTime& aWhen) = 0;
- /** Called to force a previously scheduled redraw for a screen to happen synchronously
- Used when we are about to loose our ability to perform the redraw correctly.
- @param aScreen the screen to recieve the event
- */
- virtual void DoRedrawNow(MWsScreen& aScreen) = 0;
-
-protected:
- IMPORT_C void Animate(MWsScreen& aScreen);
- IMPORT_C void Animate(MWsScreen& aScreen, TRequestStatus* aFinished);
- IMPORT_C void Redraw(MWsScreen& aScreen);
- IMPORT_C TBool RedrawInvalid(MWsScreen& aScreen,const TArray<TGraphicDrawerId>& aInvalid);
- };
-
/**
@publishedPartner
@prototype
@@ -245,7 +195,7 @@
/** Get a particular screen by ordinal
@return the screen, or NULL if aIndex is out of bounds */
virtual const MWsScreen* Screen(TInt aIndex) const = 0;
- /** Set the animation scheduler; this can only be done once by custom code
+ /** Not supported
@return success of overriding the default scheduler */
virtual TBool SetCustomAnimationScheduler(MWsAnimationScheduler* aScheduler) = 0;
/** Query whether a custom animation scheduler has been set
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/inc/Graphics/wsgraphicdrawerinternal.h Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,89 @@
+// Copyright (c) 1994-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:
+//
+
+#ifndef GRAPHICDRAWER_INTERNAL_H
+#define GRAPHICDRAWER_INTERNAL_H
+
+class MWsAnimationScheduler: public MWsObjectProvider
+/** A system mechanism for customising the animation timer to a particular hardware variant or to a
+ particular external compositor e.g. an out-of-scene transition engine.
+ The default animation scheduler in WSERV does not understand device-dependant parameters e.g.
+ screen refresh rates
+ @internalComponent
+ @released
+*/ {
+public:
+ /** Called to schedule an animation event for a screen to occur not before some point
+ A screen may be scheduled to animate several times without actually receiving an animation event from the scheduler
+ If the scheduler cannot honour the request e.g. device constraints, it ignores the request.
+ @param aScreen the screen to recieve the event
+ @param aWhen the point in time the event need not occur before
+ */
+ virtual void ScheduleAnimation(MWsScreen& aScreen,const TTime& aWhen) = 0;
+ /** Called if a screen determines that it no longer needs to schedule any animation
+ @param aScreen the screen not needing to receive any animation events
+ */
+ virtual void UnscheduleAnimation(MWsScreen& aScreen) = 0;
+ /** Called to schedule the redrawing of all screens containing this graphic.
+ The redrawing of affected screens can be deferred by the scheduler.
+ @param aId the ID of the graphic to be redrawn. The graphic itself need not exist
+ (e.g. it has just been deleted, hence the need to redraw all potentially affected screens). */
+ virtual void Invalidate(const TGraphicDrawerId& aId) = 0;
+ /** Called when the Window Server receives a TRawEvent::EInactive event, to signal power-saving */
+ virtual void OnInactive() = 0;
+ /** Called when the Window Server receives a TRawEvent::EActive event, to signal screen back on */
+ virtual void OnActive() = 0;
+
+ /** Called to schedule a redraw for a screen which is out of date
+ A screen may be scheduled to redraw several times without actually receiving aredraw event from the scheduler
+ If this request is ignored then the screen will be draw incorrectly untill a such a request is not ignored.
+ @param aScreen the screen to recieve the event
+ @param aWhen the point in time the event need not occur before
+ */
+ virtual void ScheduleRedraw(MWsScreen& aScreen,const TTime& aWhen) = 0;
+ /** Called to force a previously scheduled redraw for a screen to happen immediately.
+ Used when we are about to loose our ability to perform the redraw correctly.
+ @param aScreen the screen to recieve the event
+ */
+ virtual void DoRedrawNow(MWsScreen& aScreen) = 0;
+
+ /** Interface to be implemented by callers of the asynchronous overload of
+ DoRedrawNow, which takes a reference to this interface as argument to be able
+ to give a callback once the screen update has been completed.
+ */
+ class MScreenUpdateObserver
+ {
+ public:
+ /** Callback when an asynchronous DoRedrawNow has been completed. */
+ virtual void ScreenUpdateComplete(TInt aResult) = 0;
+ };
+
+ /** Called to force a previously scheduled redraw for a screen to happen immediately.
+ @param aScreen the screen to recieve the event
+ @param aObserver reference which will receive a notification when the screen has been updated
+ */
+ virtual void DoRedrawNow(MWsScreen& aScreen, MScreenUpdateObserver& aObserver) = 0;
+
+ /** Callback to use if aObserver gets deleted before screen update takes place. */
+ virtual void ClearScreenUpdateObserver(const MScreenUpdateObserver& aObserver) = 0;
+
+protected:
+ IMPORT_C void Animate(MWsScreen& aScreen);
+ IMPORT_C void Animate(MWsScreen& aScreen, TRequestStatus* aFinished);
+ IMPORT_C void Redraw(MWsScreen& aScreen);
+ IMPORT_C TBool RedrawInvalid(MWsScreen& aScreen,const TArray<TGraphicDrawerId>& aInvalid);
+ };
+
+#endif
\ No newline at end of file
--- a/windowing/windowserver/inc/W32STD.H Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/inc/W32STD.H Wed Mar 31 23:34:07 2010 +0300
@@ -1230,7 +1230,15 @@
void RefreshWindowSizeCache(const TSize& aNewSize) const;
TInt CachedWindowSize(TSize& aSize) const;
void DestroyWindowSizeCacheEntry();
-
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ void EnableWindowNativeSizeCacheL();
+ TBool WindowNativeSizeCacheEnabled() const;
+ TInt SetWindowNativeSize(const TSize& aNativeSize) const;
+ TInt WindowNativeSize(TSize& aSize) const;
+ void DestroyWindowNativeSizeCacheEntry();
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+
protected:
TInt32 iWsHandle; /**< WARNING: Member variable for internal use ONLY. Compatibility is not guaranteed in future releases. Please access using the provided get/set APIs only. */
RWsBuffer *iBuffer; /**< WARNING: Member variable for internal use ONLY. Compatibility is not guaranteed in future releases. Please access using the provided get/set APIs only. */
@@ -1712,6 +1720,8 @@
IMPORT_C void SetSurfaceTransparency(TBool aSurfaceTransparency);
IMPORT_C TRgb KeyColor() const;
IMPORT_C void EnableAdvancedPointers();
+ IMPORT_C TInt FixNativeOrientation();
+ IMPORT_C TSize SizeForEgl() const;
protected:
TInt construct(const RWindowTreeNode &parent,TUint32 aHandle, TInt aType, TDisplayMode aDisplayMode);
};
--- a/windowing/windowserver/nga/CLIENT/CLIENT.H Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/CLIENT/CLIENT.H Wed Mar 31 23:34:07 2010 +0300
@@ -84,6 +84,13 @@
inline void RefreshWindowSizeCache(TInt aHandle, const TSize& aNewSize);
inline TInt CachedWindowSize(TInt aHandle, TSize& aSize);
inline void DestroyWindowSizeCacheEntry(TInt aHandle);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ void EnableWindowNativeSizeCacheL();
+ inline TBool WindowNativeSizeCacheEnabled() const;
+ inline TInt SetWindowNativeSize(TInt aHandle, const TSize& aNativeSize);
+ inline TInt WindowNativeSize(TInt aHandle, TSize& aSize);
+ inline void DestroyWindowNativeSizeCacheEntry(TInt aHandle);
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
private:
TInt DoWrite(TInt aHandle, TUint aOpcode, TBool aFlush, const TIpcArgs* aIpcArgs, const TAny* aData1=NULL, TInt aLength1=0, const TAny* aData2=NULL, TInt aLength2=0);
@@ -116,6 +123,9 @@
};
RHashMap<TInt, TWindowSizeCacheEntry>* iWindowSizeCache;
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ RHashMap<TInt, TWindowSizeCacheEntry>* iWindowNativeSizeCache;
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
};
@@ -185,5 +195,45 @@
__ASSERT_DEBUG(err == KErrNone || err == KErrNotFound, Assert(EW32AssertWindowSizeCacheFailure));
}
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+inline TBool RWsBuffer::WindowNativeSizeCacheEnabled() const
+ {
+ return iWindowNativeSizeCache ? ETrue : EFalse;
+ }
+
+inline TInt RWsBuffer::SetWindowNativeSize(TInt aHandle, const TSize& aNativeSize)
+ {
+ __ASSERT_ALWAYS(iWindowNativeSizeCache != NULL, Assert(EW32AssertWindowNativeSizeCacheFailure));
+ RWsBuffer::TWindowSizeCacheEntry* entry = iWindowNativeSizeCache->Find(aHandle);
+ __ASSERT_ALWAYS(!entry, Assert(EW32AssertWindowNativeSizeCacheFailure));
+ return iWindowNativeSizeCache->Insert(aHandle, RWsBuffer::TWindowSizeCacheEntry(aNativeSize));
+ }
+
+inline TInt RWsBuffer::WindowNativeSize(TInt aHandle, TSize& aSize)
+ {
+ __ASSERT_ALWAYS(iWindowNativeSizeCache != NULL, Assert(EW32AssertWindowNativeSizeCacheFailure));
+ RWsBuffer::TWindowSizeCacheEntry* entry = iWindowNativeSizeCache->Find(aHandle);
+ if (entry)
+ {
+ aSize = entry->iSize;
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotFound;
+ }
+ }
+
+inline void RWsBuffer::DestroyWindowNativeSizeCacheEntry(TInt aHandle)
+ {
+ __ASSERT_ALWAYS(iWindowNativeSizeCache != NULL, Assert(EW32AssertWindowNativeSizeCacheFailure));
+ TInt err = iWindowNativeSizeCache->Remove(aHandle);
+ // If there is a window size cache entry, then err == KErrNone.
+ // Otherwise, there isn't a size cache entry, and err == KErrNotFound.
+ __ASSERT_DEBUG(err == KErrNone || err == KErrNotFound, Assert(EW32AssertWindowNativeSizeCacheFailure));
+ }
+
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+
#endif
--- a/windowing/windowserver/nga/CLIENT/MWSCLI.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/CLIENT/MWSCLI.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -142,3 +142,31 @@
{
iBuffer->DestroyWindowSizeCacheEntry(iWsHandle);
}
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+void MWsClientClass::EnableWindowNativeSizeCacheL()
+ {
+ return iBuffer->EnableWindowNativeSizeCacheL();
+ }
+
+TBool MWsClientClass::WindowNativeSizeCacheEnabled() const
+ {
+ return iBuffer->WindowNativeSizeCacheEnabled();
+ }
+
+TInt MWsClientClass::SetWindowNativeSize(const TSize& aNativeSize) const
+ {
+ return iBuffer->SetWindowNativeSize(iWsHandle,aNativeSize);
+ }
+
+TInt MWsClientClass::WindowNativeSize(TSize& aSize) const
+ {
+ return iBuffer->WindowNativeSize(iWsHandle, aSize);
+ }
+
+void MWsClientClass::DestroyWindowNativeSizeCacheEntry()
+ {
+ iBuffer->DestroyWindowNativeSizeCacheEntry(iWsHandle);
+ }
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+
--- a/windowing/windowserver/nga/CLIENT/RBUFFER.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/CLIENT/RBUFFER.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -44,6 +44,9 @@
#endif
iBuf(NULL,0,0), iNext(NULL), iPreviousHandle(0), iBufSize(0), iMaxBufSize(EMinBufferSize),
iDirectAcessCount(0), iInvalidBitmapArray(EFalse), iWindowSizeCache(NULL)
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+, iWindowNativeSizeCache(NULL)
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
{
}
@@ -100,6 +103,14 @@
delete iWindowSizeCache;
iWindowSizeCache = NULL;
}
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ if (iWindowNativeSizeCache)
+ {
+ iWindowNativeSizeCache->Close();
+ delete iWindowNativeSizeCache;
+ iWindowNativeSizeCache = NULL;
+ }
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
}
void RWsBuffer::Destroy()
@@ -463,3 +474,14 @@
iWindowSizeCache = new (ELeave) RHashMap<TInt, TWindowSizeCacheEntry>();
}
}
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+void RWsBuffer::EnableWindowNativeSizeCacheL()
+ {
+ if (iWindowNativeSizeCache == NULL)
+ {
+ iWindowNativeSizeCache = new (ELeave) RHashMap<TInt, TWindowSizeCacheEntry>();
+ }
+ }
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+
--- a/windowing/windowserver/nga/CLIENT/RWINDOW.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/CLIENT/RWINDOW.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -170,6 +170,12 @@
{
DestroyWindowSizeCacheEntry();
}
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ if (WindowNativeSizeCacheEnabled())
+ {
+ DestroyWindowNativeSizeCacheEntry();
+ }
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
Write(EWsWinOpFree);
}
iWsHandle=NULL;
@@ -840,6 +846,31 @@
}
}
+EXPORT_C TSize RWindowBase::SizeForEgl() const
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+/**
+@internalAll
+Disclaimer - this API is internal and is subject to change
+@prototype */
+ {
+ TSize size;
+ if (WindowNativeSizeCacheEnabled() && WindowNativeSize(size) == KErrNone)
+ {
+ return size;
+ }
+ else
+ {
+ return Size();
+ }
+ }
+#else
+ {
+ // API should not be used if macro undefined.
+ ASSERT(0);
+ return TSize();
+ }
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+
EXPORT_C void RWindowBase::SetPosition(const TPoint &aPos)
/** Sets the position of a window relative to its parent.
@@ -1377,6 +1408,48 @@
Write(EWsWinOpEnableAdvancedPointers);
}
+/**
+@internalAll
+Disclaimer - this API is internal and is subject to change
+@prototype */
+EXPORT_C TInt RWindowBase::FixNativeOrientation()
+#if !defined(SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION) || defined (SYMBIAN_GRAPHICS_BUILD_OPENWF_WSERV) || defined (__WINS__)
+ {
+ return KErrNotSupported;
+ }
+#else
+ {
+ TInt err = KErrNone;
+ if (!WindowNativeSizeCacheEnabled())
+ {
+ TRAP(err, EnableWindowNativeSizeCacheL());
+ if (err != KErrNone)
+ {
+ return err;
+ }
+ }
+
+ const CFbsBitGc::TGraphicsOrientation orientation = static_cast<CFbsBitGc::TGraphicsOrientation>(WriteReply(EWsWinOpFixNativeOrientation));
+ switch (orientation)
+ {
+ case CFbsBitGc::EGraphicsOrientationNormal:
+ case CFbsBitGc::EGraphicsOrientationRotated180:
+ err = SetWindowNativeSize(Size());
+ break;
+ case CFbsBitGc::EGraphicsOrientationRotated90 :
+ case CFbsBitGc::EGraphicsOrientationRotated270:
+ {
+ TSize size = Size();
+ err = SetWindowNativeSize(TSize(size.iHeight, size.iWidth));
+ }
+ break;
+ default:
+ Assert(EW32AssertInvalidOrientation);
+ }
+ return err;
+ }
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+
EXPORT_C TInt RWindowBase::AllocPointerMoveBuffer(TInt aMaxNumPoints, TUint aFlags)
/** Allocates a buffer for storing pointer movements.
--- a/windowing/windowserver/nga/CLIENT/RWS.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/CLIENT/RWS.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -2308,9 +2308,11 @@
}
EXPORT_C void RWsSession::ClearAllRedrawStores()
-/** Clear the redraw store for all windows in the system
-By default Windows will recorded the drawing commands used during a redraw and use them latter if the window needs to be redrawn.
-Calling this function will cause all these stores to be thrown away redraw will then be sent to all window, visible windows will recieve them first.
+/** Clear the redraw store for all windows in the system.
+By default Windows will record the drawing commands used during a redraw and re-use them later if the window needs to be redrawn.
+Calling this function will cause all these server-side stores to be thrown away, redraw requests will then be sent to all client-side windows. Visible windows will receive them first.
+
+In most cases you should be using RWindow::ClearRedrawStore instead of this function.
This function always causes a flush of the window server buffer.*/
{
--- a/windowing/windowserver/nga/SERVER/EVENT.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/SERVER/EVENT.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -32,6 +32,7 @@
#include "pointer.h"
#include "debugbar.h"
#include "advancedpointereventhelper.h"
+#include "Graphics/wsgraphicdrawerinternal.h"
GLREF_D CDebugLogBase *wsDebugLog;
--- a/windowing/windowserver/nga/SERVER/SERVER.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/SERVER/SERVER.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -19,7 +19,6 @@
#include "panics.h"
#include "wstop.h"
#include "EVENT.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
#include <bitdraw.h>
#include <hal.h>
#include "inifile.h"
@@ -107,6 +106,8 @@
void OnActive();
void ScheduleRedraw(MWsScreen& aScreen,const TTime& aWhen);
void DoRedrawNow(MWsScreen& aScreen);
+ void DoRedrawNow(MWsScreen& aScreen, MWsAnimationScheduler::MScreenUpdateObserver& aObserver);
+ void ClearScreenUpdateObserver(const MWsAnimationScheduler::MScreenUpdateObserver& aObserver);
private:
static TBool OnIdleCallBack(TAny* aAny);
void ScheduleUpdate (TInt aScreenNumber, TBool aForce);
@@ -142,6 +143,8 @@
~CScreenState();
void SetActive ();
+ void WaitForRedraws(MWsAnimationScheduler::MScreenUpdateObserver& aObserver, TInt aNumRedraws);
+ void ClearScreenUpdateObserver(const MWsAnimationScheduler::MScreenUpdateObserver& aObserver);
CPeriodic* iUpdateOn;
TTime iExpectedTickTime;
TScreenUpdateDetails iScreenUpdateDetails;
@@ -151,6 +154,8 @@
private:
CScreenState (CDefaultAnimationScheduler* aScheduler, TInt aScreenOrdinal);
void ConstructL ();
+ void ReleaseRemainingClients();
+ void ReleaseClientsWaitingFor(TUint aCurrentFrame);
void RunL();
void DoCancel()
@@ -158,6 +163,18 @@
TRequestStatus* tmpTRS = &iStatus;
User::RequestComplete(tmpTRS, KErrNone);
};
+ class TWaitingClient
+ {
+ public:
+ TWaitingClient(MWsAnimationScheduler::MScreenUpdateObserver& aObserver, TInt aTargetFrame)
+ : iObserver(aObserver), iTargetFrame(aTargetFrame)
+ {
+ }
+ MWsAnimationScheduler::MScreenUpdateObserver& iObserver;
+ TUint iTargetFrame;
+ };
+ TUint iFrameCount;
+ RArray<TWaitingClient> iWaitingClients;
};
// If using the default animation scheduler on a device, these two numbers may be worth tweaking in the inifile
@@ -275,6 +292,7 @@
void CWindowServer::CDefaultAnimationScheduler::CScreenState::ConstructL ()
{
iUpdateOn = CPeriodic::NewL(EComposeCompletePriority);
+ iWaitingClients.ReserveL(8);
CActiveScheduler::Add(this);
}
@@ -283,19 +301,91 @@
CActive::Cancel();
iInvalidated.Close();
delete iUpdateOn;
+ TInt i = iWaitingClients.Count();
+ while(i--)
+ {
+ iWaitingClients[i].iObserver.ScreenUpdateComplete(KErrAbort);
+ }
+ iWaitingClients.Close();
}
void CWindowServer::CDefaultAnimationScheduler::CScreenState::SetActive()
{
CActive::SetActive ();
}
-
+
+/**
+This function is called from CWsClient d'tor to make sure we will not hang on to any deleted objects.
+*/
+void CWindowServer::CDefaultAnimationScheduler::CScreenState::ClearScreenUpdateObserver(const MWsAnimationScheduler::MScreenUpdateObserver& aObserver)
+ {
+ const TInt count = iWaitingClients.Count();
+ for(TInt i = count-1 ; i >= 0; i--)
+ {
+ if( &aObserver == &(iWaitingClients[i].iObserver) )
+ {
+ TWaitingClient& client = iWaitingClients[i];
+ client.iObserver.ScreenUpdateComplete(KErrCancel);
+ iWaitingClients.Remove(i);
+ }
+ }
+ }
+
+void CWindowServer::CDefaultAnimationScheduler::CScreenState::WaitForRedraws(MWsAnimationScheduler::MScreenUpdateObserver& aObserver, TInt aNumRedraws)
+ {
+ const TUint targetFrame = iFrameCount + aNumRedraws;
+ TWaitingClient request(aObserver, targetFrame);
+ TInt err = iWaitingClients.Append(request);
+ if(err != KErrNone)
+ {
+ //If OOM and already have 8 waiting clients we will not accept a 9th client
+ aObserver.ScreenUpdateComplete(KErrNoMemory);
+ }
+ }
+
+void CWindowServer::CDefaultAnimationScheduler::CScreenState::ReleaseRemainingClients()
+ {
+ const TInt count = iWaitingClients.Count();
+ for(TInt i = count-1; i >= 0; i--)
+ {
+ TWaitingClient& client = iWaitingClients[i];
+ client.iObserver.ScreenUpdateComplete(KErrNone);
+ iWaitingClients.Remove(i);
+ }
+ }
+
+void CWindowServer::CDefaultAnimationScheduler::CScreenState::ReleaseClientsWaitingFor(TUint aCurrentFrame)
+ {
+ const TInt count = iWaitingClients.Count();
+ for(TInt i = count-1; i >= 0; i--)
+ {
+ TWaitingClient& client = iWaitingClients[i];
+ if(aCurrentFrame >= client.iTargetFrame)
+ {
+ client.iObserver.ScreenUpdateComplete(KErrNone);
+ iWaitingClients.Remove(i);
+ }
+ }
+ }
+
/**
-Invoked when the rendering pipline signals that it is ready to recieve updated.
+Invoked when the rendering pipline signals that it is ready to recieve updates.
*/
void CWindowServer::CDefaultAnimationScheduler::CScreenState::RunL()
{
+ iFrameCount++;
+
+ //Complete any clients waiting for this frame
+ ReleaseClientsWaitingFor(iFrameCount);
+
iScreenUpdateDetails.iScheduler->ProcessUpdateCompletion (iScreenUpdateDetails.iScreenNumber);
+
+ if(!IsActive())
+ {
+ //No further pending frames, release all remaining clients
+ ReleaseRemainingClients();
+ }
+
}
void CWindowServer::CDefaultAnimationScheduler::ProcessUpdateCompletion (TInt aScreenNumber)
@@ -310,6 +400,49 @@
ScheduleUpdate (aScreenNumber, ETrue);
}
+void CWindowServer::CDefaultAnimationScheduler::DoRedrawNow(MWsScreen& aScreen, MWsAnimationScheduler::MScreenUpdateObserver& aObserver)
+ {
+ TInt screenNumber = ScreenNumber (aScreen);
+ TInt redrawCount = 0;
+
+ // redrawCount is the number of times we should wait for redraws to complete.
+ // If a redraw is not currently active then we need to wait (at most) once: for
+ // any outstanding scheduled update to complete.
+ // If a redraw is currently active then we need to wait (at most) twice: once for
+ // the current update to complete, and once for any outstanding scheduled update to complete.
+ if (!iScreenState[screenNumber]->IsActive())
+ {
+ // No animation in progress, so force a redraw of due updates.
+ ScheduleUpdate(screenNumber, ETrue);
+
+ // If there is still nothing drawing, set redrawCount to zero to make sure we do not wait.
+ if (!iScreenState[screenNumber]->IsActive())
+ {
+ redrawCount = 0;
+ aObserver.ScreenUpdateComplete(KErrNone);
+ }
+ else
+ {
+ redrawCount = 1;
+ iScreenState[screenNumber]->WaitForRedraws(aObserver, redrawCount);
+ }
+ }
+ else
+ {
+ redrawCount = 2;
+ iScreenState[screenNumber]->WaitForRedraws(aObserver, redrawCount);
+ }
+ }
+
+void CWindowServer::CDefaultAnimationScheduler::ClearScreenUpdateObserver(const MWsAnimationScheduler::MScreenUpdateObserver& aObserver)
+ {
+ const TInt count = iScreenState.Count();
+ for(TInt screenNumber=0; screenNumber<count; screenNumber++)
+ {
+ iScreenState[screenNumber]->ClearScreenUpdateObserver(aObserver);
+ }
+ }
+
/**
Switch to deactivate animation or drawing (based on setting of iInactivityBehaviour).
See InvokeDueAnimation().
@@ -366,7 +499,7 @@
{
TInt screenNumber = ScreenNumber (aScreen);
TInt redrawCount = 0;
-
+
// redrawCount is the number of times we should wait for redraws to complete.
// If a redraw is not currently active then we need to wait (at most) once: for
// any outstanding scheduled update to complete.
@@ -735,8 +868,7 @@
iDrawerMasterIndex.Close();
delete iDefaultAnimationScheduler;
- iDefaultAnimationScheduler = NULL; //might be called from clients during server destruction
- iCustomAnimationScheduler = NULL; // not owned
+ iDefaultAnimationScheduler = NULL; //might be called from clients during server destruction
}
void CWindowServer::ConstructL()
@@ -799,37 +931,23 @@
/**
Custom Animation Scheduler
*/
-TBool CWindowServer::SetCustomAnimationScheduler(MWsAnimationScheduler* aScheduler)
+TBool CWindowServer::SetCustomAnimationScheduler(MWsAnimationScheduler* /*aScheduler*/)
{
- if(!iCustomAnimationScheduler && aScheduler)
- {
- iCustomAnimationScheduler = aScheduler;
- return ETrue;
- }
return EFalse;
}
TBool CWindowServer::HasCustomAnimationScheduler() const
{
- return !!iCustomAnimationScheduler;
+ return EFalse;
}
-TBool CWindowServer::ClearCustomAnimationScheduler(MWsAnimationScheduler* aCurrentScheduler)
+TBool CWindowServer::ClearCustomAnimationScheduler(MWsAnimationScheduler* /*aCurrentScheduler*/)
{
- if(iCustomAnimationScheduler && (iCustomAnimationScheduler == aCurrentScheduler))
- {
- iCustomAnimationScheduler = NULL;
- return ETrue;
- }
return EFalse;
}
MWsAnimationScheduler* CWindowServer::AnimationScheduler()
{
- if(iCustomAnimationScheduler)
- {
- return iCustomAnimationScheduler;
- }
return iDefaultAnimationScheduler;
}
--- a/windowing/windowserver/nga/SERVER/ScrDev.H Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/SERVER/ScrDev.H Wed Mar 31 23:34:07 2010 +0300
@@ -88,11 +88,16 @@
inline TDisplayMode DefaultDisplayMode();
TUint ClientDevicePointer();
void TestScreenCaptureL(const TAny* aMessage);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize AppScreenSizeInPixels()const;
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
private:
void CopyScreenToBitmapL(const TRect &aRect, TInt aHandle);
void SetScreenDeviceValidStates(const DWsScreenDevice *aDevice);
void PanicCurrentClient(TClientPanic aPanic);
+#ifndef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
TSize AppScreenSizeInPixels()const;
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
TSize AppScreenSizeInTwips()const;
// Implementing MWsTestScreenCaptureUtils
--- a/windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.h Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/SERVER/openwfc/ScreenRedraw.h Wed Mar 31 23:34:07 2010 +0300
@@ -24,6 +24,7 @@
#include "wstypes.h"
#include "tcursor.h"
#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "Graphics/wsgraphicdrawerinternal.h"
class CScreen;
class CWsRenderStage;
--- a/windowing/windowserver/nga/SERVER/openwfc/server.h Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/SERVER/openwfc/server.h Wed Mar 31 23:34:07 2010 +0300
@@ -28,6 +28,7 @@
#include "CLIENT.H"
#include "ScrDev.H"
#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "Graphics/wsgraphicdrawerinternal.h"
#include "WSGRAPHICDRAWERARRAY.H"
#include "panics.h"
--- a/windowing/windowserver/nga/graphicdrawer/graphicdrawerenvironment.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nga/graphicdrawer/graphicdrawerenvironment.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -15,6 +15,7 @@
#include "Graphics/WSGRAPHICDRAWER.H"
#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "Graphics/wsgraphicdrawerinternal.h"
// TGraphicDrawerId \\\\\\\\\\\\\\\\\\\\\\\\
--- a/windowing/windowserver/nonnga/CLIENT/RWINDOW.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nonnga/CLIENT/RWINDOW.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -813,6 +813,14 @@
return(sizePkg());
}
+EXPORT_C TSize RWindowBase::SizeForEgl() const
+/** Dummy implementation in order to preserve compatibility with WSERV NGA.
+ @internalComponent */
+ {
+ ASSERT(0);
+ return TSize();
+ }
+
EXPORT_C void RWindowBase::SetPosition(const TPoint &aPos)
/** Sets the position of a window relative to its parent.
@@ -1237,6 +1245,14 @@
ASSERT(0);
}
+EXPORT_C TInt RWindowBase::FixNativeOrientation()
+/** Dummy implementation in order to preserve compatibility with WSERV NGA.
+ @internalComponent */
+ {
+ ASSERT(0);
+ return KErrNotSupported;
+ }
+
EXPORT_C TInt RWindowBase::AllocPointerMoveBuffer(TInt aMaxNumPoints, TUint aFlags)
/** Allocates a buffer for storing pointer movements.
--- a/windowing/windowserver/nonnga/SERVER/EVENT.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nonnga/SERVER/EVENT.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -32,6 +32,8 @@
#include "pointer.h"
#include "debugbar.h"
#include "wstraces.h"
+#include "Graphics/wsgraphicdrawerinternal.h"
+
GLREF_D CDebugLogBase *wsDebugLog;
--- a/windowing/windowserver/nonnga/SERVER/SERVER.CPP Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nonnga/SERVER/SERVER.CPP Wed Mar 31 23:34:07 2010 +0300
@@ -19,7 +19,6 @@
#include "panics.h"
#include "wstop.h"
#include "EVENT.H"
-#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
#include <bitdraw.h>
#include <hal.h>
#include "inifile.h"
@@ -82,6 +81,8 @@
void OnActive();
void ScheduleRedraw(MWsScreen& aScreen,const TTime& aWhen);
void DoRedrawNow(MWsScreen& aScreen);
+ void DoRedrawNow(MWsScreen& aScreen, MWsAnimationScheduler::MScreenUpdateObserver& aObserver);
+ void ClearScreenUpdateObserver(const MWsAnimationScheduler::MScreenUpdateObserver& /*aObserver*/) {}
TInt RemoveGraphicDrawer(const TGraphicDrawerId &aId);
private:
@@ -326,6 +327,12 @@
OnIdleCallBack(ETrue);
}
+void CWindowServer::CDefaultAnimationScheduler::DoRedrawNow(MWsScreen& /*aScreen*/, MWsAnimationScheduler::MScreenUpdateObserver& aObserver)
+ {
+ OnIdleCallBack(ETrue);
+ aObserver.ScreenUpdateComplete(KErrNone);
+ }
+
void CWindowServer::CDefaultAnimationScheduler::ScheduleAnimation(MWsScreen& aScreen,const TTime& aWhen)
{
TSchedule schedule;
@@ -646,7 +653,6 @@
delete iDefaultAnimationScheduler;
iDefaultAnimationScheduler = NULL; // might be called from clients during server destruction
- iCustomAnimationScheduler = NULL; // not owned
delete iPluginManager;
}
@@ -714,37 +720,23 @@
/**
Custom Animation Scheduler
*/
-TBool CWindowServer::SetCustomAnimationScheduler(MWsAnimationScheduler* aScheduler)
+TBool CWindowServer::SetCustomAnimationScheduler(MWsAnimationScheduler* /*aScheduler*/)
{
- if(!iCustomAnimationScheduler && aScheduler)
- {
- iCustomAnimationScheduler = aScheduler;
- return ETrue;
- }
return EFalse;
}
TBool CWindowServer::HasCustomAnimationScheduler() const
{
- return !!iCustomAnimationScheduler;
+ return EFalse;
}
-TBool CWindowServer::ClearCustomAnimationScheduler(MWsAnimationScheduler* aCurrentScheduler)
+TBool CWindowServer::ClearCustomAnimationScheduler(MWsAnimationScheduler* /*aCurrentScheduler*/)
{
- if(iCustomAnimationScheduler && (iCustomAnimationScheduler == aCurrentScheduler))
- {
- iCustomAnimationScheduler = NULL;
- return ETrue;
- }
return EFalse;
}
MWsAnimationScheduler* CWindowServer::AnimationScheduler()
{
- if(iCustomAnimationScheduler)
- {
- return iCustomAnimationScheduler;
- }
return iDefaultAnimationScheduler;
}
--- a/windowing/windowserver/nonnga/SERVER/ScreenRedraw.h Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nonnga/SERVER/ScreenRedraw.h Wed Mar 31 23:34:07 2010 +0300
@@ -23,6 +23,7 @@
#include <gdi.h>
#include "wstypes.h"
#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "Graphics/wsgraphicdrawerinternal.h"
class CScreen;
class CWsRenderStage;
--- a/windowing/windowserver/nonnga/SERVER/server.h Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nonnga/SERVER/server.h Wed Mar 31 23:34:07 2010 +0300
@@ -28,6 +28,7 @@
#include "CLIENT.H"
#include "ScrDev.H"
#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "Graphics/wsgraphicdrawerinternal.h"
#include "WSGRAPHICDRAWERARRAY.H"
#include "panics.h"
@@ -372,7 +373,6 @@
private:
class CDefaultAnimationScheduler;
CDefaultAnimationScheduler* iDefaultAnimationScheduler;
- MWsAnimationScheduler* iCustomAnimationScheduler;
CWsPluginManager* iPluginManager;
RPointerArray<MWsMemoryRelease> iMemoryReleases;
/** An index to all the CWsGraphicDrawer objects.
--- a/windowing/windowserver/nonnga/graphicdrawer/graphicdrawerenvironment.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/nonnga/graphicdrawer/graphicdrawerenvironment.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -15,6 +15,7 @@
#include "Graphics/WSGRAPHICDRAWER.H"
#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
+#include "Graphics/wsgraphicdrawerinternal.h"
// TGraphicDrawerId \\\\\\\\\\\\\\\\\\\\\\\\
--- a/windowing/windowserver/tauto/twindowsizecache.cpp Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/tauto/twindowsizecache.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -33,7 +33,6 @@
void CTWindowSizeCacheTest::ConstructL()
{}
-
void CTWindowSizeCacheTest::TestCreateRWindowL(TSizeCacheStatus aEnableWindowSizeCache)
{
__UHEAP_MARK;
@@ -579,7 +578,12 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
-
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -624,11 +628,21 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
-
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
+
// w1 State 1
TSize retSize2 = w1.Size();
TEST(retSize2 == size1);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size1);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -670,7 +684,12 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
-
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
+
// w1 State 1
// Only the first call to EnableWindowSizeCacheL() should have an effect
// All subsequent calls to EnableWindowSizeCacheL() should have no effect
@@ -717,6 +736,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 1
// Only the first call to EnableWindowSizeCacheL() should have an effect
@@ -727,6 +751,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size1);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size1);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -771,6 +800,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -821,6 +855,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TPoint point2 (20202,223);
@@ -872,6 +911,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -922,6 +966,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TPoint point2 (20202,223);
@@ -973,6 +1022,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1027,6 +1081,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1082,6 +1141,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1136,6 +1200,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1188,6 +1257,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1242,6 +1316,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1252,6 +1331,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size2);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size2);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1296,6 +1380,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TPoint point2 (20202,223);
@@ -1307,6 +1396,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size2);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size2);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1351,6 +1445,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1361,6 +1460,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size2);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size2);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1405,6 +1509,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TPoint point2 (20202,223);
@@ -1416,6 +1525,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size2);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size2);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1460,6 +1574,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1474,6 +1593,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size3);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size3);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1518,6 +1642,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1533,6 +1662,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size3);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size3);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1577,6 +1711,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1591,6 +1730,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size3);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size3);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1635,6 +1779,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1650,6 +1799,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size3);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size3);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1691,6 +1845,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1704,6 +1863,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size2);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size2);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1752,6 +1916,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1767,6 +1936,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size3);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size3);
+#endif
+
// w1 State 2
TSize size4 (40004,423);
w1.SetSize(size4);
@@ -1775,6 +1949,11 @@
TSize retSize3 = w1.Size();
TEST(retSize3 == size4);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl3 = w1.SizeForEgl();
+ TEST(retSizeForEgl3 == size4);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1823,6 +2002,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
// w1 State 2
TSize size2 (20002,223);
@@ -1839,6 +2023,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size3);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size3);
+#endif
+
// w1 State 2
TSize size4 (40004,423);
err = w1.SetSizeErr(size4);
@@ -1848,6 +2037,11 @@
TSize retSize3 = w1.Size();
TEST(retSize3 == size4);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl3 = w1.SizeForEgl();
+ TEST(retSizeForEgl3 == size4);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
@@ -1901,6 +2095,11 @@
// w1 State 1
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
}
end.UniversalTime();
@@ -1989,6 +2188,11 @@
{
TSize retSize1 = aWindow.Size();
TEST(retSize1 == aExpectedSize);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = aWindow.SizeForEgl();
+ TEST(retSizeForEgl1 == aExpectedSize);
+#endif
}
break;
case EFlushSession :
@@ -2138,6 +2342,11 @@
rws1_expectedSizePool.AppendL(expectedSize);
TSize retSize1 = win->Size();
TEST(retSize1 == expectedSize);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = win->SizeForEgl();
+ TEST(retSizeForEgl1 == expectedSize);
+#endif
}
// Windows for session 2 belonging to rws2_wg1
@@ -2158,6 +2367,11 @@
rws2_expectedSizePool.AppendL(expectedSize);
TSize retSize1 = win->Size();
TEST(retSize1 == expectedSize);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = win->SizeForEgl();
+ TEST(retSizeForEgl1 == expectedSize);
+#endif
}
// Windows for session 2 belonging to rws2_wg2
@@ -2180,6 +2394,11 @@
rws2_expectedSizePool.AppendL(expectedSize);
TSize retSize1 = win->Size();
TEST(retSize1 == expectedSize);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = win->SizeForEgl();
+ TEST(retSizeForEgl1 == expectedSize);
+#endif
}
// Stress system by performing actions on windows
@@ -2265,6 +2484,11 @@
expectedSizePool.AppendL(expectedSize);
TSize retSize1 = win->Size();
TEST(retSize1 == expectedSize);
+
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = win->SizeForEgl();
+ TEST(retSizeForEgl1 == expectedSize);
+#endif
}
// Stress system by performing actions on windows
@@ -2320,6 +2544,11 @@
TSize retSize1 = w1.Size();
TEST(retSize1 == size1);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl1 = w1.SizeForEgl();
+ TEST(retSizeForEgl1 == size1);
+#endif
+
// w1 State 2
TSize size2 (20002,223);
w1.SetSize(size2);
@@ -2336,6 +2565,11 @@
TSize retSize2 = w1.Size();
TEST(retSize2 == size2);
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+ TSize retSizeForEgl2 = w1.SizeForEgl();
+ TEST(retSizeForEgl2 == size2);
+#endif
+
// w1 State Final
CleanupStack::Pop();
w1.Close();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/data/ini/graphics-wserv-nativeorientation.ini Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,23 @@
+[default]
+testId = 0
+[graphics-wserv-0733]
+testId = 733
+[graphics-wserv-0734]
+testId = 734
+[graphics-wserv-0735]
+testId = 735
+[graphics-wserv-0736]
+testId = 736
+[graphics-wserv-0737]
+testId = 737
+[graphics-wserv-0738]
+testId = 738
+[graphics-wserv-0739]
+testId = 739
+[graphics-wserv-0740]
+testId = 740
+[graphics-wserv-0741]
+testId = 741
+[graphics-wserv-0742]
+testId = 742
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/group/bld.inf Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,27 @@
+// Copyright (c) 2008-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
+//@internalComponent
+
+PRJ_TESTEXPORTS
+../rom/t_nativeorientation.iby /epoc32/rom/include/t_nativeorientation.iby
+
+../scripts/graphics-wserv-nativeorientation-test.script z:/wstest/tnativeorientation/graphics-wserv-nativeorientation-test.script
+../data/ini/graphics-wserv-nativeorientation.ini z:/wstest/tnativeorientation/graphics-wserv-nativeorientation.ini
+
+PRJ_TESTMMPFILES
+t_nativeorientationserver.mmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/group/t_nativeorientationserver.mmp Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,44 @@
+// Copyright (c) 2008-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
+@internalComponent
+*/
+
+TARGET t_nativeorientationserver.exe
+TARGETTYPE exe
+UID 0x1000007A 0xA000E629
+VENDORID 0x70000001
+
+SOURCEPATH ../src
+SOURCE t_nativeorientationserver.cpp
+SOURCE t_nativeorientationtest.cpp
+
+USERINCLUDE ../inc
+
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY testexecuteutils.lib
+LIBRARY testexecutelogclient.lib
+LIBRARY efsrv.lib
+LIBRARY ws32.lib
+LIBRARY surfacemanager.lib
+LIBRARY surfaceupdateclient.lib
+LIBRARY gdi.lib
+
+SMPSAFE
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/inc/t_nativeorientationserver.h Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,40 @@
+// Copyright (c) 2008-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
+@internalComponent
+*/
+
+#ifndef __T_NATIVEORIENTATION_SERVER_H__
+#define __T_NATIVEORIENTATION_SERVER_H__
+
+#include <test/testexecuteserverbase.h>
+
+// Entry point
+GLDEF_C TInt E32Main(void);
+
+class CT_NativeOrientationServer : public CTestServer
+ {
+public:
+ static CT_NativeOrientationServer* NewL();
+ virtual CTestStep* CreateTestStep(const TDesC& aStepName);
+
+protected:
+ void ConstructL();
+ };
+
+#endif // __T_NATIVEORIENTATION_SERVER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/inc/t_nativeorientationtest.h Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,63 @@
+// Copyright (c) 2008-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
+@internalComponent
+*/
+
+#ifndef __T_NATIVEORIENTATIONTEST_H__
+#define __T_NATIVEORIENTATIONTEST_H__
+
+#include <w32std.h>
+#include <test/testexecutestepbase.h>
+#include <graphics/surfacemanager.h>
+#include <graphics/surfaceupdateclient.h>
+#include <graphics/surfaceconfiguration.h>
+
+_LIT(KT_NativeOrientationTestStep,"T_NativeOrientationTestStep");
+
+class CT_NativeOrientationTest : public CTestStep
+ {
+public:
+ CT_NativeOrientationTest();
+ ~CT_NativeOrientationTest();
+ // from CTestStep
+ virtual enum TVerdict doTestStepPreambleL();
+ virtual enum TVerdict doTestStepL();
+ virtual enum TVerdict doTestStepPostambleL();
+
+private:
+ // Test cases
+ void GRAPHICS_WSERV_0733L();
+ void GRAPHICS_WSERV_0734L();
+ void GRAPHICS_WSERV_0735L();
+ void GRAPHICS_WSERV_0736L();
+ void GRAPHICS_WSERV_0737L();
+ void GRAPHICS_WSERV_0738L();
+ void GRAPHICS_WSERV_0739L();
+ void GRAPHICS_WSERV_0740L();
+ void GRAPHICS_WSERV_0741L();
+ void GRAPHICS_WSERV_0742L();
+ void CreateSurfaceAttributes(RSurfaceManager::TSurfaceCreationAttributesBuf&, const TSize&);
+ void FillSurfaceL(TSurfaceId&, const TRgb&, RSurfaceManager&, RSurfaceUpdateSession&);
+
+private: // Data members
+ TInt iTestId;
+ RWsSession iWs;
+ };
+
+#endif // __T_NATIVEORIENTATIONTEST_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/rom/t_nativeorientation.iby Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,27 @@
+// Copyright (c) 2008-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:
+//
+
+#if (!defined __T_NATIVEORIENTATION_IBY__)
+#define __T_NATIVEORIENTATION_IBY__
+
+#include <testexecute.iby>
+#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+file=ABI_DIR\DEBUG_DIR\t_nativeorientationserver.exe \sys\bin\t_nativeorientationserver.exe
+
+data=EPOCROOT##epoc32\data\z\wstest\tnativeorientation\graphics-wserv-nativeorientation-test.script \wstest\tnativeorientation\graphics-wserv-nativeorientation-test.script
+data=EPOCROOT##epoc32\data\z\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini \wstest\tnativeorientation\graphics-wserv-nativeorientation.ini
+#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
+
+#endif // __T_NATIVEORIENTATION_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/scripts/graphics-wserv-nativeorientation-test.script Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,58 @@
+// Copyright (c) 2008-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:
+//
+
+LOAD_SUITE t_nativeorientationserver
+DELAY 10
+
+START_TESTCASE GRAPHICS-WSERV-0733
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=85 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0733
+END_TESTCASE GRAPHICS-WSERV-0733
+
+START_TESTCASE GRAPHICS-WSERV-0734
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=85 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0734
+END_TESTCASE GRAPHICS-WSERV-0734
+
+START_TESTCASE GRAPHICS-WSERV-0735
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=85 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0735
+END_TESTCASE GRAPHICS-WSERV-0735
+
+START_TESTCASE GRAPHICS-WSERV-0736
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=85 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0736
+END_TESTCASE GRAPHICS-WSERV-0736
+
+START_TESTCASE GRAPHICS-WSERV-0737
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=85 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0737
+END_TESTCASE GRAPHICS-WSERV-0737
+
+START_TESTCASE GRAPHICS-WSERV-0738
+RUN_TEST_STEP !Heap=0x200000 50 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0738
+END_TESTCASE GRAPHICS-WSERV-0738
+
+START_TESTCASE GRAPHICS-WSERV-0739
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=85 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0739
+END_TESTCASE GRAPHICS-WSERV-0739
+
+START_TESTCASE GRAPHICS-WSERV-0740
+RUN_TEST_STEP !Heap=0x200000 50 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0740
+END_TESTCASE GRAPHICS-WSERV-0740
+
+START_TESTCASE GRAPHICS-WSERV-0741
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=85 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0741
+END_TESTCASE GRAPHICS-WSERV-0741
+
+START_TESTCASE GRAPHICS-WSERV-0742
+RUN_TEST_STEP !Heap=0x200000 !PanicCode=3 t_nativeorientationserver T_NativeOrientationTestStep z:\wstest\tnativeorientation\graphics-wserv-nativeorientation.ini graphics-wserv-0742
+END_TESTCASE GRAPHICS-WSERV-0742
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/src/t_nativeorientationserver.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,113 @@
+// Copyright (c) 2008-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
+@internalComponent
+*/
+
+// User Includes
+#include "t_nativeorientationserver.h"
+#include "t_nativeorientationtest.h"
+
+_LIT(KTestServerName, "NativeOrientationTestServer");
+
+CT_NativeOrientationServer* CT_NativeOrientationServer::NewL()
+/**
+ * @return - Instance of the test server
+ * Same code for Secure and non-secure variants
+ * Called inside the MainL() function to create and start the
+ * CTestServer derived server.
+ */
+ {
+ CT_NativeOrientationServer* server = new (ELeave) CT_NativeOrientationServer;
+ CleanupStack::PushL(server);
+ server->ConstructL();
+ CleanupStack::Pop(server);
+ return server;
+ }
+
+void CT_NativeOrientationServer::ConstructL()
+ {
+ RProcess handle = RProcess();
+ TParsePtrC serverName(handle.FileName());
+ CTestServer::ConstructL(serverName.Name());
+ }
+
+LOCAL_C void MainL()
+ {
+ CActiveScheduler* sched=NULL;
+ sched=new(ELeave) CActiveScheduler;
+ CActiveScheduler::Install(sched);
+ CT_NativeOrientationServer* server = NULL;
+ // Create the CTestServer derived server
+ TRAPD(err,server = CT_NativeOrientationServer::NewL());
+ if(!err)
+ {
+ // Sync with the client and enter the active scheduler
+ RProcess::Rendezvous(KErrNone);
+ sched->Start();
+ }
+ else
+ {
+ RDebug::Print(_L("Server error=%d"), err);
+ }
+ delete server;
+ delete sched;
+ }
+
+/**
+ * @return - Standard Epoc error code on process exit
+ * Process entry point. Called by client using RProcess Integ
+ */
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ if(cleanup == NULL)
+ {
+ return KErrNoMemory;
+ }
+
+ TRAPD(err,MainL());
+ if (err)
+ {
+ _LIT(KMainErrorStatement, "CNativeOrientationTestServer MainL - Error: %d");
+ RDebug::Print(KMainErrorStatement, err);
+ User::Panic(KTestServerName, err);
+ }
+
+ delete cleanup;
+ __UHEAP_MARKEND;
+ return KErrNone;
+ }
+
+CTestStep* CT_NativeOrientationServer::CreateTestStep(const TDesC& aStepName)
+/**
+ * @return - A CTestStep derived instance
+ * Secure and non-secure variants
+ * Implementation of CTestServer pure virtual
+ */
+ {
+ CTestStep* testStep = NULL;
+
+ if ( aStepName==KT_NativeOrientationTestStep )
+ {
+ testStep=new CT_NativeOrientationTest();
+ }
+
+ return testStep;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_nativeorientation/src/t_nativeorientationtest.cpp Wed Mar 31 23:34:07 2010 +0300
@@ -0,0 +1,753 @@
+// Copyright (c) 2008-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
+@internalComponent
+*/
+
+#include "t_nativeorientationtest.h"
+
+_LIT(KT_NativeOrientationTestId,"testId");
+
+CT_NativeOrientationTest::CT_NativeOrientationTest()
+ {
+ SetTestStepName(KT_NativeOrientationTestStep);
+ }
+
+
+CT_NativeOrientationTest::~CT_NativeOrientationTest()
+ {
+ }
+
+
+enum TVerdict CT_NativeOrientationTest::doTestStepPreambleL()
+ {
+ TVerdict ret=CTestStep::doTestStepPreambleL();
+
+ User::LeaveIfError(iWs.Connect()); // Setup session to wserv
+ iWs.SetAutoFlush(EFalse);
+
+ if ( !GetIntFromConfig( ConfigSection(), KT_NativeOrientationTestId, iTestId ) )
+ {
+ INFO_PRINTF1(_L("ERROR: GetIntFromConfig() Failed!"));
+ User::Leave(KErrNotFound);
+ }
+ return ret;
+ }
+
+enum TVerdict CT_NativeOrientationTest::doTestStepPostambleL()
+ {
+ return TestStepResult();
+ }
+
+
+/**
+Starts test step
+@internalComponent
+@return TVerdict pass / fail
+@pre N/A
+@post N/A
+*/
+enum TVerdict CT_NativeOrientationTest::doTestStepL()
+ {
+ INFO_PRINTF1(_L("CT_NativeOrientation started"));
+ RDebug::Printf("CT_NativeOrientation started");
+
+ __UHEAP_MARK;
+
+ switch (iTestId)
+ {
+ case 733:
+ GRAPHICS_WSERV_0733L();
+ break;
+ case 734:
+ GRAPHICS_WSERV_0734L();
+ break;
+ case 735:
+ GRAPHICS_WSERV_0735L();
+ break;
+ case 736:
+ GRAPHICS_WSERV_0736L();
+ break;
+ case 737:
+ GRAPHICS_WSERV_0737L();
+ break;
+ case 738:
+ GRAPHICS_WSERV_0738L();
+ break;
+ case 739:
+ GRAPHICS_WSERV_0739L();
+ break;
+ case 740:
+ GRAPHICS_WSERV_0740L();
+ break;
+ case 741:
+ GRAPHICS_WSERV_0741L();
+ break;
+ case 742:
+ GRAPHICS_WSERV_0742L();
+ break;
+ default:
+ INFO_PRINTF1(_L("Bad Test Case Id"));
+ User::Panic(_L("Bad Test Case Id"), 999);
+ break;
+ }
+
+ iWs.Close();
+ __UHEAP_MARKEND;
+
+ INFO_PRINTF1(_L("CT_NativeOrientation completed!"));
+ RDebug::Printf("CT_NativeOrientation completed");
+ return TestStepResult();
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0742
+ @SYMTestCaseDesc FixNativeOrientation() on a window before Construct()
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create screen device
+ 2. Create group window
+ 3. Create test window
+ 4. Call FixNativeOrientation()
+ 5. Construct test window
+ @SYMTestExpectedResults Works normally.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0742L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0742L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0742L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+ myWin.Activate();
+ iWs.Finish();
+
+ delete scrDevice;
+
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0742L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0742L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0741
+ @SYMTestCaseDesc FixNativeOrientation() on a window after Activate()
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create screen device
+ 2. Create group window
+ 3. Create test window
+ 4. Activate test window
+ 5. Call FixNativeOrientation()
+ @SYMTestExpectedResults EWsWinOpFixNativeOrientation panic.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0741L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0741L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0741L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+ myWin.Activate();
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ iWs.Finish();
+
+ delete scrDevice;
+
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0741L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0741L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0740
+ @SYMTestCaseDesc SizeForEgl() returns same size as configured by SetSize()
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create screen device
+ 2. Create group window
+ 3. Create test window
+ 4. Activate test window
+ 5. Call SetSize(20,20)
+ 6. Call SizeForEgl()
+ @SYMTestExpectedResults SizeForEgl() returns same size as configured by SetSize()
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0740L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0740L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0740L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+ myWin.Activate();
+
+ TSize setSize(20,20);
+ myWin.SetSize(setSize);
+ TSize eglSize = myWin.SizeForEgl();
+ TEST(eglSize==setSize);
+ iWs.Finish();
+
+ delete scrDevice;
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0740L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0740L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0739
+ @SYMTestCaseDesc FixNativeOrientation() called twice on same window
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create screen device
+ 2. Create group window
+ 3. Create test window
+ 4. Call FixNativeOrientation()
+ 5. Call FixNativeOrientation()
+ @SYMTestExpectedResults EWsWinOpFixNativeOrientation panic.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0739L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0739L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0739L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ iWs.Finish();
+ nativeErr = myWin.FixNativeOrientation(); // Panic
+ iWs.Finish();
+
+ delete scrDevice;
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0739L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0739L"));
+ }
+
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0738
+ @SYMTestCaseDesc SizeForEgl() returns same size as configured by SetSize()
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create screen device
+ 2. Create group window
+ 3. Create test window
+ 4. Activate test window
+ 5. Call SetSize(60,40)
+ 6. Call SizeForEgl() (check size is (60,40)
+ 7. Call FixNativeOrientation()
+ 8. Call SetSize(40,60)
+ 9. Call SizeForEgl() (check size is (60,40)
+ @SYMTestExpectedResults SizeForEgl() returns same size as configured by SetSize()
+ prior to FixNativeOrientation(), i.e. subsequent SetSize()
+ does not affect SizeForEgl()
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0738L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0738L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0738L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+
+ TSize setSize(60,40);
+ myWin.SetSize(setSize);
+ TSize eglSize = myWin.SizeForEgl();
+ TEST(eglSize==setSize);
+ TSize winSize = myWin.Size();
+ TEST(winSize==setSize);
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+
+ eglSize = myWin.SizeForEgl();
+ TEST(eglSize==setSize);
+ winSize = myWin.Size();
+ TEST(winSize==setSize);
+
+ TSize setSize2(40,60);
+ myWin.SetSize(setSize2);
+ eglSize = myWin.SizeForEgl();
+ TEST(eglSize==setSize);
+ winSize = myWin.Size();
+ TEST(winSize==setSize2);
+
+ iWs.Finish();
+ myWin.Close();
+ grpWin.Close();
+ delete scrDevice;
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0738L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0738L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0737
+ @SYMTestCaseDesc FixNativeOrientation() without primary screen device
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create group window
+ 2. Create test window
+ 3. Call FixNativeOrientation()
+ @SYMTestExpectedResults EWsWinOpFixNativeOrientation panic.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0737L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0737L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0737L"));
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ iWs.Finish();
+
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0737L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0737L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0736
+ @SYMTestCaseDesc SetBackgroundSurface() without primary screen device
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create group window
+ 2. Create test window
+ 3. Call FixNativeOrientation()
+ 4. Create Surface
+ 5. Delete screen device
+ 6. SetBackgroundSurface()
+ @SYMTestExpectedResults EWsWinOpFixNativeOrientation panic.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0736L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0736L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0736L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ myWin.Activate();
+ iWs.Finish();
+
+ RSurfaceManager surfaceManager;
+ User::LeaveIfError(surfaceManager.Open());
+
+ RSurfaceManager::TSurfaceCreationAttributesBuf backgroundBuf;
+ CreateSurfaceAttributes(backgroundBuf,myWin.Size());
+
+ RSurfaceUpdateSession surfaceUpdateSession;
+ User::LeaveIfError(surfaceUpdateSession.Connect());
+
+ TSurfaceId surfaceId = TSurfaceId::CreateNullId();
+ User::LeaveIfError(surfaceManager.CreateSurface(backgroundBuf, surfaceId));
+
+ TSurfaceConfiguration surfaceConfig;
+ surfaceConfig.SetSurfaceId(surfaceId);
+ surfaceConfig.SetViewport(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetExtent(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetOrientation(CFbsBitGc::EGraphicsOrientationNormal);
+
+ TRgb backgroundColor = TRgb(255,255,255,255);
+ FillSurfaceL(surfaceId, backgroundColor, surfaceManager, surfaceUpdateSession);
+
+ delete scrDevice;
+ User::LeaveIfError(myWin.SetBackgroundSurface(surfaceConfig, ETrue));
+
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0736L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0736L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0735
+ @SYMTestCaseDesc Trigger background color draw without primary screen device
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create group window
+ 2. Create test window
+ 3. Call FixNativeOrientation()
+ 4. Create Surface
+ 5. SetBackgroundSurface()
+ 6. Delete screen device
+ 7. Trigger background color draw
+ @SYMTestExpectedResults EWsWinOpFixNativeOrientation panic.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0735L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0735L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0735L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ myWin.Activate();
+ iWs.Finish();
+
+ RSurfaceManager surfaceManager;
+ User::LeaveIfError(surfaceManager.Open());
+
+ RSurfaceManager::TSurfaceCreationAttributesBuf backgroundBuf;
+ CreateSurfaceAttributes(backgroundBuf,myWin.Size());
+
+ RSurfaceUpdateSession surfaceUpdateSession;
+ User::LeaveIfError(surfaceUpdateSession.Connect());
+
+ TSurfaceId surfaceId = TSurfaceId::CreateNullId();
+ User::LeaveIfError(surfaceManager.CreateSurface(backgroundBuf, surfaceId));
+
+ TSurfaceConfiguration surfaceConfig;
+ surfaceConfig.SetSurfaceId(surfaceId);
+ surfaceConfig.SetViewport(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetExtent(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetOrientation(CFbsBitGc::EGraphicsOrientationNormal);
+
+ TRgb backgroundColor = TRgb(255,255,255,255);
+ FillSurfaceL(surfaceId, backgroundColor, surfaceManager, surfaceUpdateSession);
+ User::LeaveIfError(myWin.SetBackgroundSurface(surfaceConfig, ETrue));
+
+ delete scrDevice;
+ myWin.Invalidate();
+ myWin.BeginRedraw();
+ myWin.EndRedraw();
+ iWs.Finish();
+
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0735L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0735L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0734
+ @SYMTestCaseDesc Change window position without primary screen device
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create group window
+ 2. Create test window
+ 3. Call FixNativeOrientation()
+ 4. Create Surface
+ 5. SetBackgroundSurface()
+ 6. Delete screen device
+ 7. Change window position
+ @SYMTestExpectedResults EWsWinOpFixNativeOrientation panic.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0734L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0734L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0734L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ myWin.Activate();
+ iWs.Finish();
+
+ RSurfaceManager surfaceManager;
+ User::LeaveIfError(surfaceManager.Open());
+
+ RSurfaceManager::TSurfaceCreationAttributesBuf backgroundBuf;
+ CreateSurfaceAttributes(backgroundBuf,myWin.Size());
+
+ RSurfaceUpdateSession surfaceUpdateSession;
+ User::LeaveIfError(surfaceUpdateSession.Connect());
+
+ TSurfaceId surfaceId = TSurfaceId::CreateNullId();
+ User::LeaveIfError(surfaceManager.CreateSurface(backgroundBuf, surfaceId));
+
+ TSurfaceConfiguration surfaceConfig;
+ surfaceConfig.SetSurfaceId(surfaceId);
+ surfaceConfig.SetViewport(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetExtent(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetOrientation(CFbsBitGc::EGraphicsOrientationNormal);
+
+ TRgb backgroundColor = TRgb(255,255,255,255);
+ FillSurfaceL(surfaceId, backgroundColor, surfaceManager, surfaceUpdateSession);
+ User::LeaveIfError(myWin.SetBackgroundSurface(surfaceConfig, ETrue));
+
+ delete scrDevice;
+ myWin.SetPosition(TPoint(40,40));
+ iWs.Finish();
+
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0734L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0734L"));
+ }
+
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0733
+ @SYMTestCaseDesc Change window size without primary screen device
+ @SYMPREQ 66527
+ @SYMREQ 417-66527
+ @SYMPrerequisites
+ @SYMTestType CT (Component Test)
+ @SYMTestActions 1. Create group window
+ 2. Create test window
+ 3. Call FixNativeOrientation()
+ 4. Create Surface
+ 5. SetBackgroundSurface()
+ 6. Delete screen device
+ 7. Change window size
+ @SYMTestExpectedResults EWsWinOpFixNativeOrientation panic.
+*/
+void CT_NativeOrientationTest::GRAPHICS_WSERV_0733L()
+ {
+ RDebug::Printf("Entering test GRAPHICS_WSERV_0733L");
+ INFO_PRINTF1(_L("Entering test GRAPHICS_WSERV_0733L"));
+ CWsScreenDevice* scrDevice = new (ELeave) CWsScreenDevice(iWs);
+ User::LeaveIfError(scrDevice->Construct());
+
+ RWindowGroup grpWin = RWindowGroup(iWs);
+ User::LeaveIfError(grpWin.Construct((TUint32)&grpWin));
+
+ RWindow myWin = RWindow(iWs);
+ User::LeaveIfError(myWin.Construct(grpWin, (TUint32)&myWin));
+ myWin.SetExtent(TPoint(0,0), scrDevice->SizeInPixels());
+
+ TInt nativeErr = myWin.FixNativeOrientation();
+ TEST(nativeErr==KErrNone);
+ myWin.Activate();
+ iWs.Finish();
+
+ RSurfaceManager surfaceManager;
+ User::LeaveIfError(surfaceManager.Open());
+
+ RSurfaceManager::TSurfaceCreationAttributesBuf backgroundBuf;
+ CreateSurfaceAttributes(backgroundBuf,myWin.Size());
+
+ RSurfaceUpdateSession surfaceUpdateSession;
+ User::LeaveIfError(surfaceUpdateSession.Connect());
+
+ TSurfaceId surfaceId = TSurfaceId::CreateNullId();
+ User::LeaveIfError(surfaceManager.CreateSurface(backgroundBuf, surfaceId));
+
+ TSurfaceConfiguration surfaceConfig;
+ surfaceConfig.SetSurfaceId(surfaceId);
+ surfaceConfig.SetViewport(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetExtent(TRect(TPoint(0,0),scrDevice->SizeInPixels()));
+ surfaceConfig.SetOrientation(CFbsBitGc::EGraphicsOrientationNormal);
+
+ TRgb backgroundColor = TRgb(255,255,255,255);
+ FillSurfaceL(surfaceId, backgroundColor, surfaceManager, surfaceUpdateSession);
+ User::LeaveIfError(myWin.SetBackgroundSurface(surfaceConfig, ETrue));
+
+ delete scrDevice;
+ myWin.SetSize(TSize(27,29));
+ iWs.Finish();
+
+ RDebug::Printf("Completed test GRAPHICS_WSERV_0733L");
+ INFO_PRINTF1(_L("Completed test GRAPHICS_WSERV_0733L"));
+ }
+
+void CT_NativeOrientationTest::CreateSurfaceAttributes(RSurfaceManager::TSurfaceCreationAttributesBuf& aBuffer , const TSize& aSize)
+ {
+ RSurfaceManager::TSurfaceCreationAttributes& b = aBuffer();
+
+ b.iSize.iWidth = aSize.iWidth;
+ b.iSize.iHeight = aSize.iHeight;
+ b.iBuffers = 1; // number of buffers in the surface
+ b.iPixelFormat = EUidPixelFormatARGB_8888;
+ b.iStride = aSize.iWidth * 4; // Number of bytes between start of one line and start of next
+ b.iOffsetToFirstBuffer = 0; // way of reserving space before the surface pixel data
+ b.iAlignment = 4; // alignment, 1,2,4,8 byte aligned
+ b.iContiguous = EFalse;
+ b.iMappable = ETrue;
+ }
+
+void CT_NativeOrientationTest::FillSurfaceL(TSurfaceId& aSurface, const TRgb& aColor, RSurfaceManager& surfaceManager, RSurfaceUpdateSession& surfaceUpdateSession)
+ {
+ RSurfaceManager::TInfoBuf infoBuf;
+ RSurfaceManager::TSurfaceInfoV01& info = infoBuf();
+
+ User::LeaveIfError(surfaceManager.SurfaceInfo(aSurface, infoBuf));
+ TUint32 color = 0;
+ TBool use16 = EFalse;
+
+ if (info.iSize.iHeight<0 || info.iSize.iWidth<0 || info.iStride<0)
+ {
+ User::Leave(KErrCorrupt);
+ }
+ if (info.iSize.iHeight==0 || info.iSize.iWidth==0 || info.iStride==0)
+ {
+ User::Leave(KErrNotReady);
+ }
+
+ switch (info.iPixelFormat)
+ {
+ case EUidPixelFormatXRGB_8888:
+ {
+ color = aColor.Color16MU();
+#ifdef ALPHA_FIX_24BIT
+ color |= ((ALPHA_FIX_24BIT)&0xff)<<24;
+#endif
+ break;
+ }
+ case EUidPixelFormatARGB_8888:
+ {
+ color = aColor.Color16MA();
+ break;
+ }
+ case EUidPixelFormatARGB_8888_PRE:
+ {
+ color = aColor.Color16MAP();
+ break;
+ }
+ case EUidPixelFormatXRGB_4444:
+ case EUidPixelFormatARGB_4444:
+ {
+ color = aColor.Color4K();
+ use16 = ETrue;
+ break;
+ }
+ case EUidPixelFormatRGB_565:
+ {
+ color = aColor.Color64K();
+ use16 = ETrue;
+ break;
+ }
+ default:
+ {
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ }
+
+ RChunk chunk;
+ User::LeaveIfError(surfaceManager.MapSurface(aSurface, chunk));
+ CleanupClosePushL(chunk);
+
+ TInt offsetToFirstBuffer;
+ User::LeaveIfError(surfaceManager.GetBufferOffset(aSurface, 0, offsetToFirstBuffer));
+ TUint8* surfacePtr = chunk.Base() + offsetToFirstBuffer;
+ TUint8* linePtr = surfacePtr;
+
+ if (use16)
+ {
+ if ( info.iSize.iWidth*2>info.iStride)
+ {
+ User::Leave(KErrOverflow);
+ }
+ TUint16* ptr = reinterpret_cast<TUint16*>(surfacePtr);
+
+ // Fill first line
+ for (TInt xx = 0; xx < info.iSize.iWidth; xx++)
+ {
+ ptr[xx] = (TUint16)color;
+ }
+ }
+ else
+ {
+ if ( info.iSize.iWidth*4>info.iStride)
+ {
+ User::Leave(KErrOverflow);
+ }
+ TUint32* ptr = reinterpret_cast<TUint32*>(surfacePtr);
+
+ // Fill first line
+ for (TInt xx = 0; xx < info.iSize.iWidth; xx++)
+ {
+ ptr[xx] = color;
+ }
+ }
+
+ // Now copy that to the other lines
+ for (TInt yy = 1; yy < info.iSize.iHeight; yy++)
+ {
+ linePtr += info.iStride;
+ Mem::Copy(linePtr, surfacePtr, info.iSize.iWidth * 4);
+ }
+
+ TInt err = surfaceUpdateSession.SubmitUpdate(0, aSurface, 0, NULL);
+ if (err!=KErrNone)
+ RDebug::Printf("Error submitting update: 0x%X\n", err);
+
+ CleanupStack::PopAndDestroy(/* chunk */);
+ }
--- a/windowing/windowserver/wins_switching/ws32_stubs.h Mon Mar 15 12:45:41 2010 +0200
+++ b/windowing/windowserver/wins_switching/ws32_stubs.h Wed Mar 31 23:34:07 2010 +0300
@@ -5202,6 +5202,25 @@
_asm mov eax, 576
_asm jmp common_dispatch
}
+
+__declspec(dllexport)
+__declspec(naked)
+void call_vector_577 ()
+ {
+ // ; class TSize RWindowBase::SizeForEgl(void) const
+ _asm mov eax, 577
+ _asm jmp common_dispatch
+ }
+
+__declspec(dllexport)
+__declspec(naked)
+void call_vector_578 ()
+ {
+ // ; int RWindowBase::FixNativeOrientation(void)
+ _asm mov eax, 578
+ _asm jmp common_dispatch
+ }
+
}
-#define MAX_ORDINAL 577
-
+#define MAX_ORDINAL 579
+