Added GLES 1.x spinning cube-rendering code to eglbringuptest
The coordinate, color and index data are uploaded to server-side
buffers by the CGLES1Cube::KhrSetup function. CGLES1Cube::KhrPaint
just sets the view matrix and issues a draw command.
Which demo to display can be selected by passing its name on the
command line, e.g.
eglbringuptest vgline
eglbringuptest gles1cube
If no name is provided, the application defaults to vgline.
/*
* Copyright (c) 2005-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:
*
*/
#include "T_DataAnim.h"
#include "T_GraphicsUtil.h"
#include "T_AnimDef.h"
#define KMaxBufSize 250
/*@{*/
_LIT(KDataClassname, "RAnim");
/// Fields
_LIT(KFldAnimDll, "animdll");
_LIT(KFldWin, "win");
_LIT(KFldSprite, "sprite");
_LIT(KFldType, "type");
_LIT(KFldParam, "param");
_LIT(KFldIpcArgs, "ipcargs");
_LIT(KFldOpcode, "opcode");
_LIT(KFldArgs, "args");
_LIT(KFldIpcArg, "ipcargs%d");
_LIT(KFldExpectedIpcArg, "expected_ipcargs%d");
// enum
_LIT(KEAnimWindows, "EKWindowAnim");
_LIT(KEAnimSprite, "EKSpriteAnim");
_LIT(KEAnimFreeTimer, "EKFreeTimerWindowAnim");
_LIT(KEAnimCmdSync, "ECmdSync");
_LIT(KEAnimCmdTestWithoutPara, "ECmdTestWithoutPara");
_LIT(KEAnimCmdTestWithPara, "ECmdTestWithPara");
_LIT(KEAnimCmdGetLast, "ECmdGetLast");
_LIT(KEAnimCmdGetAnimInterval, "ECmdGetAnimInterval");
// animate interval
_LIT(KFldCheckAnimateInterval, "CheckAnimateInterval");
_LIT(KFldAnimIpcArgSlot, "AnimIpcArgSlot");
_LIT(KFldAnimIntervalMin, "AnimIntervalMin");
_LIT(KFldAnimIntervalMax, "AnimIntervalMax");
_LIT(KIpcArgNothing, "ENothing");
/// Commands
_LIT(KCmdnew, "new");
_LIT(KCmdDestructorGeneral, "~");
_LIT(KCmdDestructor, "~RAnim");
_LIT(KCmdConstruct, "Construct");
_LIT(KCmdCommandReply, "CommandReply");
_LIT(KCmdCommand, "Command");
_LIT(KCmdAsyncCommandReply, "AsyncCommandReply");
_LIT(KCmdDestroy, "Destroy");
_LIT(KCmdClose, "Close");
/// Logging
_LIT(KLogErrNum, "Error=%d");
_LIT(KLogErrMissingPara, "Missing parameter '%S'");
_LIT(KLogInfoCmdnewL1, "execute new RAnim(RAnimDll &)");
_LIT(KLogInfoCmdnewL2, "execute new RAnim()");
_LIT(KLogErrConstruct, "Construct return err = %d");
_LIT(KLogInfoCmdConstruct1, "execute RAnim::Construct(const RWindowBase &, TInt, const TDesC8 &)");
_LIT(KLogInfoCmdConstruct2, "execute RAnim::Construct(const RWindowBase &, TInt, const TDesC8 &, const TIpcArgs &)");
_LIT(KLogInfoCmdConstruct3, "execute RAnim::Construct(const RWsSprite &, TInt, const TDesC8 &)");
_LIT(KLogInfoCmdConstruct4, "execute RAnim::Construct(const RWsSprite &, TInt, const TDesC8 &, const TIpcArgs &)");
_LIT(KLogErrCommandReply, "CommandReply return err = %d");
_LIT(KLogInfoCmdCommandReply1, "execute RAnim::CommandReply(TInt)");
_LIT(KLogInfoCmdCommandReply2, "execute RAnim::CommandReply(TInt, const TPtrC8 &)");
_LIT(KLogInfoCmdCommandReply3, "execute RAnim::CommandReply(TInt, const TDesC8 &, const TIpcArgs &)");
_LIT(KLogErrCommand, "Command return err = %d");
_LIT(KLogErrCheckIpcValue, "Ipc arg compare fail expected=%S actual=%S");
_LIT(KLogErrIpcValue, "Ipc arg return value err");
_LIT(KLogErrAnimInterval, "Animate interval error expected min=%d max=%d");
_LIT(KLogInfoAnimInterval, "Animate interval actual min=%d max=%d");
_LIT(KLogInfoCmdCommand1, "execute RAnim::Command(TInt, const TPtrC8 &)");
_LIT(KLogInfoCmdCommand2, "execute RAnim::Command(TInt)");
_LIT(KLogInfoCmdAsyncCommandReply1, "execute RAnim::AsyncCommandReply(TRequestStatus &, TInt, const TIpcArgs &)");
_LIT(KLogInfoCmdClose1, "execute RAnim::Close()");
_LIT(KLogInfoCmdDestroy1, "execute RAnim::Destroy()");
_LIT(KLogInfoCmdDestructor1, "execute ~RAnim()");
/*@}*/
CT_DataAnim* CT_DataAnim::NewL()
{
CT_DataAnim* ret = new (ELeave) CT_DataAnim();
CleanupStack::PushL(ret);
ret->ConstructL();
CleanupStack::Pop(ret);
return ret;
}
CT_DataAnim::CT_DataAnim()
: iActiveCallback(NULL)
,iAnim(NULL)
{
}
void CT_DataAnim::ConstructL()
{
iActiveCallback = CActiveCallback::NewL(*this);
iSendBuf.CreateL(KMaxBufSize);
for (TInt i=0;i<KIpcArgNum;i++)
iIpcBuf[i].CreateL(KMaxBufSize);
}
CT_DataAnim::~CT_DataAnim()
{
DestroyData();
delete iActiveCallback;
iActiveCallback = NULL;
iSendBuf.Close();
for (TInt i=0;i<KIpcArgNum;i++)
iIpcBuf[i].Close();
}
TAny* CT_DataAnim::GetObject()
{
return iAnim;
}
void CT_DataAnim::SetObjectL(TAny* aAny)
{
DestroyData();
iAnim = static_cast<T_RAnimChild*> (aAny);
}
void CT_DataAnim::DisownObjectL()
{
iAnim = NULL;
}
void CT_DataAnim::DestroyData()
{
DoCmdDestructor();
}
/**
* Process a command read from the ini file
*
* @param aCommand the command to process
* @param aSection the entry in the ini file requiring the command to be processed
* @param aAsyncErrorIndex index of command. used for async calls
*
* @return ETrue if the command is processed
*/
TBool CT_DataAnim::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
{
TBool ret = ETrue;
if ( aCommand==KCmdDestructorGeneral || aCommand==KCmdDestructor )
{
DoCmdDestructor();
}
else if ( aCommand==KCmdnew || aCommand==KDataClassname )
{
DoCmdnewL(aSection);
}
else if ( aCommand==KCmdConstruct )
{
DoCmdConstructL(aSection);
}
else if ( aCommand==KCmdCommandReply )
{
DoCmdCommandReply(aSection);
}
else if ( aCommand==KCmdCommand )
{
DoCmdCommand(aSection);
}
else if ( aCommand==KCmdAsyncCommandReply )
{
DoCmdAsyncCommandReply(aSection, aAsyncErrorIndex);
}
else if ( aCommand==KCmdDestroy )
{
DoCmdDestroy();
}
else if ( aCommand==KCmdClose )
{
DoCmdClose();
}
else
{
ret=EFalse;
}
return ret;
}
void CT_DataAnim::DoCmdnewL(const TDesC& aSection)
{
DestroyData();
// Get test data for command input parameter(s)
TPtrC datDllName;
RAnimDll* animDll = NULL;
if ( GetStringFromConfig(aSection, KFldAnimDll, datDllName) )
{
animDll = static_cast<RAnimDll*>(GetDataObjectL(datDllName));
}
TInt err = KErrNone;
if ( animDll )
{
// Execute command and log parameters
INFO_PRINTF1(KLogInfoCmdnewL1);
iAnim = new (ELeave) T_RAnimChild(*animDll) ;
}
else
{
// Execute command and log parameters
INFO_PRINTF1(KLogInfoCmdnewL2);
iAnim = new (ELeave) T_RAnimChild();
}
}
TBool CT_DataAnim::GetIpcArg(const TDesC& aSection)
{
TBool argexist=EFalse;
TBuf <100> field;
TPtrC val;
for (TInt i=0;i<KIpcArgNum;i++)
{
field.Format(KFldIpcArg,i);
if ( GetStringFromConfig(aSection, field, val))
{
if (val.Compare(KIpcArgNothing)==0)
iIpcArgs.Set(i,TIpcArgs::ENothing);
else
{
iIpcBuf[i].Copy(val);
iIpcArgs.Set(i,&iIpcBuf[i]);
}
argexist=ETrue;
}
else
break;
}
return argexist;
}
// check is the time interval of CAnim::Animate() is in specified scope
TBool CT_DataAnim::CheckAnimateInterval(const TDesC& aSection)
{
TBool result=EFalse;
TInt slot,min,max,find;
TInt amin,amax;
_LIT(KSpace," ");
// get IPC args slot index
if ( GetIntFromConfig(aSection, KFldAnimIpcArgSlot,slot))
{
// get expected min/max interval of Animate()
if ( GetIntFromConfig(aSection, KFldAnimIntervalMin,min) &&
GetIntFromConfig(aSection, KFldAnimIntervalMax,max) )
{
find=iIpcBuf[slot].Find(KSpace); // get actual min/max interval of Animate()
if (find>0 )
{
// get actual min interval
TPtrC val1=iIpcBuf[slot].Left(find);
TLex lex1(val1);
lex1.Val(amin);
// get actual max interval
TPtrC val2=iIpcBuf[slot].Mid(find+1);
TLex lex2(val2);
lex2.Val(amax);
INFO_PRINTF3(KLogInfoAnimInterval,amin,amax);
// check is the interval in expected scope
if (amin<min || amax>max)
{
ERR_PRINTF3(KLogErrAnimInterval, min,max);
}
else
result=ETrue;
}
}
}
return result;
}
TBool CT_DataAnim::CheckIpcArg(const TDesC& aSection)
{
TBool result=ETrue;
// check animate interval
TInt checkanim=0;
if ( GetIntFromConfig(aSection, KFldCheckAnimateInterval, checkanim)
&& checkanim)
{
return CheckAnimateInterval(aSection);
}
TBuf <100> field;
TPtrC val;
// check ipc expected value
for (TInt i=0;i<KIpcArgNum;i++)
{
field.Format(KFldExpectedIpcArg,i);
if ( GetStringFromConfig(aSection, field, val) &&
val.Compare(iIpcBuf[i])!=0)
{
ERR_PRINTF3(KLogErrCheckIpcValue, &val, &iIpcBuf[i]);
result=EFalse;
break;
}
}
return result;
}
void CT_DataAnim::DoCmdConstructL(const TDesC& aSection)
{
TInt err = KErrNone;
// Get test data for command input parameter(s)
TBool dataOk = ETrue;
// get "const RWindowBase &aDevice" or "const RWsSprite &aDevice"
TPtrC datWinName;
RWindowBase* win = NULL;
TPtrC datSpriteName;
RWsSprite* sprite = NULL;
if ( GetStringFromConfig(aSection, KFldWin, datWinName))
{
win = static_cast<RWindowBase*>(GetDataObjectL(datWinName));
}
else if ( GetStringFromConfig(aSection, KFldSprite, datSpriteName))
{
sprite = static_cast<RWsSprite*>(GetDataObjectL(datSpriteName));
}
if (!win && !sprite )
{
dataOk = EFalse;
ERR_PRINTF2(KLogErrMissingPara, &KFldWin);
ERR_PRINTF2(KLogErrMissingPara, &KFldSprite);
}
//get "TInt aType"
TInt datType;
if ( !ReadAnimType(aSection, KFldType, datType))
{
dataOk = EFalse;
ERR_PRINTF2(KLogErrMissingPara, &KFldType);
}
// get "const TDesC8 &aArgs"
TPtrC inputStr;
TBool argexist=EFalse;
if( GetStringFromConfig(aSection, KFldParam, inputStr))
{
CopyToSendBuf(inputStr);
argexist=ETrue;
}
if (!argexist)
{
dataOk = EFalse;
ERR_PRINTF2(KLogErrMissingPara, &KFldParam);
}
// get "const TIpcArgs &aIpcArgs"
TBool ipcexist= EFalse;
if ( GetIpcArg(aSection))
ipcexist = ETrue;
if ( !dataOk )
{
SetBlockResult(EFail);
}
else
{
// Execute command and log parameters
if (win )
{
if (!ipcexist)
{
INFO_PRINTF1(KLogInfoCmdConstruct1);
err = iAnim->Construct(*win, datType, iSendBuf);
}
else
{
INFO_PRINTF1(KLogInfoCmdConstruct2);
err = iAnim->Construct(*win, datType, iSendBuf, iIpcArgs);
}
}
else
{
if (!ipcexist )
{
INFO_PRINTF1(KLogInfoCmdConstruct3);
err = iAnim->Construct(*sprite, datType, iSendBuf);
}
else
{
INFO_PRINTF1(KLogInfoCmdConstruct4);
err = iAnim->Construct(*sprite, datType, iSendBuf, iIpcArgs);
}
}
// Check the command return code
if(err != KErrNone)
{
ERR_PRINTF2(KLogErrConstruct, err);
SetError(err);
}
else if (ipcexist && ! CheckIpcArg(aSection))
{
ERR_PRINTF1(KLogErrIpcValue);
SetBlockResult(EFail);
}
}
}
TDesC8& CT_DataAnim::CopyToSendBuf(const TDesC& buf)
{
TUint8 len=buf.Length();
iSendBuf.Zero();
iSendBuf.Copy(&len,sizeof(len));
if (len>0)
iSendBuf.Append(buf);
return iSendBuf;
}
void CT_DataAnim::DoCmdCommandReply(const TDesC& aSection)
{
TInt err = KErrNone;
// Get test data for command input parameter(s)
TBool dataOk = ETrue;
// get "TInt aOpcode"
TInt datOpcode;
if ( !ReadAnimCommand(aSection, KFldOpcode, datOpcode))
{
dataOk = EFalse;
ERR_PRINTF2(KLogErrMissingPara, &KFldOpcode);
}
// get "const TPtrC8 &aArgs" or "const TDesC8 &aArgs"
TPtrC inputStr;
TBool argexist=EFalse;
if( GetStringFromConfig(aSection, KFldArgs, inputStr))
{
CopyToSendBuf(inputStr);
argexist=ETrue;
}
// get "const TIpcArgs &aIpcArgs"
TBool ipcexist= EFalse;
if ( GetIpcArg(aSection))
ipcexist = ETrue;
if ( dataOk )
{
if (!argexist)
{
INFO_PRINTF1(KLogInfoCmdCommandReply1);
err = iAnim->CommandReply(datOpcode);
}
else if (ipcexist)
{
INFO_PRINTF1(KLogInfoCmdCommandReply3);
err = iAnim->CommandReply(datOpcode, iSendBuf, iIpcArgs);
}
else
{
INFO_PRINTF1(KLogInfoCmdCommandReply2);
err = iAnim->CommandReply(datOpcode, iSendBuf);
}
// Check the command return code
if(err != KErrNone)
{
ERR_PRINTF2(KLogErrCommandReply, err);
SetError(err);
}
else if (ipcexist && ! CheckIpcArg(aSection))
{
ERR_PRINTF1(KLogErrIpcValue);
SetBlockResult(EFail);
}
}
else
SetBlockResult(EFail);
}
void CT_DataAnim::DoCmdCommand(const TDesC& aSection)
{
// Get test data for command input parameter(s)
TBool dataOk = ETrue;
// get "TInt aOpcode"
TInt datOpcode;
if ( !ReadAnimCommand(aSection, KFldOpcode, datOpcode))
{
dataOk = EFalse;
ERR_PRINTF2(KLogErrMissingPara, &KFldOpcode);
}
// get "const TPtrC8 &aArgs" or "const TDesC8 &aArgs"
TPtrC inputStr;
TBool argexist=EFalse;
if( GetStringFromConfig(aSection, KFldArgs, inputStr))
{
CopyToSendBuf(inputStr);
argexist=ETrue;
}
if ( dataOk )
{
if (!argexist)
{
INFO_PRINTF1(KLogInfoCmdCommand2);
iAnim->Command(datOpcode);
}
else
{
INFO_PRINTF1(KLogInfoCmdCommand1);
iAnim->Command(datOpcode, iSendBuf);
}
}
else
SetBlockResult(EFail);
}
void CT_DataAnim::DoCmdAsyncCommandReply(const TDesC& aSection, const TInt aAsyncErrorIndex)
{
// Get test data for command input parameter(s)
TBool dataOk = ETrue;
// get "TInt aOpcode"
TInt datOpcode;
if ( !ReadAnimCommand(aSection, KFldOpcode, datOpcode))
{
dataOk = EFalse;
ERR_PRINTF2(KLogErrMissingPara, &KFldOpcode);
}
// get "const TIpcArgs &aIpcArgs"
TBool ipcexist= EFalse;
if ( GetIpcArg(aSection))
ipcexist = ETrue;
if (!ipcexist)
{
dataOk = EFalse;
ERR_PRINTF2(KLogErrMissingPara, &KFldIpcArgs);
}
if ( !dataOk )
{
SetBlockResult(EFail);
}
else
{
iAsyncCmdSection.Copy(aSection);
// Execute command and log parameters
INFO_PRINTF1(KLogInfoCmdAsyncCommandReply1);
iAnim->AsyncCommandReply(iActiveCallback->iStatus, datOpcode, iIpcArgs);
iActiveCallback->Activate(aAsyncErrorIndex);
IncOutstanding();
}
}
void CT_DataAnim::RunL(CActive* aActive, TInt aIndex)
{
TInt err = aActive->iStatus.Int();
if (! CheckIpcArg(iAsyncCmdSection))
{
ERR_PRINTF1(KLogErrIpcValue);
SetBlockResult(EFail);
}
SetAsyncError(aIndex, err);
DecOutstanding();
}
void CT_DataAnim::DoCmdClose()
{
// Execute command and log parameters
if (iAnim != NULL)
{
INFO_PRINTF1(KLogInfoCmdClose1);
iAnim->Close();
}
}
void CT_DataAnim::DoCmdDestroy()
{
// Execute command and log parameters
if (iAnim != NULL)
{
INFO_PRINTF1(KLogInfoCmdDestroy1);
iAnim->Destroy();
iAnim = NULL;
}
}
void CT_DataAnim::DoCmdDestructor()
{
// Execute command and log parameters
INFO_PRINTF1(KLogInfoCmdDestructor1);
delete iAnim;
iAnim = NULL;
}
TBool CT_DataAnim::ReadAnimCommand(const TDesC& aSectName, const TDesC& aKeyName, TInt& aCommand)
{
TPtrC str;
TBool ret=GetStringFromConfig(aSectName, aKeyName, str);
if ( ret )
{
if ( str==KEAnimCmdSync )
{
aCommand=ECmdSync;
}
else if ( str==KEAnimCmdTestWithoutPara )
{
aCommand=ECmdTestWithoutPara;
}
else if ( str==KEAnimCmdTestWithPara )
{
aCommand=ECmdTestWithPara;
}
else if ( str==KEAnimCmdGetLast )
{
aCommand=ECmdGetLast;
}
else if ( str==KEAnimCmdGetAnimInterval )
{
aCommand=ECmdGetAnimInterval;
}
else
ret=EFalse;
}
return ret;
}
TBool CT_DataAnim::ReadAnimType(const TDesC& aSectName, const TDesC& aKeyName, TInt& aType)
{
TPtrC str;
TBool ret=GetStringFromConfig(aSectName, aKeyName, str);
if ( ret )
{
if ( str==KEAnimWindows)
{
aType=EKWindowAnim;
}
else if ( str==KEAnimSprite )
{
aType=EKSpriteAnim;
}
else if ( str==KEAnimFreeTimer )
{
aType=EKFreeTimerWindowAnim;
}
else
ret=EFalse;
}
return ret;
}