| /*!**************************************************************************** |
| |
| @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) |
| *****************************************************************************/ |
| |