1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/windowing/windowserver/test/t_integ/src/t_testsurfacerasterizer.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,194 @@
1.4 +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +/**
1.20 + @file
1.21 + @test
1.22 + @internalComponent
1.23 +*/
1.24 +
1.25 +#include <e32debug.h>
1.26 +#include <hal.h>
1.27 +#include <limits.h> //UINT_MAX
1.28 +
1.29 +#include "t_testsurfacerasterizer.h"
1.30 +
1.31 +EXPORT_C CTestSurfaceRasterizer* CTestSurfaceRasterizer::NewL(const TSurfaceId& aSurfaceId, TInt aSurfaceScreenNumber, RSurfaceManager* aSurfaceManager)
1.32 + {
1.33 + RDebug::Print(_L("Creating CTestSurfaceRasterizer class\n"));
1.34 + CTestSurfaceRasterizer* self = new (ELeave) CTestSurfaceRasterizer();
1.35 + CleanupStack::PushL(self);
1.36 + TInt ret = self->ConstructL(aSurfaceId, aSurfaceScreenNumber, aSurfaceManager);
1.37 + CleanupStack::Pop(); // self;
1.38 +
1.39 + if(ret)
1.40 + {
1.41 + return self;
1.42 + }
1.43 + else
1.44 + {
1.45 + return 0;
1.46 + }
1.47 + }
1.48 +
1.49 +TBool CTestSurfaceRasterizer::ConstructL(const TSurfaceId& aSurfaceId, TInt aSurfaceScreenNumber, RSurfaceManager* aSurfaceManager)
1.50 + {
1.51 + RDebug::Print(_L("Constructing CTestSurfaceRasterizer\n"));
1.52 +
1.53 + iSurfaceId = aSurfaceId;
1.54 +
1.55 + iSurfaceScreenNumber = aSurfaceScreenNumber;
1.56 +
1.57 + iSurfaceManager = aSurfaceManager;
1.58 +
1.59 + TInt err = iSurfaceManager->MapSurface(iSurfaceId, iChunk);
1.60 +
1.61 + if(err)
1.62 + {
1.63 + RDebug::Print(_L("Error mapping to surface\n"));
1.64 + User::Exit(0);
1.65 + }
1.66 +
1.67 + iInfoBuf.FillZ();
1.68 +
1.69 + iSurfaceManager->SurfaceInfo(iSurfaceId, iInfoBuf);
1.70 +
1.71 + return ETrue;
1.72 + }
1.73 +
1.74 +EXPORT_C CTestSurfaceRasterizer::CTestSurfaceRasterizer()
1.75 + {
1.76 + }
1.77 +
1.78 +CTestSurfaceRasterizer::~CTestSurfaceRasterizer()
1.79 + {
1.80 + iChunk.Close();
1.81 + }
1.82 +
1.83 +EXPORT_C void CTestSurfaceRasterizer::DrawRect(TUint32* aBuffer, SurfaceDetails& aSurfDetails)
1.84 + {
1.85 + //Send the fullscreen bitmap to the test rasterizer
1.86 +
1.87 + RSurfaceManager::TSurfaceInfoV01& info = iInfoBuf();
1.88 +
1.89 + aSurfDetails.aSurfaceId = iSurfaceId;
1.90 + aSurfDetails.aSurfaceSize = info.iSize;
1.91 + aSurfDetails.aBufferNumber = iSurfaceCurrentBuffer;
1.92 +
1.93 +
1.94 + TInt offsetToCurrentBuffer;
1.95 + TInt err = iSurfaceManager->GetBufferOffset(iSurfaceId, iSurfaceCurrentBuffer, offsetToCurrentBuffer);
1.96 + if(err != KErrNone)
1.97 + {
1.98 + RDebug::Print(_L("Could not open buffer number\n"));
1.99 + return;
1.100 + }
1.101 + TUint32* surfaceBufferPtr = reinterpret_cast<TUint32*>(iChunk.Base() + offsetToCurrentBuffer);
1.102 +
1.103 + TInt noOfBytes = (info.iStride * info.iSize.iHeight);
1.104 + Mem::Move(surfaceBufferPtr, aBuffer, noOfBytes);
1.105 +
1.106 + iSurfaceCurrentBuffer++;
1.107 + if(iSurfaceCurrentBuffer == info.iBuffers)
1.108 + {
1.109 + iSurfaceCurrentBuffer = 0;
1.110 + }
1.111 + }
1.112 +
1.113 + EXPORT_C void CTestSurfaceRasterizer::PerfTestL(TInt aFrameNumber)
1.114 + {
1.115 + //Send the fullscreen bitmap to the test rasterizer
1.116 + RChunk aChunk;
1.117 + RSurfaceManager aManager;
1.118 + User::LeaveIfError(aManager.Open());
1.119 +
1.120 + TInt err = aManager.OpenSurface(iSurfaceId);
1.121 + if(err!=KErrNone)
1.122 + {
1.123 + RDebug::Print(_L("Error opening a surface\n"));
1.124 + User::Exit(0);
1.125 + }
1.126 +
1.127 + err = aManager.MapSurface(iSurfaceId, aChunk);
1.128 + if(err!=KErrNone)
1.129 + {
1.130 + RDebug::Print(_L("Error mapping to surface\n"));
1.131 + User::Exit(0);
1.132 + }
1.133 +
1.134 + RSurfaceManager::TInfoBuf InfoBuf;
1.135 + RSurfaceManager::TSurfaceInfoV01& info = InfoBuf();
1.136 + InfoBuf.FillZ();
1.137 +
1.138 + aManager.SurfaceInfo(iSurfaceId, InfoBuf);
1.139 +
1.140 + TInt noOfPixels = (info.iSize.iWidth * info.iSize.iHeight);
1.141 +
1.142 + TInt offsetToCurrentBuffer;
1.143 + err = iSurfaceManager->GetBufferOffset(iSurfaceId, iSurfaceCurrentBuffer,offsetToCurrentBuffer);
1.144 + if(err != KErrNone)
1.145 + {
1.146 + RDebug::Print(_L("Could not open buffer number\n"));
1.147 + User::Exit(0);
1.148 + }
1.149 + TUint32* surfaceBufferPtr = reinterpret_cast<TUint32*>(aChunk.Base() + offsetToCurrentBuffer);
1.150 +
1.151 + if(aFrameNumber < info.iBuffers)
1.152 + {
1.153 + TInt sector = aFrameNumber % info.iBuffers;
1.154 + TInt offset = (noOfPixels * sector)/info.iBuffers;
1.155 + Mem::Fill((surfaceBufferPtr + offset), noOfPixels, TChar(0xFF));
1.156 + }
1.157 +
1.158 + //Submit update
1.159 + TRect rc[1] =
1.160 + {
1.161 + TRect(0, 0, info.iSize.iWidth, info.iSize.iHeight)
1.162 + };
1.163 +
1.164 + RRegion region(1, rc);
1.165 + RSurfaceUpdateSession aSurfaceUpdateSession;
1.166 +
1.167 + err = aSurfaceUpdateSession.Connect();
1.168 + if (err!=KErrNone)
1.169 + {
1.170 + RDebug::Print(_L("error in connecting surface update session\n"));
1.171 + User::Exit(0);
1.172 + }
1.173 +
1.174 + TInt ret = aSurfaceUpdateSession.SubmitUpdate(KAllScreens, iSurfaceId, iSurfaceCurrentBuffer, ®ion);
1.175 +
1.176 + RDebug::Print(_L("Frame %d done\n"), aFrameNumber);
1.177 +
1.178 + if(ret != KErrNone)
1.179 + {
1.180 + RDebug::Print(_L("Error submitting update request\n"));
1.181 + }
1.182 +
1.183 + iSurfaceCurrentBuffer++;
1.184 + if(iSurfaceCurrentBuffer == info.iBuffers)
1.185 + {
1.186 + iSurfaceCurrentBuffer = 0;
1.187 + }
1.188 +
1.189 + aChunk.Close();
1.190 +
1.191 + err = aManager.CloseSurface(iSurfaceId);
1.192 + if(err)
1.193 + {
1.194 + RDebug::Print(_L("Error closing the surface\n"));
1.195 + }
1.196 + aManager.Close();
1.197 + }