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) 2006-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:
// CWsRedrawMsgWindow and associated classes definitions
//
//
#ifndef __REDRAWMSGWINDOW_H__
#define __REDRAWMSGWINDOW_H__
#include "wnredraw.h"
#include "redrawmsgwindow.h"
class CWsFbsFont;
class CWsRedrawMsgWindow : public CWsWindowRedraw
{
class CRedrawSegment;
enum TFlags
{
EBackgroundClear=0x0001, //Clear background when starting redraw
ENoRepeatRedraw=0x0004, //Redraw is a response to an error, and should not repeat on another error
EBeginEndRedraw=0x0080, //This window is currently in the middle of a redraw, that is between client calls to BeginRedraw and EndRedraw.
EPendingScheduledDraw=0x0200, //We have scheduled a redraw but it hasn't happened yet
EStoringEntireWindow=0x0400, //If store commands for the entire window or only the viewport
};
enum TScope
{
EStoreEntireWindow, //We try to obtain draw commands for the entire window
EStoreViewport //We only try to obtain commands for the on screen viewport
};
enum TAtomicityType
{
ENoAtomicity,
ESegment,
EWindow,
};
public:
enum TRedrawSegmentType
{
ESegmentTypePendingRedraw, // A redraw segment still being received
ESegmentTypeRedraw, // A segment received between a begin and end redraw
ESegmentTypeNonRedraw, // A segment storing commands received outside of begin and end redraw
};
public:
static void StaticInitL();
CWsRedrawMsgWindow(CWsWindow *aWin);
~CWsRedrawMsgWindow();
void AddFbsBitmapsL(TInt aHandle, TInt aMaskHandle);
void AddWsBitmapsL(TInt aHandle, TInt aMaskHandle);
void AddWsFontL(TInt aHandle);
void SetScope(TScope aStore);
public: //from CWsWindowRedraw
void ConstructL();
TBool CommandL(TInt aOpcode, TWsWinCmdUnion &aCmd);
void ClipInvalidRegion(const TRect &aRect);
TBool NeedsRedraw() const;
TBool GetRedrawRect(TRect &aRect) const;
void ClearRedrawStore(TBool aClearPendingRedraw=EFalse);
TBool DrawCommand(CWsGc* aGc,const TAny *aCmdData);
void GcAttributeChange(CWsGc* aGc,const TAny *aCmdData);
void GcDeactivate(CWsGc* aGc);
void ClientExposing();
void DrawWindow();
void PrepareForResizeL(const TSize &aSize, TSize &aOldSize);
void Moved();
TBool Contains(const TArray<TGraphicDrawerId>& aDrawers,const TRegion& aRegion) const;
TBool ReleaseMemory(MWsMemoryRelease::TMemoryReleaseLevel aLevel);
void VisibleRegionChange();
TBool ReadyToDraw() const;
TInt SizeInBytes() const;
void WindowClosing();
private: //from CWsWindowRedraw
void Invalidate(const TRect * aRect = 0);
TRgb BackColor() const;
void Scroll(const TRect &aClipRect, const TPoint &aOffset,const TRect &aRect);
private:
void RemoveFromRedrawQueueIfEmpty();
void HandleNonRedrawCommand(TWsGcOpcodes aOpcode);
const TRegion * ReadRegion(const TInt aRegionNum);
void BeginRedraw(const TRect* aRect);
void DoBeginRedrawL(const TRect* aRect);
TInt SubtractRectFromSegmentArray(const TRect& aRect);
void EndRedraw();
void ValidateRect(const TRect *aRect);
void StoreDrawCommandL(CWsGc* aGc,const TAny *aCmdData);
void AppendCommandL(const TAny* aCmdData, const TUint16 aOpcodeFlags = 0);
void StoreAllGcAttributesL(CWsGc* aGc);
void DrawCommandsL();
void DiscardStoredCommands();
TBool DiscardSegmentsOutsideViewport();
inline TBool NoBuffer() const;
void DiscardStoredCommandsIfError(TInt aError);
inline TBool IsFbsBitmapOperation(TInt aOpCode) const;
inline TBool IsWsBitmapOperation(TInt aOpCode) const;
inline TBool IsRemoteReadRequired(TInt aOpCode) const;
inline TBool IsWsFontOperation(TInt aOpCode) const;
inline TBool IsDrawWsGraphicOperation(TInt aOpCode) const;
void ReplaceAndAppendCommandL(TInt aOpcode,const TAny* aCmdData);
// CRedrawSegment related methods
inline TInt CurrentCommandBufferWritePos() const;
inline CBufSeg* CurrentDrawCommandBuffer() const;
void ExpandCommandBufferL(TInt aLength);
void CommandBufferWrite(const TDesC8& aDes, TInt aLength);
void CommandBufferWrite(const TAny* aPtr,TInt aLength);
void CreateNewSegmentL(const TRect& aRect, TRedrawSegmentType aRegionType);
inline TBool InRedraw() const;
void AgeNonRedrawSegments();
void PromoteAndUpdateAllPendingSegments();
void PromoteLastPendingSegment();
void Lock();
void Unlock();
void ScheduleUpdateOfSegment(CRedrawSegment* aSegment);
void ReleaseRedrawSegments();
private:
static TInt iNonRedrawAgeLimit;
static TAtomicityType iAtomicity;
private:
class CRedrawSegment : public CBase
{
public:
static CRedrawSegment* NewLC(const TRect& aRect, TRedrawSegmentType aNewRegionType);
~CRedrawSegment();
void AddFbsBitmapL(TInt aHandle, CWsRedrawMsgWindow* aWindow);
void AddWsBitmapL(DWsBitmap* bitmap);
void ReleaseFontsAndBitmaps();
void AddDrawerL(TGraphicDrawerId aDrawerId);
TBool ContainsDrawers(const TArray<TGraphicDrawerId>& aDrawers,const TRegion& aRegion) const;
TInt SizeInBytes() const;
private:
CRedrawSegment();
void ConstructL(const TRect& aRect, TRedrawSegmentType aNewRegionType);
public:
TRedrawSegmentType iRedrawSegmentType;
CBufSeg* iDrawCommands;
TInt iCurrentCommandBufferWritePos;
RWsRegion iRegion;
RPointerArray<CFbsBitmap> iFbsBitmapArray;
RPointerArray<DWsBitmap> iWsBitmapArray;
RPointerArray<CWsFbsFont> iWsFontArray;
RArray<TGraphicDrawerId> iDrawerArray;
TTime iCreationTime;
};
RWsRegion iInvalid; // Region we haven't been sent a begin redraw for.
TRect iRedrawRect;
TRgb iBackColor;
TInt iFlags;
// Regions currently in use for drawing this window:
RPointerArray<CRedrawSegment> iRedrawSegments;
// The segment we are currently storing to. This is allowed to be null!
CRedrawSegment * iCurrentSegment;
// The last GC we drew with so we can detect changes
CWsGc* iLastDrawGc;
// During a scheduled draw, this is the area being drawn to (see comments on ReadRegion)
RWsRegion iLocalRedrawRegion;
TInt iMemoryLock;
TBool iOSBStatus;
TInt iCount;
};
inline TBool CWsRedrawMsgWindow::IsRemoteReadRequired(TInt aOpCode) const
{
return (aOpCode==EWsGcOpDrawTextPtr || aOpCode==EWsGcOpDrawTextVerticalPtr ||
aOpCode==EWsGcOpDrawBoxTextPtr || aOpCode==EWsGcOpDrawBoxTextVerticalPtr);
}
inline TInt CWsRedrawMsgWindow::CurrentCommandBufferWritePos() const
{
WS_ASSERT_DEBUG(iCurrentSegment, EWsPanicDrawCommandsInvalidState);
return iCurrentSegment->iCurrentCommandBufferWritePos;
}
inline CBufSeg* CWsRedrawMsgWindow::CurrentDrawCommandBuffer() const
{
WS_ASSERT_DEBUG(iCurrentSegment, EWsPanicDrawCommandsInvalidState);
return iCurrentSegment->iDrawCommands;
}
inline TBool CWsRedrawMsgWindow::InRedraw() const
{
return iFlags&EBeginEndRedraw;
}
#endif