diff -r 000000000000 -r 5d03bc08d59c graphicstest/uibench/src/tflipframerate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicstest/uibench/src/tflipframerate.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,292 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include +#include +#include "tflipframerate.h" + +#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE +const TInt KWindowGroupHandle = 1; +const TInt KWindowHandle = 2; + +const TInt KTextPhraseFontSize = 40; +const TReal KTextPhraseSpeed = 200.f; + +const TRgb KBackgroundColour = TRgb(255, 127, 0); // Orange +const TRgb KBrushColour = TRgb(255, 255, 0); // Yellow +const TRgb KPenColour = TRgb(0, 0, 255, 255); // Blue + +const TUint KMinFrames = 51;// uibench, needs more than 50 results for the trimmed mean + +_LIT(KTextPhrase, "Flip Performance"); + +TVerdict CTFlipFramerate::doTestStepPreambleL() + { + // Window related Setup + // Connect to windows server session + TESTL(KErrNone==iWs.Connect()); + + // Make device for this session + iScreenDev = new (ELeave) CWsScreenDevice(iWs); + TESTL(KErrNone==iScreenDev->Construct(KSgScreenIdMain)); + + // Create a window group + iWinGroup = RWindowGroup(iWs); + TESTL(KErrNone==iWinGroup.Construct(KWindowGroupHandle)); + + // Create a window with the window group as a parent + iWindow = RWindow(iWs); + TESTL(KErrNone==iWindow.Construct(iWinGroup, KWindowHandle)); + + // Activate window and set visible + iWindow.Activate(); + iWindow.SetVisible(ETrue); + + // Connect to surface update session + TESTL(KErrNone==iUpdateSession.Connect()); + CTDirectGdiTestBase::doTestStepPreambleL(); + iContext = CDirectGdiContext::NewL(*iDGdiDriver); + + // Image Related Setup + // Setup off screen image + iSurfaceSize=iWindow.Size(); + iImageInfo.iSizeInPixels = iSurfaceSize; + iImageInfo.iPixelFormat = EUidPixelFormatXRGB_8888; + iImageInfo.iCpuAccess = ESgCpuAccessNone; + iImageInfo.iUsage = ESgUsageOpenGlesTarget| ESgUsageDirectGdiSource | ESgUsageDirectGdiTarget; + iImageInfo.iShareable = ETrue; + iImageInfo.iScreenId = iScreenDev->GetScreenNumber(); + + TESTL(KErrNone==iImgCol.Create(iImageInfo, 1)); + TESTL(KErrNone==iImgCol.OpenImage(0, iImage)); + + TESTL(KErrNone==iDGdiImageTarget->Create(iImage)); + + TESTL(KErrNone==iSurfaceConfiguration.SetSurfaceId(iImgCol.SurfaceId())); + TESTL(KErrNone==iSurfaceConfiguration.SetExtent(iWindow.Size())); + + GetFontL(); + + TInt fastCounterFrequency; + TESTL(KErrNone==HAL::Get(HALData::EFastCounterFrequency, fastCounterFrequency)); + + // Initialise text scrolling variables + iTextPhraseSpeed = KTextPhraseSpeed / fastCounterFrequency; + iLastFrameTime = User::FastCounter(); + + return TestStepResult(); + } + +TVerdict CTFlipFramerate::doTestStepPostambleL() + { + iImage.Close(); + iImgCol.Close(); + + CTDirectGdiTestBase::doTestStepPostambleL(); + + delete iContext; + iWindow.Close(); + iWinGroup.Close(); + + iUpdateSession.Close(); + delete iScreenDev; + iWs.Close(); + + iTsStore->ReleaseFont(iFont); + delete iTsStore; + iTsStore = NULL; + return TestStepResult(); + } + +/** +Set-up a font to be used in the rendering +*/ +void CTFlipFramerate::GetFontL() + { + _LIT(KFontFamily, "NewCourier"); + iTsStore = CFbsTypefaceStore::NewL(NULL); + TFontSpec spec(KFontFamily, KTextPhraseFontSize); + spec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap); + spec.iFontStyle.SetStrokeWeight(EStrokeWeightBold); + TESTL(KErrNone==iTsStore->GetNearestFontInPixels(iFont, spec)); + + iTextPhraseLength = iFont->MeasureText(KTextPhrase, NULL, NULL); + } + +/** +Draw some content +*/ +void CTFlipFramerate::RenderL() + { + iContext->Activate(*iDGdiImageTarget); + iContext->SetBrushColor(KBackgroundColour); + iContext->Clear(); + + // Draw Text + iContext->SetFont(iFont); + iContext->SetBrushStyle(DirectGdi::ENullBrush); + TPoint textPos(iTextPos,iSurfaceSize.iHeight/2); + + TReal fastCounter = User::FastCounter(); + + if(fastCounter(KMaxTUint) + fastCounter; + iTextPos+=(iTextPhraseSpeed * (actualCount-iLastFrameTime)); + } + else + { + iTextPos+=(iTextPhraseSpeed * (fastCounter-iLastFrameTime)); + } + + iContext->SetBrushColor(KBrushColour); + iContext->SetPenColor(KPenColour); + iContext->DrawText(KTextPhrase,NULL, textPos); + + // Update the last frame time, used to animate that which is drawn in RenderL() + iLastFrameTime = User::FastCounter(); + + iDGdiDriver->Finish(); + } + +/* +Set the size of the displayed window as a fraction of the screens size. + +@param aWindowSizeDivisor Controls the displayed window size +*/ +void CTFlipFramerate::SetSizeL(const TScreenSizeDivisors aWindowSizeDivisor) + { + TSize size = iScreenDev->SizeInPixels(); + size.iHeight/=aWindowSizeDivisor; + size.iWidth/=aWindowSizeDivisor; + iWindow.SetSize(size); + iImageInfo.iSizeInPixels = size; + TESTL(KErrNone==iSurfaceConfiguration.SetExtent(size)); + } + +/* +Time how long it takes to display a submitted update + +@param aIsFlipped Whether or not the surface is to be vertically flipped before it it displayed +@param aWindowSizeDivisor Controls the displayed window size to be tested +@param aOrientation The surface rotation to be tested +@param aStepName The name of the test, for logging. +*/ +void CTFlipFramerate::TestFramerateOrientationL( const TFlipped aIsFlipped, + const TScreenSizeDivisors aWindowSizeDivisor, + const CFbsBitGc::TGraphicsOrientation aOrientation) + { + // Simulate small sized window (e.g. like video call) and implicitly disable fast pathing. + SetSizeL(aWindowSizeDivisor); + + // Set-up the timer + iProfiler->InitResults(); + + TESTL(KErrNone==iSurfaceConfiguration.SetOrientation(aOrientation)); + TESTL(KErrNone==iSurfaceConfiguration.SetFlip(aIsFlipped)); + TESTL(KErrNone==iWindow.SetBackgroundSurface(iSurfaceConfiguration, ETrue)); + + TRequestStatus availabilityStatus; + TRequestStatus displayedStatus; + TTimeStamp dummyTimeStamp; + TInt framesDone=0; + + iUpdateSession.NotifyWhenAvailable(availabilityStatus); + TESTL(KErrNone==iUpdateSession.SubmitUpdate(KSgScreenIdMain, iImgCol.SurfaceId(), 0)); + + // uibench, needs more than 50 results for the trimmed mean, so repeat as required. + while(framesDone < KMinFrames) + { + iTextPos = -iTextPhraseLength; // enter stage left + + // scroll the text from left to right across the surface. + while(iTextPos<=iSurfaceSize.iWidth) + { + User::WaitForRequest(availabilityStatus); + // Draw something + RenderL(); + + // Request Notifications + iUpdateSession.NotifyWhenAvailable(availabilityStatus); + iUpdateSession.NotifyWhenDisplayed(displayedStatus, dummyTimeStamp); + + // Start Timer & Submit Update + iProfiler->StartTimer(); + TESTL(KErrNone==iUpdateSession.SubmitUpdate(KSgScreenIdMain, iImgCol.SurfaceId(), 0)); + + // Wait for the update to have been displayed and stop the timer + User::WaitForRequest(displayedStatus); + iProfiler->MarkResultSetL(); + framesDone++; + } + } + iProfiler->ResultsAnalysis(KTFlipFramerate,aOrientation,ENone,iScreenDev->CurrentScreenMode(),framesDone); + } + +void CTFlipFramerate::TestStepFramerateL( const TFlipped aIsFlipped, + const TScreenSizeDivisors aWindowSizeDivisor, + const TDesC& aStepName) + { + SetTestStepID(aStepName); + TestFramerateOrientationL(aIsFlipped, aWindowSizeDivisor, CFbsBitGc::EGraphicsOrientationNormal); + TestFramerateOrientationL(aIsFlipped, aWindowSizeDivisor, CFbsBitGc::EGraphicsOrientationRotated90); + TestFramerateOrientationL(aIsFlipped, aWindowSizeDivisor, CFbsBitGc::EGraphicsOrientationRotated180); + TestFramerateOrientationL(aIsFlipped, aWindowSizeDivisor, CFbsBitGc::EGraphicsOrientationRotated270); + RecordTestResultL(); + } +#endif + +TVerdict CTFlipFramerate::doTestStepL() + { +#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE + INFO_PRINTF1(_L("CTBitBltPerfDirectGdi can only be run with RSgImage legacy")); + return TestStepResult(); +#else + // Test to allow comparison between flipped and non-flipped performance + // This is because camera data needs to be flipped abuot vertical axis to show the user what they expect, + // e.g. during a voice call. + // No API exists for a flip about a vertical axis so this is achieved by a flip about horizontal axis, + // and a 180degree rotation. + // Therefore this test generates results for flipped and non-flipped performance at all four orientations. + // Additionally it tests at both full screen and quarter screen. It does this for two reasons :- + // 1) Full screen, non-flipped, non-rotated can be (and at the time of writing is) fast-pathed. + // This makes it awkward to use as a comparison. + // 2) Some use-cases are likely to use a non-fullscreen window, e.g. voice call. +#ifdef __WINS__ + INFO_PRINTF1(_L("Fullscreen, NotFlipped")); + TestStepFramerateL(ENotFlipped,EScreensizeFull,_L("GRAPHICS-UI-BENCH-0173")); + INFO_PRINTF1(_L("Fullscreen, Flipped")); + TestStepFramerateL(EFlipped,EScreensizeFull,_L("GRAPHICS-UI-BENCH-0174")); + INFO_PRINTF1(_L("Quarterscreen, NotFlipped")); + TestStepFramerateL(ENotFlipped,EScreenSizeQuarter,_L("GRAPHICS-UI-BENCH-0175")); + INFO_PRINTF1(_L("Quarterscreen, Flipped")); + TestStepFramerateL(EFlipped,EScreenSizeQuarter,_L("GRAPHICS-UI-BENCH-0176")); + + CloseTMSGraphicsStep(); + return TestStepResult(); +#else + INFO_PRINTF1(_L("Flip tests are running on emulator only, tests skipped.")); + return TestStepResult(); +#endif +#endif //SYMBIAN_GRAPHICS_EGL_SGIMAGELITE + } +