Revise some of the compositor performance improvements to improve correctness.
Implement pixel blending using a variation of Jim Blinn's no-division blending algorithm.
Move transparency type simplification further up the composition code.
Remove some unnecessary fields.
Output to YUV implementation needs revision as it is actually converting from YUV (copy of source conversion code).
// 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 - Internal Symbian test code
*/
#include "teventhandlingperf.h"
#include <hal.h>
// Max length of the descriptor used for results of performance tests
// which are actually done in separate process. And UIBench testcase is
// used to display them according its format
// 16 integers plus 8 commas i,e 32 * 16 + 16
const TInt KMaxDescLength = 528;
CTEventHandlingPerf::CTEventHandlingPerf()
{
SetTestStepName(KEventHandlingPerfName);
}
CTEventHandlingPerf::~CTEventHandlingPerf()
{
}
TVerdict CTEventHandlingPerf::doTestStepL()
{
/**
@SYMTestCaseID GRAPHICS-UI-BENCH-0172
*/
SetTestStepID(_L("GRAPHICS-UI-BENCH-0172"));
TBuf<KMaxDescLength> bufAvg;
TPtr temp(NULL,0);
TPtr temp1(NULL,0);
TPtr temp2(NULL,0);
// Here check if the HAL configuration are correct if not then finish the test case
TInt maxPtr;
TInt ret = HAL::Get(HALData::EPointerMaxPointers, maxPtr);
if (ret != KErrNone || maxPtr < 2 || maxPtr > 8)
{
INFO_PRINTF1(_L("Incorrect HAL configuration. \n"));
SetTestStepResult(EFail);
CloseTMSGraphicsStep();
RecordTestResultL();
return TestStepResult();
}
iProfiler->InitResults();
TInt minMemSize = 128;
TInt maxMemSize = KMaxDescLength;
// Create a shared chunk using the userheap function
// Allocate some memory in that and then get the offset from it - chunk's base
_LIT(KPerformanceTimingChunk, "PerformanceTimingChunk");
RHeap* heap = UserHeap::ChunkHeap(&KPerformanceTimingChunk, minMemSize, maxMemSize, 10);
CleanupClosePushL(*heap);
if (heap == NULL)
{
User::LeaveNoMemory();
}
RChunk chunk;
User::LeaveIfError(chunk.OpenGlobal(KPerformanceTimingChunk, ETrue));
CleanupClosePushL(chunk);
TInt memSize = KMaxDescLength;
TAny* perfDesc = heap->AllocL(memSize);
if (!perfDesc)
{
User::LeaveNoMemory();
}
TInt offset = reinterpret_cast<TUint8*>(perfDesc) - chunk.Base() ;
// Create a process called te_multiptrperf
// Pass in the offset as descriptor
_LIT(KMultiPtrEventHandlingPerf,"z:\\sys\\bin\\te_multiptrperf.exe");
TBuf<128> buf;
buf.Num(offset);
RProcess eventHandPerf;
User::LeaveIfError(eventHandPerf.Create(KMultiPtrEventHandlingPerf, buf));
TRequestStatus stat;
eventHandPerf.Logon(stat);
eventHandPerf.Resume();
User::WaitForRequest(stat);
eventHandPerf.Close();
// Once the process finished its execution print the result by
// reading the data from chunk's memory
TPtr8 ptrDes((TUint8*)perfDesc, memSize, memSize);
TPtr8 ptrDesDisplay((TUint8*)perfDesc, memSize, memSize);
// If it has failed then just print description written in the same
// when it is failed description contains '*' at the end
TInt lastChar = 0;
lastChar = ptrDes.Locate('*');
if (KErrNotFound != lastChar)
{
SetTestStepResult(EFail);
TPtr8 temp = ptrDesDisplay.LeftTPtr(lastChar);
TBuf<128> buf;
buf.Copy(temp);
INFO_PRINTF2(_L("%S"), &buf);
RDebug::RawPrint(temp);
goto END;
}
// If it has skipped then just print skip description from the chunk
// when it is skipped description contains '#' at the end
lastChar = ptrDes.Locate('#');
if (KErrNotFound != lastChar)
{
SetTestStepResult(EPass);
TPtr8 temp = ptrDesDisplay.LeftTPtr(lastChar);
TBuf<128> buf;
buf.Copy(temp);
INFO_PRINTF2(_L("%S"), &buf);
RDebug::RawPrint(temp);
goto END;
}
// If the every thing goes fine the descriptor is displayed as
// "12345678,123456789,123456789"
TInt avg4Events, avg8Events, avg16Events, avg32Events;
bufAvg.Copy(ptrDesDisplay);
for (TInt i=0; i<4; i++)
{
TInt locate = bufAvg.Locate(',');
if (locate == KErrNotFound)
{
SetTestStepResult(EFail);
goto END;
}
TLex lex(bufAvg.Left(locate));
lex.Val(avg4Events);
locate++;
temp.Set(bufAvg.MidTPtr(locate));
locate = temp.Locate(',');
if (locate == KErrNotFound)
{
SetTestStepResult(EFail);
goto END;
}
lex = temp.Left(locate);
lex.Val(avg8Events);
locate++;
temp1.Set(temp.MidTPtr(locate));
locate = temp1.Locate(',');
if (locate == KErrNotFound)
{
SetTestStepResult(EFail);
goto END;
}
lex = temp.Left(locate);
lex.Val(avg16Events);
locate++;
temp2.Set(temp1.MidTPtr(locate));
locate = temp2.Locate(',');
if (locate == KErrNotFound)
{
SetTestStepResult(EFail);
goto END;
}
lex = temp2.Left(locate);
lex.Val(avg32Events);
locate++;
bufAvg.Copy(temp2.MidTPtr(locate));
switch (i)
{
case 0:
INFO_PRINTF5(_L("TID: Average time for Single pointer(wait after each event) for 4 events:%i 8 events:%i 16 events:%i 32events:%i"), avg4Events, avg8Events, avg16Events, avg32Events);
break;
case 1:
INFO_PRINTF5(_L("TID: Average time for Multi pointer(wait after each event) for 4 events:%i 8 events:%i 16 events:%i 32events:%i"), avg4Events, avg8Events, avg16Events, avg32Events);
break;
case 2:
INFO_PRINTF5(_L("TID: Average time for single pointer for 4 events:%i 8 events:%i 16 events:%i 32events:%i"), avg4Events, avg8Events, avg16Events, avg32Events);
break;
case 3:
INFO_PRINTF5(_L("TID: Average time for Multi pointer for 4 events:%i 8 events:%i 16 events:%i 32events:%i"), avg4Events, avg8Events, avg16Events, avg32Events);
SetTestStepResult(EPass);
break;
default:
break;
}
}
iProfiler->ResultsAnalysis(KEventHandlingPerfName, 0, EColor16MA, EColor16MA, 1);
END:
// Once the data is printed or displyed delete the memory
heap->Free(perfDesc);
CleanupStack::PopAndDestroy(2, heap);
RecordTestResultL();
CloseTMSGraphicsStep();
return TestStepResult();
}
TVerdict CTEventHandlingPerf::doTestStepPreambleL()
{
return CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
}
TVerdict CTEventHandlingPerf::doTestStepPostambleL()
{
return CTe_graphicsperformanceSuiteStepBase::doTestStepPostambleL();
}