blob: ef7a50c2a8eef2b20d650054a7cde5c12710d261 [file] [log] [blame]
Nicolas Capens7b21f272014-06-04 22:51:10 -04001/*!****************************************************************************
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*****************************************************************************/
36struct 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*****************************************************************************/
91class PVRShellCommandLine
92{
93public:
94 char *m_psOrig, *m_psSplit;
95 SCmdLineOpt *m_pOpt;
96 int m_nOptLen, m_nOptMax;
97
98public:
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*****************************************************************************/
143enum 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 ****************************************************************************/
158class PVRShellInit : public PVRShellInitAPI, public PVRShellInitOS
159{
160public:
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
187public:
188
189protected:
190 float m_vec2PointerLocation[2];
191 float m_vec2PointerLocationStart[2];
192 float m_vec2PointerLocationEnd[2];
193
194 // Touch handling
195 bool m_bTouching;
196
197public:
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