Home | History | Annotate | Download | only in Shell
      1 /*!****************************************************************************
      2 
      3  @file       Shell/PVRShellImpl.h
      4  @copyright  Copyright (c) Imagination Technologies Limited.
      5  @brief      Makes programming for 3D APIs easier by wrapping surface
      6              initialization, texture allocation and other functions for use by a demo.
      7 
      8 ******************************************************************************/
      9 
     10 #ifndef __PVRSHELLIMPL_H_
     11 #define __PVRSHELLIMPL_H_
     12 
     13 /*****************************************************************************
     14 ** Build options
     15 *****************************************************************************/
     16 
     17 
     18 /*****************************************************************************
     19 ** Macros
     20 *****************************************************************************/
     21 #define FREE(X) { if(X) { free(X); (X)=0; } }
     22 
     23 #ifndef _ASSERT
     24 #define _ASSERT(X) /**/
     25 #endif
     26 
     27 /*****************************************************************************
     28 ** Defines
     29 *****************************************************************************/
     30 #define STR_WNDTITLE (" - Build ")
     31 
     32 /*!***************************************************************************
     33  @struct PVRShellData
     34  @brief Holds PVRShell internal data.
     35 *****************************************************************************/
     36 struct PVRShellData
     37 {
     38     // Shell Interface Data
     39     char        *pszAppName;                /*!< Application name string. */
     40     char        *pszExitMessage;            /*!< Exit message string. */
     41     int         nShellDimX;                 /*!< Width in pixels. */
     42     int         nShellDimY;                 /*!< Height in pixels. */
     43     int         nShellPosX;                 /*!< X position of the window. */
     44     int         nShellPosY;                 /*!< Y position of the window. */
     45     bool        bFullScreen;                /*!< Fullscreen boolean. */
     46     bool        bLandscape;                 /*!< Landscape orientation boolean. false = portrait orientation. */
     47     bool        bNeedPbuffer;               /*!< True if pixel buffer is needed. */
     48     bool        bNeedZbuffer;               /*!< True if Z buffer is needed. */
     49     bool        bNeedStencilBuffer;         /*!< True if stencil buffer is needed. */
     50     bool        bNeedPixmap;                /*!< True if pixmap is needed. */
     51     bool        bNeedPixmapDisableCopy;     /*!< Disables copy if true, because pixmaps are used. */
     52     bool        bLockableBackBuffer;        /*!< DX9 only. Enable the use of D3DPRESENTFLAG_LOCKABLE_BACKBUFFER. */
     53     bool        bSoftwareRender;            /*!< Enable the use of software rendering. */
     54     bool        bNeedAlphaFormatPre;        /*!< EGL only: If true, creates the EGL surface with EGL_ALPHA_FORMAT_PRE. */
     55     bool        bUsingPowerSaving;          /*!< Use power saving mode when device is not in use. */
     56     bool        bOutputInfo;                /*!< Enable information to be output via PVRShellOutputDebug. For example,
     57                                                  the depth of the colour surface created, extenstions supported and
     58                                                  dimensions of the surface created. */
     59     bool        bNoShellSwapBuffer;         /*!< Disable eglswapbuffers at the end of each frame. */
     60     int         nSwapInterval;              /*!< Interval to wait for monitor vertical sync. */
     61     int         nInitRepeats;               /*!< Number of times to reinitialise. */
     62     int         nDieAfterFrames;            /*!< Set shell to quit after this number of frames (-1 to disable) */
     63     float       fDieAfterTime;              /*!< Set shell to quit after this number of seconds (-1 to disable). */
     64     int         nAASamples;                 /*!< Number of anti-aliasing samples to have. 0 disables anti-aliasing. */
     65     int         nColorBPP;                  /*!< Color buffer size. */
     66     int         nDepthBPP;                  /*!< Depth buffer size. */
     67     int         nCaptureFrameStart;         /*!< The frame to start capturing screenshots from. */
     68     int         nCaptureFrameStop;          /*!< The frame to stop capturing screenshots from. */
     69     int         nCaptureFrameScale;         /*!< Save screenshots scale factor. 1 for no scaling. */
     70     int         nPriority;                  /*!< EGL: If supported sets the egl context priority;
     71                                                  0 for low, 1 for med and 2 for high. */
     72     bool        bForceFrameTime;            /*!< Overrides PVRShellGetTime to force specified frame time. May cause
     73                                                  problems if PVRShellGetTime is called multiple times in a frame. */
     74     int         nFrameTime;                 /*!< How long for each frame time to last (in ms). */
     75     bool        bDiscardFrameColor;         /*!< Discard color data at the end of a render. */
     76     bool        bDiscardFrameDepth;         /*!< Discard depth data at the end of a render. */
     77     bool        bDiscardFrameStencil;       /*!< Discard stencil data at the end of a render. */
     78 
     79     // Internal Data
     80     bool        bShellPosWasDefault;        /*!< Internal. Default position for the shell was used. */
     81     int         nShellCurFrameNum;          /*!< Internal. Current frame number. */
     82 #ifdef PVRSHELL_FPS_OUTPUT
     83     bool        bOutputFPS;                 /*!< Output frames per second. */
     84 #endif
     85 };
     86 
     87 /*!***************************************************************************
     88  @class PVRShellCommandLine
     89  @brief Command-line interpreter
     90 *****************************************************************************/
     91 class PVRShellCommandLine
     92 {
     93 public:
     94 	char		*m_psOrig, *m_psSplit;
     95 	SCmdLineOpt	*m_pOpt;
     96 	int			m_nOptLen, m_nOptMax;
     97 
     98 public:
     99 	/*!***********************************************************************
    100 	@brief		Constructor
    101 	*************************************************************************/
    102 	PVRShellCommandLine();
    103 
    104 	/*!***********************************************************************
    105 	@brief      Destructor
    106 	*************************************************************************/
    107 	~PVRShellCommandLine();
    108 
    109 	/*!***********************************************************************
    110 	@brief	    Set command-line options to pStr
    111 	@param[in]  pStr Input string
    112 	*************************************************************************/
    113 	void Set(const char *pStr);
    114 
    115 	/*!***********************************************************************
    116 	@brief	    Prepend command-line options to m_psOrig
    117 	@param[in]  pStr Input string
    118 	*************************************************************************/
    119 	void Prefix(const char *pStr);
    120 
    121 	/*!***********************************************************************
    122 	@brief      Prepend command-line options to m_psOrig from a file
    123 	@param[in]  pFileName Input string
    124 	*************************************************************************/
    125 	bool PrefixFromFile(const char *pFileName);
    126 
    127 	/*!***********************************************************************
    128 	@brief      Parse m_psOrig for command-line options and store them in m_pOpt
    129 	*************************************************************************/
    130 	void Parse();
    131 
    132 	/*!***********************************************************************
    133 	@brief      Apply the command-line options to shell
    134 	@param[in]  shell
    135 	*************************************************************************/
    136 	void Apply(PVRShell &shell);
    137 };
    138 
    139 /*!****************************************************************************
    140  @enum  EPVRShellState
    141  @brief Current Shell state
    142 *****************************************************************************/
    143 enum EPVRShellState {
    144 	ePVRShellInitApp,		/*!< Initialise app */
    145 	ePVRShellInitInstance,	/*!< Initialise instance */
    146 	ePVRShellRender,		/*!< Render */
    147 	ePVRShellReleaseView,	/*!< Release View */
    148 	ePVRShellReleaseAPI,	/*!< Release API */
    149 	ePVRShellReleaseOS,		/*!< Release Operating System */
    150 	ePVRShellQuitApp,		/*!< Quit App */
    151 	ePVRShellExit		    /*!< Exit */
    152 };
    153 
    154 /*!***************************************************************************
    155  @class  PVRShellInit
    156  @brief  The PVRShell initialisation class
    157  ****************************************************************************/
    158 class PVRShellInit : public PVRShellInitAPI, public PVRShellInitOS
    159 {
    160 public:
    161 	friend class PVRShell;
    162 	friend class PVRShellInitOS;
    163 	friend class PVRShellInitAPI;
    164 
    165 	PVRShell			*m_pShell;		/*!< Our PVRShell class */
    166 	PVRShellCommandLine	m_CommandLine;	/*!< Our Command-line class */
    167 
    168 	bool		gShellDone;				/*!< Indicates that the application has finished */
    169 	EPVRShellState	m_eState;			/*!< Current PVRShell state */
    170 
    171 	// Key handling
    172 	PVRShellKeyName	nLastKeyPressed;	/*!< Holds the last key pressed */
    173 	PVRShellKeyName m_eKeyMapLEFT;		/*!< Holds the value to be returned when PVRShellKeyNameLEFT is requested */
    174 	PVRShellKeyName m_eKeyMapUP;		/*!< Holds the value to be returned when PVRShellKeyNameUP is requested */
    175 	PVRShellKeyName m_eKeyMapRIGHT;		/*!< Holds the value to be returned when PVRShellKeyNameRIGHT is requested */
    176 	PVRShellKeyName m_eKeyMapDOWN;		/*!< Holds the value to be returned when PVRShellKeyNameDOWN is requested */
    177 
    178 	// Read and Write path
    179 	char	*m_pReadPath;				/*!<Holds the path where the application will read the data from */
    180 	char	*m_pWritePath;				/*!<Holds the path where the application will write the data to */
    181 
    182 #ifdef PVRSHELL_FPS_OUTPUT
    183 	// Frames per second (FPS)
    184 	int		m_i32FpsFrameCnt, m_i32FpsTimePrev;
    185 #endif
    186 
    187 public:
    188 
    189 protected:
    190 	float m_vec2PointerLocation[2];
    191 	float m_vec2PointerLocationStart[2];
    192 	float m_vec2PointerLocationEnd[2];
    193 
    194 	// Touch handling
    195 	bool m_bTouching;
    196 
    197 public:
    198     /*!***********************************************************************
    199 	@brief     Constructor
    200 	*************************************************************************/
    201 	PVRShellInit();
    202 
    203 	/*!***********************************************************************
    204 	@brief     Destructor
    205 	*************************************************************************/
    206 	~PVRShellInit();
    207 
    208 	/*!***********************************************************************
    209 	@brief     PVRShell Initialisation.
    210 	@return    True on success and false on failure
    211 	*************************************************************************/
    212 	bool Init();
    213 
    214 	/*!***********************************************************************
    215 	@brief     PVRShell Deinitialisation.
    216 	*************************************************************************/
    217 	void Deinit();
    218 
    219 	/*!***********************************************************************
    220 	@param[in] str   A string containing the command-line
    221 	@brief     Receives the command-line from the application.
    222 	*************************************************************************/
    223 	void CommandLine(const char *str);
    224 
    225 	/*!***********************************************************************
    226 	@brief     Receives the command-line from the application.
    227 	@param[in] argc   Number of strings in argv
    228 	@param[in] argv   An array of strings
    229 	*************************************************************************/
    230 	void CommandLine(int argc, char **argv);
    231 
    232 	/*!***********************************************************************
    233 	@brief     Return 'true' if the specific key has been pressed.
    234 	@param[in] key The key we're querying for
    235 	*************************************************************************/
    236 	bool DoIsKeyPressed(const PVRShellKeyName key);
    237 
    238 	/*!***********************************************************************
    239 	@param[in] key   The key that has been pressed
    240 	@brief     Used by the OS-specific code to tell the Shell that a key has been pressed.
    241 	*************************************************************************/
    242 	void KeyPressed(PVRShellKeyName key);
    243 
    244 	/*!***********************************************************************
    245 	@brief     Used by the OS-specific code to tell the Shell that a touch has began at a location.
    246 	@param[in] vec2Location   The position of a click/touch on the screen when it first touches.
    247 	*************************************************************************/
    248 	void TouchBegan(const float vec2Location[2]);
    249 
    250 	/*!***********************************************************************
    251 	@brief     Used by the OS-specific code to tell the Shell that a touch has began at a location.
    252 	@param[in] vec2Location The position of the pointer/touch pressed on the screen.
    253 	*************************************************************************/
    254 	void TouchMoved(const float vec2Location[2]);
    255 
    256 	/*!***********************************************************************
    257 	@brief     Used by the OS-specific code to tell the Shell that the current touch has ended at a location.
    258 	@param[in] vec2Location   The position of the pointer/touch on the screen when it is released.
    259 	*************************************************************************/
    260 	void TouchEnded(const float vec2Location[2]);
    261 
    262 	/*!***********************************************************************
    263 	@brief     Used by the OS-specific code to tell the Shell where to read external files from.
    264 	@return    A path the application is capable of reading from.
    265 	*************************************************************************/
    266 	const char	*GetReadPath() const;
    267 
    268 	/*!***********************************************************************
    269 	@brief     Used by the OS-specific code to tell the Shell where to write to.
    270 	@return    A path the applications is capable of writing to
    271 	*************************************************************************/
    272 	const char	*GetWritePath() const;
    273 
    274 	/*!******************************************************************************
    275 	@brief     Sets the default app name (to be displayed by the OS)
    276 	@param[in] str The application name
    277 	*******************************************************************************/
    278 	void SetAppName(const char * const str);
    279 
    280 	/*!***********************************************************************
    281 	@brief     Set the path to where the application expects to read from.
    282 	@param[in] str The read path
    283 	*************************************************************************/
    284 	void SetReadPath(const char * const str);
    285 
    286 	/*!***********************************************************************
    287 	@brief     Set the path to where the application expects to write to.
    288 	@param[in] str The write path
    289 	*************************************************************************/
    290 	void SetWritePath(const char * const str);
    291 
    292 	/*!***********************************************************************
    293 	@brief     Called from the OS-specific code to perform the render.
    294 	           When this function fails the application will quit.
    295 	*************************************************************************/
    296 	bool Run();
    297 
    298 	/*!***********************************************************************
    299 	@brief     When prefOutputInfo is set to true this function outputs
    300 			   various pieces of non-API dependent information via
    301 			   PVRShellOutputDebug.
    302 	*************************************************************************/
    303 	void OutputInfo();
    304 
    305 	/*!***********************************************************************
    306 	@brief     When prefOutputInfo is set to true this function outputs
    307 			   various pieces of API dependent information via
    308 			   PVRShellOutputDebug.
    309 	*************************************************************************/
    310 	void OutputAPIInfo();
    311 
    312 #ifdef PVRSHELL_FPS_OUTPUT
    313 	/*!****************************************************************************
    314 	@brief     Calculates a value for frames-per-second (FPS).
    315 	*****************************************************************************/
    316 	void FpsUpdate();
    317 #endif
    318 
    319 	/*
    320 		OS functionality
    321 	*/
    322 
    323 	/*!***********************************************************************
    324 	@brief     Initialisation for OS-specific code.
    325 	*************************************************************************/
    326 	void		OsInit();
    327 
    328 	/*!***********************************************************************
    329 	@brief     Saves instance handle and creates main window
    330 			   In this function, we save the instance handle in a global variable and
    331 			   create and display the main program window.
    332 	*************************************************************************/
    333 	bool		OsInitOS();
    334 
    335 	/*!***********************************************************************
    336 	@brief     Destroys main window
    337 	*************************************************************************/
    338 	void		OsReleaseOS();
    339 
    340 	/*!***********************************************************************
    341 	@brief     Destroys main window
    342 	*************************************************************************/
    343 	void		OsExit();
    344 
    345 	/*!***********************************************************************
    346 	@brief     Perform API initialization and bring up window / fullscreen
    347 	*************************************************************************/
    348 	bool		OsDoInitAPI();
    349 
    350 	/*!***********************************************************************
    351 	@brief     Clean up after we're done
    352 	*************************************************************************/
    353 	void		OsDoReleaseAPI();
    354 
    355 	/*!***********************************************************************
    356 	@brief     Main message loop / render loop
    357 	*************************************************************************/
    358 	void		OsRenderComplete();
    359 
    360 	/*!***********************************************************************
    361 	@brief     When using pixmaps, copy the render to the display
    362 	*************************************************************************/
    363 	bool		OsPixmapCopy();
    364 
    365 	/*!***********************************************************************
    366 	@brief     Called from InitAPI() to get the NativeDisplayType
    367 	*************************************************************************/
    368 	void		*OsGetNativeDisplayType();
    369 
    370 	/*!***********************************************************************
    371 	@brief     Called from InitAPI() to get the NativePixmapType
    372 	*************************************************************************/
    373 	void		*OsGetNativePixmapType();
    374 
    375 	/*!***********************************************************************
    376 	@brief 	   Called from InitAPI() to get the NativeWindowType
    377 	*************************************************************************/
    378 	void		*OsGetNativeWindowType();
    379 
    380 	/*!***********************************************************************
    381 	@brief    	Retrieves OS-specific data
    382 	@param[in]  prefName	Name of preference to get
    383 	@param[out] pn   A pointer set to the preference.
    384 	@return 	true on success
    385 	*************************************************************************/
    386 	bool		OsGet(const prefNameIntEnum prefName, int *pn);
    387 
    388 	/*!***********************************************************************
    389 	@brief      Retrieves OS-specific data
    390 	@param[in]  prefName	Name of value to get
    391 	@param[out]	pp A pointer set to the value asked for
    392 	@return 	true on success
    393 	*************************************************************************/
    394 	bool		OsGet(const prefNamePtrEnum prefName, void **pp);
    395 
    396 	/*!***********************************************************************
    397 	@brief     Sets OS-specific data
    398 	@param[in] prefName		Name of preference to set to value
    399 	@param[in] value		Value
    400 	@return	   true for success
    401 	*************************************************************************/
    402 	bool		OsSet(const prefNameBoolEnum prefName, const bool value);
    403 
    404 	/*!***********************************************************************
    405 	@brief     Sets OS-specific data
    406 	@param[in] prefName	Name of value to set
    407 	@param[in] i32Value 	The value to set our named value to
    408 	@return    true on success
    409 	*************************************************************************/
    410 	bool		OsSet(const prefNameIntEnum prefName, const int i32Value);
    411 
    412 	/*!***********************************************************************
    413 	@brief     Prints a debug string
    414 	@param[in] str The debug string to display
    415 	*************************************************************************/
    416 	void OsDisplayDebugString(char const * const str);
    417 
    418 	/*!***********************************************************************
    419 	@brief     Gets the time in milliseconds
    420 	*************************************************************************/
    421 	unsigned long OsGetTime();
    422 
    423 	/*
    424 		API functionality
    425 	*/
    426 	/*!***********************************************************************
    427 	@brief     Initialisation for API-specific code.
    428 	*************************************************************************/
    429 	bool ApiInitAPI();
    430 
    431 	/*!***********************************************************************
    432 	@brief     Releases all resources allocated by the API.
    433 	*************************************************************************/
    434 	void ApiReleaseAPI();
    435 
    436 	/*!***********************************************************************
    437 	@brief      API-specific function to store the current content of the
    438 				FrameBuffer into the memory allocated by the user.
    439 	@param[in] 	Width  Width of the region to capture
    440 	@param[in] 	Height Height of the region to capture
    441 	@param[out]	pBuf   A buffer to put the screen capture into
    442 	@return     true on success
    443 	*************************************************************************/
    444 	bool ApiScreenCaptureBuffer(int Width,int Height,unsigned char *pBuf);
    445 
    446 	/*!***********************************************************************
    447 	@brief    	Perform API operations required after a frame has finished (e.g., flipping).
    448 	*************************************************************************/
    449 	void ApiRenderComplete();
    450 
    451 	/*!***********************************************************************
    452 	@brief    	Set preferences which are specific to the API.
    453 	@param[in] 	prefName	Name of preference to set
    454 	@param[out]	i32Value	Value to set it to
    455 	*************************************************************************/
    456 	bool ApiSet(const prefNameIntEnum prefName, const int i32Value);
    457 
    458 	/*!***********************************************************************
    459 	@brief    	Get parameters which are specific to the API.
    460 	@param[in]  prefName	Name of value to get
    461 	@param[out] pn   A pointer set to the value asked for
    462 	*************************************************************************/
    463 	bool ApiGet(const prefNameIntEnum prefName, int *pn);
    464 
    465     /*!***********************************************************************
    466 	@brief    	 Get parameters which are specific to the API.
    467 	@param[in]  prefName	Name of value to get
    468 	@param[out] pp   A pointer set to the value asked for
    469 	*************************************************************************/
    470 	bool ApiGet(const prefNamePtrEnum prefName, void **pp);
    471 
    472 
    473 	/*!***********************************************************************
    474 	@brief     Run specific API code to perform the operations requested in preferences.
    475 	*************************************************************************/
    476 	void ApiActivatePreferences();
    477 };
    478 
    479 #endif /* __PVRSHELLIMPL_H_ */
    480 
    481 /*****************************************************************************
    482  End of file (PVRShellImpl.h)
    483 *****************************************************************************/
    484 
    485