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) 1995-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:
// General utility functions that don't belong anywhere else
//
//
#include "server.h"
#include "rootwin.h"
#include "wstop.h"
#include "panics.h"
GLREF_D CDebugLogBase *wsDebugLog;
GLDEF_C RWsRegion *GetRegionFromClientL(CWsClient *aClient, TInt aCount)
{
TInt bufSize=sizeof(TRect)*aCount;
TUint8* rectList=STATIC_CAST(TUint8*,User::Alloc(bufSize));
User::LeaveIfNull(rectList);
CleanupStack::PushL(rectList);
TPtr8 rectBuf(rectList,bufSize);
aClient->RemoteRead(rectBuf,0);
RWsRegion* region=new(ELeave) RWsRegion(aCount,REINTERPRET_CAST(TRect*,rectList));
CleanupStack::Pop(rectList);
return(region);
}
GLDEF_C TInt ExternalizeRegionL(RWriteStream& aWriteStream, const RWsRegion& aRegion)
{
TInt dataLen = sizeof(TRect)*aRegion.Count();
aWriteStream.WriteInt32L(aRegion.Count());
aWriteStream.WriteL(REINTERPRET_CAST(const TUint8*,aRegion.RectangleList()),dataLen);
aWriteStream.CommitL();
return sizeof(TInt32)+dataLen;
}
GLDEF_C RWsRegion* InternalizeRegionL(RReadStream& aReadStream)
{
TInt numRects = aReadStream.ReadInt32L();
TInt bufSize = sizeof(TRect)*numRects;
// Allocate buffer for list of clipping rectangles. We leave if we
// cannot create the buffer
TUint8* rectList = static_cast<TUint8*>(User::AllocL(bufSize));
CleanupStack::PushL(rectList);
// Read the list of rectangles into the buffer
aReadStream.ReadL(rectList,bufSize);
// Point member pointer to our new rectangle list buffer
RWsRegion* region = new(ELeave) RWsRegion(numRects,reinterpret_cast<TRect*>(rectList));
CleanupStack::Pop(rectList);
return region;
}
void Panic(TWservPanic aPanic)
{
if (wsDebugLog)
wsDebugLog->Panic(CDebugLogBase::EDummyConnectionId,aPanic); //Dummy value meaning WSERV
_LIT(KWSERVInternalPanicCategory,"WSERV-INTERNAL");
User::Panic(KWSERVInternalPanicCategory,aPanic);
}
_LIT(KWSERVPanicDesc1,"WServ internal Panic %S, in file %S @ line %i");
_LIT(KWSERVPanicDesc2,"Assert condition = \"%S\"");
void PanicWithInfo(TWservPanic aPanic, const TDesC& aFileName, const TDesC& aPanicName, TInt aLine)
{
TBuf<256> buf;
buf.Format(KWSERVPanicDesc1, &aPanicName, &aFileName, aLine);
RDebug::Print(buf);
if (wsDebugLog)
{
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant, buf);
}
Panic(aPanic);
}
void PanicWithCondAndInfo(TWservPanic aPanic, const TDesC& aCondition, const TDesC& aFileName, const TDesC& aPanicName, TInt aLine)
{
TBuf<256> buf;
buf.Format(KWSERVPanicDesc1, &aPanicName, &aFileName, aLine);
RDebug::Print(buf);
if (wsDebugLog)
{
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant, buf);
}
buf.Format(KWSERVPanicDesc2, &aCondition);
RDebug::Print(buf);
if (wsDebugLog)
{
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant, buf);
}
Panic(aPanic);
}
GLDEF_C void StateDump()
{
CWsTop::StateDump();
}
GLDEF_C void StateDump(CWsRootWindow* aRootWindow)
{
TBool enabled=wsDebugLog!=NULL;
if (!enabled)
{
CWsTop::EnableLogging();
if (!wsDebugLog)
return; // Failed to enable logging so give up
}
//
_LIT(LogLine,"===========");
_LIT(KWSERVStateLogWindowTree,"Window tree");
TBuf<128> buf;
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,LogLine);
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,KWSERVStateLogWindowTree);
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,LogLine);
CWsWindowBase *win=aRootWindow;
TInt inset=0;
_LIT(KWSERVStateInsetLevelValue,"%*p");
FOREVER
{
buf.Format(KWSERVStateInsetLevelValue,Min(inset<<1,20));
win->StatusDump(buf);
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,buf);
if (win->BaseChild())
{
++inset;
win=win->BaseChild();
continue;
}
while(!win->NextSibling() && win!=aRootWindow)
{
win=win->BaseParent();
--inset;
}
if (win==aRootWindow)
break; //Will break here if there is only the root window or the tree walk has returned to it
win=win->NextSibling();
}
wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,LogLine);
//
if (!enabled)
CWsTop::DisableLogging();
}
GLDEF_C void HeapDump()
{
TBool enabled=(wsDebugLog!=NULL);
if (!enabled)
CWsTop::EnableLogging();
if (wsDebugLog) // Just in case enable failed
wsDebugLog->HeapDump();
if (!enabled)
CWsTop::DisableLogging();
}
#if defined(_DEBUG)
//GLREF_C void ForceLog(TInt aPriority,const TDesC &aText,TInt aParam=0);
//ForceLog(CDebugLogBase::ELogImportant,_L("Value=%d"),345);
//TLogMessageText buf;
//_LIT(KLog,"Count=%d, Object=0x%x");
//buf.Format(KLog,Count(),this);
//ForceLog(CDebugLogBase::ELogImportant,buf);
GLDEF_C void ForceLog(TInt aPriority,const TDesC &aText,TInt aParam=0)
{
TBool enabled=(wsDebugLog!=NULL);
if (!enabled)
CWsTop::EnableLogging();
if (wsDebugLog) // Just in case enable failed
{
wsDebugLog->MiscMessage(aPriority,aText,aParam);
if (!enabled)
CWsTop::DisableLogging();
}
}
#endif
LOCAL_C TDisplayMode DisplayMode(TBool aIsColor,TInt aNumColors)
{
if (aIsColor)
{
switch(aNumColors)
{
case 16:
return EColor16;
case 256:
return EColor256;
case 4096:
return EColor4K;
case 65536:
return EColor64K;
case 16777216:
return CFbsDevice::DisplayMode16M();
default:
return ENone;
}
}
else
{
switch(aNumColors)
{
case 2:
return EGray2;
case 4:
return EGray4;
case 16:
return EGray16;
case 256:
return EGray256;
default:
return ENone;
}
}
}
GLDEF_C TDisplayMode ParseDisplayMode(const TDesC& aModeName)
{
// Not using _LIT because we only want the string temporarily, not permanently on the heap.
if (!aModeName.CompareF(_L("EColor16MAP")))
return EColor16MAP;
else if (!aModeName.CompareF(_L("EColor16MA")))
return EColor16MA;
else if (!aModeName.CompareF(_L("EColor16MU")))
return EColor16MU;
else if (!aModeName.CompareF(_L("EColor64K")))
return EColor64K;
else if (!aModeName.CompareF(_L("EColor4K")))
return EColor4K;
else if (!aModeName.CompareF(_L("EColor256")))
return EColor256;
else if (!aModeName.CompareF(_L("EColor16")))
return EColor16;
else if (!aModeName.CompareF(_L("EGray256")))
return EGray256;
else if (!aModeName.CompareF(_L("EGray16")))
return EGray16;
else if (!aModeName.CompareF(_L("EGray4")))
return EGray4;
else if (!aModeName.CompareF(_L("EGray2")))
return EGray2;
else // old wserv magic
{ // this code supports the old "ColorXXX" and "GrayXXX" formats etc
TPtrC ptr(aModeName);
TBool isColor=EFalse;
if (ptr[0]=='C' || ptr[0]=='c')
isColor=ETrue;
else if (ptr[0]=='A' || ptr[0]=='a')
return EColor16MA;
else if (ptr[0]=='P' || ptr[0]=='p')
return EColor16MAP;
else if (ptr[0]!='G' && ptr[0]!='g')
return ENone;
TInt pos=0;
while (!TChar(ptr[++pos]).IsDigit())
{}
TLex lex(ptr.Mid(pos));
TInt numCols;
if (lex.Val(numCols)!=KErrNone)
return ENone;
lex.SkipSpace();
TChar units=lex.Get();
if (units=='K' || units=='k')
numCols<<=10;
else if (units=='M' || units=='m')
numCols<<=20;
TDisplayMode mode = DisplayMode(isColor,numCols);
#if defined(__WINS__)
//This is a special case for the emulator since the default
//screen packing can be overridden by the wsini.ini setting
//This code does nothing is iDefaultDisplayMode is not
//EColor16M.- see graphics/screendriver/swins/scnew.cpp
//function CFbsDrawDevice::DisplayMode16M().
if(mode==EColor16M)
{
TChar packed=lex.Get();
if ((packed=='U')||(packed=='u'))
{
mode=EColor16MU;
}
}
//However setting this will give four shades of grey since
//the code does not support 16MU and 16M at the same time.
#endif
return mode;
}
}