sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent sl@0: */ sl@0: sl@0: #include sl@0: #include sl@0: #include //UINT_MAX sl@0: sl@0: #include "t_testsurfacerasterizer.h" sl@0: sl@0: EXPORT_C CTestSurfaceRasterizer* CTestSurfaceRasterizer::NewL(const TSurfaceId& aSurfaceId, TInt aSurfaceScreenNumber, RSurfaceManager* aSurfaceManager) sl@0: { sl@0: RDebug::Print(_L("Creating CTestSurfaceRasterizer class\n")); sl@0: CTestSurfaceRasterizer* self = new (ELeave) CTestSurfaceRasterizer(); sl@0: CleanupStack::PushL(self); sl@0: TInt ret = self->ConstructL(aSurfaceId, aSurfaceScreenNumber, aSurfaceManager); sl@0: CleanupStack::Pop(); // self; sl@0: sl@0: if(ret) sl@0: { sl@0: return self; sl@0: } sl@0: else sl@0: { sl@0: return 0; sl@0: } sl@0: } sl@0: sl@0: TBool CTestSurfaceRasterizer::ConstructL(const TSurfaceId& aSurfaceId, TInt aSurfaceScreenNumber, RSurfaceManager* aSurfaceManager) sl@0: { sl@0: RDebug::Print(_L("Constructing CTestSurfaceRasterizer\n")); sl@0: sl@0: iSurfaceId = aSurfaceId; sl@0: sl@0: iSurfaceScreenNumber = aSurfaceScreenNumber; sl@0: sl@0: iSurfaceManager = aSurfaceManager; sl@0: sl@0: TInt err = iSurfaceManager->MapSurface(iSurfaceId, iChunk); sl@0: sl@0: if(err) sl@0: { sl@0: RDebug::Print(_L("Error mapping to surface\n")); sl@0: User::Exit(0); sl@0: } sl@0: sl@0: iInfoBuf.FillZ(); sl@0: sl@0: iSurfaceManager->SurfaceInfo(iSurfaceId, iInfoBuf); sl@0: sl@0: return ETrue; sl@0: } sl@0: sl@0: EXPORT_C CTestSurfaceRasterizer::CTestSurfaceRasterizer() sl@0: { sl@0: } sl@0: sl@0: CTestSurfaceRasterizer::~CTestSurfaceRasterizer() sl@0: { sl@0: iChunk.Close(); sl@0: } sl@0: sl@0: EXPORT_C void CTestSurfaceRasterizer::DrawRect(TUint32* aBuffer, SurfaceDetails& aSurfDetails) sl@0: { sl@0: //Send the fullscreen bitmap to the test rasterizer sl@0: sl@0: RSurfaceManager::TSurfaceInfoV01& info = iInfoBuf(); sl@0: sl@0: aSurfDetails.aSurfaceId = iSurfaceId; sl@0: aSurfDetails.aSurfaceSize = info.iSize; sl@0: aSurfDetails.aBufferNumber = iSurfaceCurrentBuffer; sl@0: sl@0: sl@0: TInt offsetToCurrentBuffer; sl@0: TInt err = iSurfaceManager->GetBufferOffset(iSurfaceId, iSurfaceCurrentBuffer, offsetToCurrentBuffer); sl@0: if(err != KErrNone) sl@0: { sl@0: RDebug::Print(_L("Could not open buffer number\n")); sl@0: return; sl@0: } sl@0: TUint32* surfaceBufferPtr = reinterpret_cast(iChunk.Base() + offsetToCurrentBuffer); sl@0: sl@0: TInt noOfBytes = (info.iStride * info.iSize.iHeight); sl@0: Mem::Move(surfaceBufferPtr, aBuffer, noOfBytes); sl@0: sl@0: iSurfaceCurrentBuffer++; sl@0: if(iSurfaceCurrentBuffer == info.iBuffers) sl@0: { sl@0: iSurfaceCurrentBuffer = 0; sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void CTestSurfaceRasterizer::PerfTestL(TInt aFrameNumber) sl@0: { sl@0: //Send the fullscreen bitmap to the test rasterizer sl@0: RChunk aChunk; sl@0: RSurfaceManager aManager; sl@0: User::LeaveIfError(aManager.Open()); sl@0: sl@0: TInt err = aManager.OpenSurface(iSurfaceId); sl@0: if(err!=KErrNone) sl@0: { sl@0: RDebug::Print(_L("Error opening a surface\n")); sl@0: User::Exit(0); sl@0: } sl@0: sl@0: err = aManager.MapSurface(iSurfaceId, aChunk); sl@0: if(err!=KErrNone) sl@0: { sl@0: RDebug::Print(_L("Error mapping to surface\n")); sl@0: User::Exit(0); sl@0: } sl@0: sl@0: RSurfaceManager::TInfoBuf InfoBuf; sl@0: RSurfaceManager::TSurfaceInfoV01& info = InfoBuf(); sl@0: InfoBuf.FillZ(); sl@0: sl@0: aManager.SurfaceInfo(iSurfaceId, InfoBuf); sl@0: sl@0: TInt noOfPixels = (info.iSize.iWidth * info.iSize.iHeight); sl@0: sl@0: TInt offsetToCurrentBuffer; sl@0: err = iSurfaceManager->GetBufferOffset(iSurfaceId, iSurfaceCurrentBuffer,offsetToCurrentBuffer); sl@0: if(err != KErrNone) sl@0: { sl@0: RDebug::Print(_L("Could not open buffer number\n")); sl@0: User::Exit(0); sl@0: } sl@0: TUint32* surfaceBufferPtr = reinterpret_cast(aChunk.Base() + offsetToCurrentBuffer); sl@0: sl@0: if(aFrameNumber < info.iBuffers) sl@0: { sl@0: TInt sector = aFrameNumber % info.iBuffers; sl@0: TInt offset = (noOfPixels * sector)/info.iBuffers; sl@0: Mem::Fill((surfaceBufferPtr + offset), noOfPixels, TChar(0xFF)); sl@0: } sl@0: sl@0: //Submit update sl@0: TRect rc[1] = sl@0: { sl@0: TRect(0, 0, info.iSize.iWidth, info.iSize.iHeight) sl@0: }; sl@0: sl@0: RRegion region(1, rc); sl@0: RSurfaceUpdateSession aSurfaceUpdateSession; sl@0: sl@0: err = aSurfaceUpdateSession.Connect(); sl@0: if (err!=KErrNone) sl@0: { sl@0: RDebug::Print(_L("error in connecting surface update session\n")); sl@0: User::Exit(0); sl@0: } sl@0: sl@0: TInt ret = aSurfaceUpdateSession.SubmitUpdate(KAllScreens, iSurfaceId, iSurfaceCurrentBuffer, ®ion); sl@0: sl@0: RDebug::Print(_L("Frame %d done\n"), aFrameNumber); sl@0: sl@0: if(ret != KErrNone) sl@0: { sl@0: RDebug::Print(_L("Error submitting update request\n")); sl@0: } sl@0: sl@0: iSurfaceCurrentBuffer++; sl@0: if(iSurfaceCurrentBuffer == info.iBuffers) sl@0: { sl@0: iSurfaceCurrentBuffer = 0; sl@0: } sl@0: sl@0: aChunk.Close(); sl@0: sl@0: err = aManager.CloseSurface(iSurfaceId); sl@0: if(err) sl@0: { sl@0: RDebug::Print(_L("Error closing the surface\n")); sl@0: } sl@0: aManager.Close(); sl@0: }