|  | /*!**************************************************************************** | 
|  |  | 
|  | @file       Shell/PVRShellImpl.h | 
|  | @copyright  Copyright (c) Imagination Technologies Limited. | 
|  | @brief      Makes programming for 3D APIs easier by wrapping surface | 
|  | initialization, texture allocation and other functions for use by a demo. | 
|  |  | 
|  | ******************************************************************************/ | 
|  |  | 
|  | #ifndef __PVRSHELLIMPL_H_ | 
|  | #define __PVRSHELLIMPL_H_ | 
|  |  | 
|  | /***************************************************************************** | 
|  | ** Build options | 
|  | *****************************************************************************/ | 
|  |  | 
|  |  | 
|  | /***************************************************************************** | 
|  | ** Macros | 
|  | *****************************************************************************/ | 
|  | #define FREE(X) { if(X) { free(X); (X)=0; } } | 
|  |  | 
|  | #ifndef _ASSERT | 
|  | #define _ASSERT(X) /**/ | 
|  | #endif | 
|  |  | 
|  | /***************************************************************************** | 
|  | ** Defines | 
|  | *****************************************************************************/ | 
|  | #define STR_WNDTITLE (" - Build ") | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @struct PVRShellData | 
|  | @brief Holds PVRShell internal data. | 
|  | *****************************************************************************/ | 
|  | struct PVRShellData | 
|  | { | 
|  | // Shell Interface Data | 
|  | char        *pszAppName;                /*!< Application name string. */ | 
|  | char        *pszExitMessage;            /*!< Exit message string. */ | 
|  | int         nShellDimX;                 /*!< Width in pixels. */ | 
|  | int         nShellDimY;                 /*!< Height in pixels. */ | 
|  | int         nShellPosX;                 /*!< X position of the window. */ | 
|  | int         nShellPosY;                 /*!< Y position of the window. */ | 
|  | bool        bFullScreen;                /*!< Fullscreen boolean. */ | 
|  | bool        bLandscape;                 /*!< Landscape orientation boolean. false = portrait orientation. */ | 
|  | bool        bNeedPbuffer;               /*!< True if pixel buffer is needed. */ | 
|  | bool        bNeedZbuffer;               /*!< True if Z buffer is needed. */ | 
|  | bool        bNeedStencilBuffer;         /*!< True if stencil buffer is needed. */ | 
|  | bool        bNeedPixmap;                /*!< True if pixmap is needed. */ | 
|  | bool        bNeedPixmapDisableCopy;     /*!< Disables copy if true, because pixmaps are used. */ | 
|  | bool        bLockableBackBuffer;        /*!< DX9 only. Enable the use of D3DPRESENTFLAG_LOCKABLE_BACKBUFFER. */ | 
|  | bool        bSoftwareRender;            /*!< Enable the use of software rendering. */ | 
|  | bool        bNeedAlphaFormatPre;        /*!< EGL only: If true, creates the EGL surface with EGL_ALPHA_FORMAT_PRE. */ | 
|  | bool        bUsingPowerSaving;          /*!< Use power saving mode when device is not in use. */ | 
|  | bool        bOutputInfo;                /*!< Enable information to be output via PVRShellOutputDebug. For example, | 
|  | the depth of the colour surface created, extenstions supported and | 
|  | dimensions of the surface created. */ | 
|  | bool        bNoShellSwapBuffer;         /*!< Disable eglswapbuffers at the end of each frame. */ | 
|  | int         nSwapInterval;              /*!< Interval to wait for monitor vertical sync. */ | 
|  | int         nInitRepeats;               /*!< Number of times to reinitialise. */ | 
|  | int         nDieAfterFrames;            /*!< Set shell to quit after this number of frames (-1 to disable) */ | 
|  | float       fDieAfterTime;              /*!< Set shell to quit after this number of seconds (-1 to disable). */ | 
|  | int         nAASamples;                 /*!< Number of anti-aliasing samples to have. 0 disables anti-aliasing. */ | 
|  | int         nColorBPP;                  /*!< Color buffer size. */ | 
|  | int         nDepthBPP;                  /*!< Depth buffer size. */ | 
|  | int         nCaptureFrameStart;         /*!< The frame to start capturing screenshots from. */ | 
|  | int         nCaptureFrameStop;          /*!< The frame to stop capturing screenshots from. */ | 
|  | int         nCaptureFrameScale;         /*!< Save screenshots scale factor. 1 for no scaling. */ | 
|  | int         nPriority;                  /*!< EGL: If supported sets the egl context priority; | 
|  | 0 for low, 1 for med and 2 for high. */ | 
|  | bool        bForceFrameTime;            /*!< Overrides PVRShellGetTime to force specified frame time. May cause | 
|  | problems if PVRShellGetTime is called multiple times in a frame. */ | 
|  | int         nFrameTime;                 /*!< How long for each frame time to last (in ms). */ | 
|  | bool        bDiscardFrameColor;         /*!< Discard color data at the end of a render. */ | 
|  | bool        bDiscardFrameDepth;         /*!< Discard depth data at the end of a render. */ | 
|  | bool        bDiscardFrameStencil;       /*!< Discard stencil data at the end of a render. */ | 
|  |  | 
|  | // Internal Data | 
|  | bool        bShellPosWasDefault;        /*!< Internal. Default position for the shell was used. */ | 
|  | int         nShellCurFrameNum;          /*!< Internal. Current frame number. */ | 
|  | #ifdef PVRSHELL_FPS_OUTPUT | 
|  | bool        bOutputFPS;                 /*!< Output frames per second. */ | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @class PVRShellCommandLine | 
|  | @brief Command-line interpreter | 
|  | *****************************************************************************/ | 
|  | class PVRShellCommandLine | 
|  | { | 
|  | public: | 
|  | char		*m_psOrig, *m_psSplit; | 
|  | SCmdLineOpt	*m_pOpt; | 
|  | int			m_nOptLen, m_nOptMax; | 
|  |  | 
|  | public: | 
|  | /*!*********************************************************************** | 
|  | @brief		Constructor | 
|  | *************************************************************************/ | 
|  | PVRShellCommandLine(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      Destructor | 
|  | *************************************************************************/ | 
|  | ~PVRShellCommandLine(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief	    Set command-line options to pStr | 
|  | @param[in]  pStr Input string | 
|  | *************************************************************************/ | 
|  | void Set(const char *pStr); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief	    Prepend command-line options to m_psOrig | 
|  | @param[in]  pStr Input string | 
|  | *************************************************************************/ | 
|  | void Prefix(const char *pStr); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      Prepend command-line options to m_psOrig from a file | 
|  | @param[in]  pFileName Input string | 
|  | *************************************************************************/ | 
|  | bool PrefixFromFile(const char *pFileName); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      Parse m_psOrig for command-line options and store them in m_pOpt | 
|  | *************************************************************************/ | 
|  | void Parse(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      Apply the command-line options to shell | 
|  | @param[in]  shell | 
|  | *************************************************************************/ | 
|  | void Apply(PVRShell &shell); | 
|  | }; | 
|  |  | 
|  | /*!**************************************************************************** | 
|  | @enum  EPVRShellState | 
|  | @brief Current Shell state | 
|  | *****************************************************************************/ | 
|  | enum EPVRShellState { | 
|  | ePVRShellInitApp,		/*!< Initialise app */ | 
|  | ePVRShellInitInstance,	/*!< Initialise instance */ | 
|  | ePVRShellRender,		/*!< Render */ | 
|  | ePVRShellReleaseView,	/*!< Release View */ | 
|  | ePVRShellReleaseAPI,	/*!< Release API */ | 
|  | ePVRShellReleaseOS,		/*!< Release Operating System */ | 
|  | ePVRShellQuitApp,		/*!< Quit App */ | 
|  | ePVRShellExit		    /*!< Exit */ | 
|  | }; | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @class  PVRShellInit | 
|  | @brief  The PVRShell initialisation class | 
|  | ****************************************************************************/ | 
|  | class PVRShellInit : public PVRShellInitAPI, public PVRShellInitOS | 
|  | { | 
|  | public: | 
|  | friend class PVRShell; | 
|  | friend class PVRShellInitOS; | 
|  | friend class PVRShellInitAPI; | 
|  |  | 
|  | PVRShell			*m_pShell;		/*!< Our PVRShell class */ | 
|  | PVRShellCommandLine	m_CommandLine;	/*!< Our Command-line class */ | 
|  |  | 
|  | bool		gShellDone;				/*!< Indicates that the application has finished */ | 
|  | EPVRShellState	m_eState;			/*!< Current PVRShell state */ | 
|  |  | 
|  | // Key handling | 
|  | PVRShellKeyName	nLastKeyPressed;	/*!< Holds the last key pressed */ | 
|  | PVRShellKeyName m_eKeyMapLEFT;		/*!< Holds the value to be returned when PVRShellKeyNameLEFT is requested */ | 
|  | PVRShellKeyName m_eKeyMapUP;		/*!< Holds the value to be returned when PVRShellKeyNameUP is requested */ | 
|  | PVRShellKeyName m_eKeyMapRIGHT;		/*!< Holds the value to be returned when PVRShellKeyNameRIGHT is requested */ | 
|  | PVRShellKeyName m_eKeyMapDOWN;		/*!< Holds the value to be returned when PVRShellKeyNameDOWN is requested */ | 
|  |  | 
|  | // Read and Write path | 
|  | char	*m_pReadPath;				/*!<Holds the path where the application will read the data from */ | 
|  | char	*m_pWritePath;				/*!<Holds the path where the application will write the data to */ | 
|  |  | 
|  | #ifdef PVRSHELL_FPS_OUTPUT | 
|  | // Frames per second (FPS) | 
|  | int		m_i32FpsFrameCnt, m_i32FpsTimePrev; | 
|  | #endif | 
|  |  | 
|  | public: | 
|  |  | 
|  | protected: | 
|  | float m_vec2PointerLocation[2]; | 
|  | float m_vec2PointerLocationStart[2]; | 
|  | float m_vec2PointerLocationEnd[2]; | 
|  |  | 
|  | // Touch handling | 
|  | bool m_bTouching; | 
|  |  | 
|  | public: | 
|  | /*!*********************************************************************** | 
|  | @brief     Constructor | 
|  | *************************************************************************/ | 
|  | PVRShellInit(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Destructor | 
|  | *************************************************************************/ | 
|  | ~PVRShellInit(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     PVRShell Initialisation. | 
|  | @return    True on success and false on failure | 
|  | *************************************************************************/ | 
|  | bool Init(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     PVRShell Deinitialisation. | 
|  | *************************************************************************/ | 
|  | void Deinit(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @param[in] str   A string containing the command-line | 
|  | @brief     Receives the command-line from the application. | 
|  | *************************************************************************/ | 
|  | void CommandLine(const char *str); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Receives the command-line from the application. | 
|  | @param[in] argc   Number of strings in argv | 
|  | @param[in] argv   An array of strings | 
|  | *************************************************************************/ | 
|  | void CommandLine(int argc, char **argv); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Return 'true' if the specific key has been pressed. | 
|  | @param[in] key The key we're querying for | 
|  | *************************************************************************/ | 
|  | bool DoIsKeyPressed(const PVRShellKeyName key); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @param[in] key   The key that has been pressed | 
|  | @brief     Used by the OS-specific code to tell the Shell that a key has been pressed. | 
|  | *************************************************************************/ | 
|  | void KeyPressed(PVRShellKeyName key); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Used by the OS-specific code to tell the Shell that a touch has began at a location. | 
|  | @param[in] vec2Location   The position of a click/touch on the screen when it first touches. | 
|  | *************************************************************************/ | 
|  | void TouchBegan(const float vec2Location[2]); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Used by the OS-specific code to tell the Shell that a touch has began at a location. | 
|  | @param[in] vec2Location The position of the pointer/touch pressed on the screen. | 
|  | *************************************************************************/ | 
|  | void TouchMoved(const float vec2Location[2]); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Used by the OS-specific code to tell the Shell that the current touch has ended at a location. | 
|  | @param[in] vec2Location   The position of the pointer/touch on the screen when it is released. | 
|  | *************************************************************************/ | 
|  | void TouchEnded(const float vec2Location[2]); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Used by the OS-specific code to tell the Shell where to read external files from. | 
|  | @return    A path the application is capable of reading from. | 
|  | *************************************************************************/ | 
|  | const char	*GetReadPath() const; | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Used by the OS-specific code to tell the Shell where to write to. | 
|  | @return    A path the applications is capable of writing to | 
|  | *************************************************************************/ | 
|  | const char	*GetWritePath() const; | 
|  |  | 
|  | /*!****************************************************************************** | 
|  | @brief     Sets the default app name (to be displayed by the OS) | 
|  | @param[in] str The application name | 
|  | *******************************************************************************/ | 
|  | void SetAppName(const char * const str); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Set the path to where the application expects to read from. | 
|  | @param[in] str The read path | 
|  | *************************************************************************/ | 
|  | void SetReadPath(const char * const str); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Set the path to where the application expects to write to. | 
|  | @param[in] str The write path | 
|  | *************************************************************************/ | 
|  | void SetWritePath(const char * const str); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Called from the OS-specific code to perform the render. | 
|  | When this function fails the application will quit. | 
|  | *************************************************************************/ | 
|  | bool Run(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     When prefOutputInfo is set to true this function outputs | 
|  | various pieces of non-API dependent information via | 
|  | PVRShellOutputDebug. | 
|  | *************************************************************************/ | 
|  | void OutputInfo(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     When prefOutputInfo is set to true this function outputs | 
|  | various pieces of API dependent information via | 
|  | PVRShellOutputDebug. | 
|  | *************************************************************************/ | 
|  | void OutputAPIInfo(); | 
|  |  | 
|  | #ifdef PVRSHELL_FPS_OUTPUT | 
|  | /*!**************************************************************************** | 
|  | @brief     Calculates a value for frames-per-second (FPS). | 
|  | *****************************************************************************/ | 
|  | void FpsUpdate(); | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | OS functionality | 
|  | */ | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Initialisation for OS-specific code. | 
|  | *************************************************************************/ | 
|  | void		OsInit(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Saves instance handle and creates main window | 
|  | In this function, we save the instance handle in a global variable and | 
|  | create and display the main program window. | 
|  | *************************************************************************/ | 
|  | bool		OsInitOS(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Destroys main window | 
|  | *************************************************************************/ | 
|  | void		OsReleaseOS(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Destroys main window | 
|  | *************************************************************************/ | 
|  | void		OsExit(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Perform API initialization and bring up window / fullscreen | 
|  | *************************************************************************/ | 
|  | bool		OsDoInitAPI(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Clean up after we're done | 
|  | *************************************************************************/ | 
|  | void		OsDoReleaseAPI(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Main message loop / render loop | 
|  | *************************************************************************/ | 
|  | void		OsRenderComplete(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     When using pixmaps, copy the render to the display | 
|  | *************************************************************************/ | 
|  | bool		OsPixmapCopy(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Called from InitAPI() to get the NativeDisplayType | 
|  | *************************************************************************/ | 
|  | void		*OsGetNativeDisplayType(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Called from InitAPI() to get the NativePixmapType | 
|  | *************************************************************************/ | 
|  | void		*OsGetNativePixmapType(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief 	   Called from InitAPI() to get the NativeWindowType | 
|  | *************************************************************************/ | 
|  | void		*OsGetNativeWindowType(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief    	Retrieves OS-specific data | 
|  | @param[in]  prefName	Name of preference to get | 
|  | @param[out] pn   A pointer set to the preference. | 
|  | @return 	true on success | 
|  | *************************************************************************/ | 
|  | bool		OsGet(const prefNameIntEnum prefName, int *pn); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      Retrieves OS-specific data | 
|  | @param[in]  prefName	Name of value to get | 
|  | @param[out]	pp A pointer set to the value asked for | 
|  | @return 	true on success | 
|  | *************************************************************************/ | 
|  | bool		OsGet(const prefNamePtrEnum prefName, void **pp); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Sets OS-specific data | 
|  | @param[in] prefName		Name of preference to set to value | 
|  | @param[in] value		Value | 
|  | @return	   true for success | 
|  | *************************************************************************/ | 
|  | bool		OsSet(const prefNameBoolEnum prefName, const bool value); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Sets OS-specific data | 
|  | @param[in] prefName	Name of value to set | 
|  | @param[in] i32Value 	The value to set our named value to | 
|  | @return    true on success | 
|  | *************************************************************************/ | 
|  | bool		OsSet(const prefNameIntEnum prefName, const int i32Value); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Prints a debug string | 
|  | @param[in] str The debug string to display | 
|  | *************************************************************************/ | 
|  | void OsDisplayDebugString(char const * const str); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Gets the time in milliseconds | 
|  | *************************************************************************/ | 
|  | unsigned long OsGetTime(); | 
|  |  | 
|  | /* | 
|  | API functionality | 
|  | */ | 
|  | /*!*********************************************************************** | 
|  | @brief     Initialisation for API-specific code. | 
|  | *************************************************************************/ | 
|  | bool ApiInitAPI(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Releases all resources allocated by the API. | 
|  | *************************************************************************/ | 
|  | void ApiReleaseAPI(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief      API-specific function to store the current content of the | 
|  | FrameBuffer into the memory allocated by the user. | 
|  | @param[in] 	Width  Width of the region to capture | 
|  | @param[in] 	Height Height of the region to capture | 
|  | @param[out]	pBuf   A buffer to put the screen capture into | 
|  | @return     true on success | 
|  | *************************************************************************/ | 
|  | bool ApiScreenCaptureBuffer(int Width,int Height,unsigned char *pBuf); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief    	Perform API operations required after a frame has finished (e.g., flipping). | 
|  | *************************************************************************/ | 
|  | void ApiRenderComplete(); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief    	Set preferences which are specific to the API. | 
|  | @param[in] 	prefName	Name of preference to set | 
|  | @param[out]	i32Value	Value to set it to | 
|  | *************************************************************************/ | 
|  | bool ApiSet(const prefNameIntEnum prefName, const int i32Value); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief    	Get parameters which are specific to the API. | 
|  | @param[in]  prefName	Name of value to get | 
|  | @param[out] pn   A pointer set to the value asked for | 
|  | *************************************************************************/ | 
|  | bool ApiGet(const prefNameIntEnum prefName, int *pn); | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief    	 Get parameters which are specific to the API. | 
|  | @param[in]  prefName	Name of value to get | 
|  | @param[out] pp   A pointer set to the value asked for | 
|  | *************************************************************************/ | 
|  | bool ApiGet(const prefNamePtrEnum prefName, void **pp); | 
|  |  | 
|  |  | 
|  | /*!*********************************************************************** | 
|  | @brief     Run specific API code to perform the operations requested in preferences. | 
|  | *************************************************************************/ | 
|  | void ApiActivatePreferences(); | 
|  | }; | 
|  |  | 
|  | #endif /* __PVRSHELLIMPL_H_ */ | 
|  |  | 
|  | /***************************************************************************** | 
|  | End of file (PVRShellImpl.h) | 
|  | *****************************************************************************/ | 
|  |  |