Nicolas Capens | 7b21f27 | 2014-06-04 22:51:10 -0400 | [diff] [blame] | 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 | |