/*!****************************************************************************
@file Shell/PVRShell.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 __PVRSHELL_H_
#define __PVRSHELL_H_
/*****************************************************************************/
/*! @mainpage PVRShell
******************************************************************************
@tableofcontents
@section overview Overview
*****************************
PVRShell is a C++ class used to make programming for PowerVR platforms easier and more portable.
PVRShell takes care of all API and OS initialisation for the user and handles adapters, devices, screen/windows modes,
resolution, buffering, depth-buffer, viewport creation & clearing, etc...
PVRShell consists of 3 files: PVRShell.cpp, PVRShellOS.cpp and PVRShellAPI.cpp.
PVRShellOS.cpp and PVRShellAPI.cpp are supplied per platform and contain all the code to initialise the specific
API (OpenGL ES, Direct3D Mobile, etc.) and the OS (Windows, Linux, WinCE, etc.).
PVRShell.cpp is where the common code resides and it interacts with the user application through an abstraction layer.
A new application must link to these three files and must create a class that will inherit the PVRShell class.
This class will provide five virtual functions to interface with the user.
The user also needs to register his application class through the NewDemo function:
@code
class MyApplication: public PVRShell
{
public:
virtual bool InitApplication();
virtual bool InitView();
virtual bool ReleaseView();
virtual bool QuitApplication();
virtual bool RenderScene();
};
PVRShell* NewDemo()
{
return new MyApplication();
}
@endcode
@section interface Interface
******************************
There are two functions for initialisation, two functions to release allocated resources and a render function:
InitApplication() will be called by PVRShell once per run, before the graphic context is created.
It is used to initialise variables that are not dependant on the rendering context (e.g. external modules, loading user data, etc.).
QuitApplication() will be called by PVRShell once per run, just before exiting the program.
If the graphic context is lost, QuitApplication() will not be called.
InitView() will be called by PVRShell upon creation or change in the rendering context.
It is used to initialise variables that are dependant on the rendering context (e.g. textures, vertex buffers, etc.).
ReleaseView() will be called by PVRShell before changing to a new rendering context or
when finalising the application (before calling QuitApplication).
RenderScene() is the main rendering loop function of the program. This function must return FALSE when the user wants to terminate the application.
PVRShell will call this function every frame and will manage relevant OS events.
There are other PVRShell functions which allow the user to set his/her preferences and get data back from the devices:
PVRShellSet() and PVRShellGet() are used to pass data to and from PVRShell. PVRShellSet() is recommended to be used
in InitApplication() so the user preferences are applied at the API initialisation.
There is a definition of these functions per type of data passed or returned. Please check the prefNameBoolEnum, prefNameFloatEnum,
prefNameIntEnum, prefNamePtrEnum and prefNameConstPtrEnum enumerations for a full list of the data available.
This is an example:
@code
bool MyApplication::InitApplication()
{
PVRShellSet (prefFullScreen, true);
}
bool MyApplication::RenderScene()
{
int dwCurrentWidth = PVRShellGet (prefHeight);
int dwCurrentHeight = PVRShellGet (prefWidth);
return true;
}
@endcode
@section helper Helper functions
*************************************
The user input is abstracted with the PVRShellIsKeyPressed() function. It will not work in all devices, but we have tried to map the most
relevant keys when possible. See PVRShellKeyName enumeration for the list of keys supported. This function will return true or false depending on
the specified key being pressed.
There are a few other helper functions supplied by PVRShell as well. These functions allow you to read the timer, to output debug information and to
save a screen-shot of the current frame:
PVRShellGetTime() returns time in milliseconds.
PVRShellOutputDebug() will write a debug string (same format as printf) to the platform debug output.
PVRShellScreenCaptureBuffer() and PVRShellWriteBMPFile() will be used to save the current frame as a BMP file. PVRShellScreenCaptureBuffer()
receives a pointer to an area of memory containing the screen buffer. The memory should be freed with free() when not needed any longer.
Example of screenshot:
@code
bool MyApplication::RenderScene()
{
[...]
unsigned char *pLines;
PVRShellScreenCaptureBuffer(PVRShellGet (prefWidth), PVRShellGet (prefHeight), &pLines);
PVRShellScreenSave("myfile", pLines, NULL);
free (pLines);
return true;
}
@endcode
@section cmd Command-line
*************************************
Across all platforms, PVRShell takes a set of command-line arguments which allow things like the position and size of the demo
to be controlled. The list below shows these options.
\b -width=N Sets the horizontal viewport width to N.
\b -height=N Sets the vertical viewport height to N.
\b -posx=N Sets the x coordinate of the viewport.
\b -posy=N Sets the y coordinate of the viewport.
\b -aasamples=N Sets the number of samples to use for full screen anti-aliasing. e.g 0, 2, 4, 8
\b -fullscreen=N Enable/Disable fullscreen mode. N can be: 0=Windowed 1=Fullscreen.
\b -qat=N Quits after N seconds.
\b -qaf=N Quits after N frames.
\b -powersaving=N Where available enable/disable power saving. N can be: 0=Disable power saving 1=Enable power saving.
\b -vsync=N Where available modify the apps vsync parameters.
\b -version Output the SDK version to the debug output.
\b -info Output setup information (e.g. window width) to the debug output.
\b -rotatekeys=N Sets the orientation of the keyboard input. N can be: 0-3, 0 is no rotation.
\b -c=N Save a single screenshot or a range. e.g. -c=1-10, -c=14.
\b -priority=N EGL only. Sets the priority of the EGL context.
\b -colourbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_BUFFER_SIZE.
\b -depthbpp=N EGL only. When choosing an EGL config N will be used as the value for EGL_DEPTH_SIZE.
\b -config=N EGL only. Force the shell to use the EGL config with ID N.
\b -forceframetime=N Alter the behaviour of PVRShellGetTime so its returned value is frame based (N denotes how many ms a frame should pretend to last). You can also use the shortened version of -fft and the command can be used without N being defined, e.g. just -forceframetime. This option is provided to aid in debugging time-based applications.
Example:
@code
Demo -width=160 -height=120 -qaf=300
@endcode
@section APIsOSs APIs and Operating Systems
*****************************
For information specific to each 3D API and Operating System, see the list of supported APIs and OSs on the <a href="modules.html">Modules</a> page.
******************************************************************************/
// Uncomment to enable the -fps command-line option
// #define PVRSHELL_FPS_OUTPUT
/*****************************************************************************
** Includes
*****************************************************************************/
#include <stdlib.h>
#define EXIT_NOERR_CODE 0
#define EXIT_ERR_CODE (!EXIT_NOERR_CODE)
// avoid warning about unused parameter
#define PVRSHELL_UNREFERENCED_PARAMETER(x) ((void) x)
// Keyboard mapping. //
/*!***********************************************************************
@enum PVRShellKeyName
@brief Key name.
************************************************************************/
enum PVRShellKeyName
{
PVRShellKeyNameNull, /*!< Null key value */
PVRShellKeyNameQUIT, /*!< QUIT key value */
PVRShellKeyNameSELECT, /*!< SELECT key value */
PVRShellKeyNameACTION1, /*!< ACTION1 key value */
PVRShellKeyNameACTION2, /*!< ACTION2 key value */
PVRShellKeyNameUP, /*!< UP key */
PVRShellKeyNameDOWN, /*!< DOWN key */
PVRShellKeyNameLEFT, /*!< LEFT key */
PVRShellKeyNameRIGHT, /*!< RIGHT key */
PVRShellKeyNameScreenshot /*!< SCREENSHOT key */
};
/*!***********************************************************************
@enum PVRShellKeyRotate
@brief Key rotate.
************************************************************************/
enum PVRShellKeyRotate
{
PVRShellKeyRotateNone=0, /*!< Rotate key none = 0. */
PVRShellKeyRotate90, /*!< Rotate key 90 */
PVRShellKeyRotate180, /*!< Rotate key 180 */
PVRShellKeyRotate270 /*!< Rotate key 270 */
};
// Pointer button mapping. //
/*!***********************************************************************
@enum EPVRShellButtonState
@brief Pointer button mapping.
************************************************************************/
enum EPVRShellButtonState
{
ePVRShellButtonLeft = 0x1, /*!< Left button */
ePVRShellButtonRight = 0x2, /*!< Right button */
ePVRShellButtonMiddle = 0x4 /*!< Middle button */
};
/*!***********************************************************************
@enum prefNameBoolEnum
@brief Boolean Shell preferences.
************************************************************************/
enum prefNameBoolEnum
{
prefFullScreen, /*!< Set to: 1 for full-screen rendering; 0 for windowed */
prefIsRotated, /*!< Query this to learn whether screen is rotated */
prefPBufferContext, /*!< 1 if you need pbuffer support (default is pbuffer not needed) */
prefPixmapContext, /*!< 1 to use a pixmap as a render-target (default off) */
prefPixmapDisableCopy, /*!< 1 to disable the copy if pixmaps are used */
prefZbufferContext, /*!< 1 if you wish to have zbuffer support (default to on) */
prefLockableBackBuffer, /*!< DX9 only: true to use D3DPRESENTFLAG_LOCKABLE_BACKBUFFER (default: false) */
prefSoftwareRendering, /*!< 1 to select software rendering (default: off, i.e. use hardware) */
prefStencilBufferContext, /*!< 1 if you wish to have stencil support (default: off) */
prefAlphaFormatPre, /*!< EGL only: 1 to create the EGL surface with EGL_ALPHA_FORMAT_PRE (default: 0) */
prefPowerSaving, /*!< If true then the app will go into powersaving mode (if available) when not in use. */
#ifdef PVRSHELL_FPS_OUTPUT
prefOutputFPS, /*!< If true then the FPS are output using PVRShellOutputdebug */
#endif
prefOutputInfo, /*!< If true then the app will output helpful information such as colour buffer format via PVRShellOutputDebug. */
prefNoShellSwapBuffer, /*!< EGL: If true then the shell won't call eglswapbuffers at the end of each frame. */
prefShowCursor, /*!< Set to: 1 to show the cursor; 0 to hide it. */
prefForceFrameTime, /*!< If true will alter PVRShellGetTime behaviour to be frame based. This is for debugging purposes. */
prefDiscardColor, /*!< GLES: Whether or not to discard color data at the end of a render, to save bandwidth. Requires specific functionality. (default: false) */
prefDiscardDepth, /*!< GLES: Whether or not to discard depth data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */
prefDiscardStencil /*!< GLES: Whether or not to discard stencil data at the end of a render, to save bandwidth. Requires specific functionality. (default: true) */
};
/*!***********************************************************************
@enum prefNameFloatEnum
@brief Float Shell preferences.
************************************************************************/
enum prefNameFloatEnum
{
prefQuitAfterTime /*!< Shell will quit after this number of seconds (-1 to disable) */
};
/*!***********************************************************************
@enum prefNameIntEnum
@brief Integer Shell preferences.
************************************************************************/
enum prefNameIntEnum
{
prefEGLMajorVersion, /*!< EGL: returns the major version as returned by eglInitialize() */
prefEGLMinorVersion, /*!< EGL: returns the minor version as returned by eglInitialize() */
prefWidth, /*!< Width of render target */
prefHeight, /*!< Height of render target */
prefPositionX, /*!< X position of the window */
prefPositionY, /*!< Y position of the window */
prefQuitAfterFrame, /*!< Shell will quit after this number of frames (-1 to disable) */
prefSwapInterval, /*!< 0 to preventing waiting for monitor vertical syncs */
prefInitRepeats, /*!< Number of times to reinitialise (if >0 when app returns false from RenderScene(), shell will ReleaseView(), InitView() then re-enter RenderScene() loop). Decrements on each initialisation. */
prefAASamples, /*!< Set to: 0 to disable full-screen anti-aliasing; 2 for 2x; 4 for 4x; 8 for 8x. */
prefCommandLineOptNum, /*!< Returns the length of the array returned by prefCommandLineOpts */
prefColorBPP, /*!< Allows you to specify a desired color buffer size e.g. 16, 32. */
prefDepthBPP, /*!< Allows you to specify a desired depth buffer size e.g. 16, 24. */
prefRotateKeys, /*!< Allows you to specify and retrieve how the keyboard input is transformed */
prefButtonState, /*!< pointer button state */
prefCaptureFrameStart, /*!< The frame to start capturing screenshots from */
prefCaptureFrameStop, /*!< The frame to stop capturing screenshots at */
prefCaptureFrameScale, /*!< Pixel-replicate saved screenshots this many times; default 1 for no scale */
prefPriority, /*!< EGL: If supported will set the egl context priority; 0 for low, 1 for med and 2 for high. */
prefConfig, /*!< EGL: Get the chosen EGL config. */
prefRequestedConfig, /*!< EGL: Force the shell to use a particular EGL config. */
prefNativeDisplay, /*!< EGL: Allows you to specify the native display to use if the device has more that one. */
prefFrameTimeValue /*!< An integer value to say how long you wish one frame to last for (in ms) when force frame time is enabled. */
};
/*!***********************************************************************
@enum prefNamePtrEnum
@brief Pointers/Handlers Shell preferences.
************************************************************************/
enum prefNamePtrEnum
{
prefD3DDevice, /*!< D3D: returns the device pointer */
prefEGLDisplay, /*!< EGL: returns the EGLDisplay */
prefEGLSurface, /*!< EGL: returns the EGLSurface */
prefHINSTANCE, /*!< Windows: returns the application instance handle */
prefNativeWindowType, /*!< Returns the window handle */
prefAccelerometer, /*!< Accelerometer values */
prefPointerLocation, /*!< Mouse pointer/touch location values */
prefPVR2DContext, /*!< PVR2D: returns the PVR2D context */
prefLoadFileFunc, /*!< A pointer to a function that can be used to load external files on platforms that don't allow the use of fopen.
The ptr returned is of the type PFNLoadFileFunc defined below. */
prefReleaseFileFunc, /*!< A pointer to a function that is used to release any data allocated by the load file function.
The ptr returned is of the type PFNReleaseFileFunc defined below. */
prefAndroidNativeActivity /*!< Android: A pointer to the ANativeActivity struct for the application. Your application will need to include android_native_app_glue.h to cast the pointer to ANativeActivity. */
};
/*!***********************************************************************
@typedef PFNLoadFileFunc
@brief The LoadFileFunc function pointer template.
************************************************************************/
typedef void* (*PFNLoadFileFunc)(const char*, char** pData, size_t &size);
/*!***********************************************************************
@typedef PFNReleaseFileFunc
@brief The ReleaseFileFunc function pointer template.
************************************************************************/
typedef bool (*PFNReleaseFileFunc)(void* handle);
/*!***********************************************************************
@enum prefNameConstPtrEnum
@brief Constant pointers Shell preferences.
************************************************************************/
enum prefNameConstPtrEnum
{
prefAppName, /*!< ptrValue is char* */
prefReadPath, /*!< ptrValue is char*; will include a trailing slash */
prefWritePath, /*!< ptrValue is char*; will include a trailing slash */
prefCommandLine, /*!< used to retrieve the entire application command line */
prefCommandLineOpts, /*!< ptrValue is SCmdLineOpt*; retrieves an array of arg/value pairs (parsed from the command line) */
prefExitMessage, /*!< ptrValue is char*; gives the shell a message to show on exit, typically an error */
prefVersion /*!< ptrValue is char* */
};
/*!**************************************************************************
@struct PVRShellData
@brief PVRShell implementation Prototypes and definitions
*****************************************************************************/
struct PVRShellData;
/*!***************************************************************************
@class PVRShellInit
*****************************************************************************/
class PVRShellInit;
/*!***********************************************************************
@struct SCmdLineOpt
@brief Stores a variable name/value pair for an individual command-line option.
************************************************************************/
struct SCmdLineOpt
{
const char *pArg, *pVal;
};
/*!***************************************************************************
@class PVRShell
@brief Inherited by the application; responsible for abstracting the OS and API.
@details PVRShell is the main Shell class that an application uses. An
application should supply a class which inherits PVRShell and supplies
implementations of the virtual functions of PVRShell (InitApplication(),
QuitApplication(), InitView(), ReleaseView(), RenderScene()). Default stub
functions are supplied; this means that an application is not
required to supply a particular function if it does not need to do anything
in it.
The other, non-virtual, functions of PVRShell are utility functions that the
application may call.
*****************************************************************************/
class PVRShell
{
private:
friend class PVRShellInitOS;
friend class PVRShellInit;
PVRShellData *m_pShellData;
PVRShellInit *m_pShellInit;
public:
/*!***********************************************************************
@brief Constructor
*************************************************************************/
PVRShell();
/*!***********************************************************************
@brief Destructor
*************************************************************************/
virtual ~PVRShell();
/*
PVRShell functions that the application should implement.
*/
/*!***********************************************************************
@brief Initialise the application.
@details This function can be overloaded by the application. It
will be called by PVRShell once, only at the beginning of
the PVRShell WinMain()/main() function. This function
enables the user to perform any initialisation before the
render API is initialised. From this function the user can
call PVRShellSet() to change default values, e.g.
requesting a particular resolution or device setting.
@return true for success, false to exit the application
*************************************************************************/
virtual bool InitApplication() { return true; };
/*!***********************************************************************
@brief Quit the application.
@details This function can be overloaded by the application. It
will be called by PVRShell just before finishing the
program. It enables the application to release any
memory/resources acquired in InitApplication().
@return true for success, false to exit the application
*************************************************************************/
virtual bool QuitApplication() { return true; };
/*!***********************************************************************
@brief Initialise the view.
@details This function can be overloaded by the application. It
will be called by PVRShell after the OS and rendering API
are initialised, before entering the RenderScene() loop.
It is called any time the rendering API is initialised,
i.e. once at the beginning, and possibly again if the
resolution changes, or a power management even occurs, or
if the app requests a re-initialisation.
The application should check here the configuration of
the rendering API; it is possible that requests made in
InitApplication() were not successful.
Since everything is initialised when this function is
called, you can load textures and perform rendering API functions.
@return true for success, false to exit the application
*************************************************************************/
virtual bool InitView() { return true; };
/*!***********************************************************************
@brief Release the view.
@details This function can be overloaded by the application. It
will be called after the RenderScene() loop, before
shutting down the render API. It enables the application
to release any memory/resources acquired in InitView().
@return true for success, false to exit the application
*************************************************************************/
virtual bool ReleaseView() { return true; };
/*!***********************************************************************
@brief Render the scene
@details This function can be overloaded by the application.
It is main application function in which you have to do your own rendering. Will be
called repeatedly until the application exits.
@return true for success, false to exit the application
*************************************************************************/
virtual bool RenderScene() { return true; };
/*
PVRShell functions available for the application to use.
*/
/*!***********************************************************************
@brief This function is used to pass preferences to the PVRShell.
If used, this function must be called from InitApplication().
@param[in] prefName Name of preference to set to value
@param[in] value Value
@return true for success
*************************************************************************/
bool PVRShellSet(const prefNameBoolEnum prefName, const bool value);
/*!***********************************************************************
@brief This function is used to pass preferences to the PVRShell.
If used, this function must be called from InitApplication().
@param[in] prefName Name of preference to set to value
@param[in] value Value
@return true for success
*************************************************************************/
bool PVRShellSet(const prefNameFloatEnum prefName, const float value);
/*!***********************************************************************
@brief This function is used to pass preferences to the PVRShell.
If used, this function must be called from InitApplication().
@param[in] prefName Name of preference to set to value
@param[in] value Value
@return true for success
*************************************************************************/
bool PVRShellSet(const prefNameIntEnum prefName, const int value);
/*!***********************************************************************
@brief This function is used to pass preferences to the PVRShell.
If used, this funciton must be called from InitApplication().
@param[in] prefName Name of preference to set to value
@param[in] ptrValue Value
@return true for success
*************************************************************************/
bool PVRShellSet(const prefNamePtrEnum prefName, const void * const ptrValue);
/*!***********************************************************************
@brief This function is used to pass preferences to the PVRShell.
If used, this function must be called from InitApplication().
@param[in] prefName Name of preference to set to value
@param[in] ptrValue Value
@return true for success
*************************************************************************/
bool PVRShellSet(const prefNameConstPtrEnum prefName, const void * const ptrValue);
/*!***********************************************************************
@brief This function is used to get parameters from the PVRShell.
It can be called from anywhere in the program.
@param[in] prefName Name of preference to set to value
@return The requested value.
*************************************************************************/
bool PVRShellGet(const prefNameBoolEnum prefName) const;
/*!***********************************************************************
@brief This function is used to get parameters from the PVRShell.
It can be called from anywhere in the program.
@param[in] prefName Name of preference to set to value
@return The requested value.
*************************************************************************/
float PVRShellGet(const prefNameFloatEnum prefName) const;
/*!***********************************************************************
@brief This function is used to get parameters from the PVRShell.
It can be called from anywhere in the program.
@param[in] prefName Name of preference to set to value
@return The requested value.
*************************************************************************/
int PVRShellGet(const prefNameIntEnum prefName) const;
/*!***********************************************************************
@brief This function is used to get parameters from the PVRShell.
It can be called from anywhere in the program.
@param[in] prefName Name of preference to set to value
@return The requested value.
*************************************************************************/
void *PVRShellGet(const prefNamePtrEnum prefName) const;
/*!***********************************************************************
@brief This function is used to get parameters from the PVRShell
It can be called from anywhere in the program.
@param[in] prefName Name of preference to set to value
@return The requested value.
*************************************************************************/
const void *PVRShellGet(const prefNameConstPtrEnum prefName) const;
/*!***********************************************************************
@brief It will be stored as 24-bit per pixel, 8-bit per chanel RGB.
The memory should be freed using the free() function when no longer needed.
@param[in] Width size of image to capture (relative to 0,0)
@param[in] Height size of image to capture (relative to 0,0)
@param[out] pLines receives a pointer to an area of memory containing the screen buffer.
@return true for success
*************************************************************************/
bool PVRShellScreenCaptureBuffer(const int Width, const int Height, unsigned char **pLines);
/*!***********************************************************************
@brief Writes out the image data to a BMP file with basename fname.
@details The file written will be fname suffixed with a
number to make the file unique.
For example, if fname is "abc", this function will attempt
to save to "abc0000.bmp"; if that file already exists, it
will try "abc0001.bmp", repeating until a new filename is
found. The final filename used is returned in ofname.
@param[in] fname base of file to save screen to
@param[in] Width size of image
@param[in] Height size of image
@param[in] pLines image data to write out (24bpp, 8-bit per channel RGB)
@param[in] ui32PixelReplicate expand pixels through replication (1 = no scale)
@param[out] ofname If non-NULL, receives the filename actually used
@return true for success
*************************************************************************/
int PVRShellScreenSave(
const char * const fname,
const int Width,
const int Height,
const unsigned char * const pLines,
const unsigned int ui32PixelReplicate = 1,
char * const ofname = NULL);
/*!***********************************************************************
@brief Writes out the image data to a BMP file with name fname.
@param[in] pszFilename file to save screen to
@param[in] ui32Width the width of the data
@param[in] ui32Height the height of the data
@param[in] pImageData image data to write out (24bpp, 8-bit per channel RGB)
@param[in] ui32PixelReplicate expand pixels through replication (1 = no scale)
@return 0 on success
*************************************************************************/
int PVRShellWriteBMPFile(
const char * const pszFilename,
const unsigned int ui32Width,
const unsigned int ui32Height,
const void * const pImageData,
const unsigned int ui32PixelReplicate = 1);
/*!***********************************************************************
@brief Writes the resultant string to the debug output (e.g. using
printf(), OutputDebugString(), ...). Check the SDK release notes for
details on how the string is output.
@param[in] format printf style format followed by arguments it requires
*************************************************************************/
void PVRShellOutputDebug(char const * const format, ...) const;
/*!***********************************************************************
@brief The number itself should be considered meaningless; an
application should use this function to determine how much
time has passed between two points (e.g. between each frame).
@return A value which increments once per millisecond.
*************************************************************************/
unsigned long PVRShellGetTime();
/*!***********************************************************************
@brief Check if a key was pressed.
@details The keys on various devices
are mapped to the PVRShell-supported keys (listed in @a PVRShellKeyName) in
a platform-dependent manner, since most platforms have different input
devices. Check the <a href="modules.html">Modules page</a> for your OS
for details on how the enum values map to your device's key code input.
@param[in] key Code of the key to test
@return true if key was pressed
*************************************************************************/
bool PVRShellIsKeyPressed(const PVRShellKeyName key);
};
/****************************************************************************
** Declarations for functions that the scene file must supply
****************************************************************************/
/*!***************************************************************************
@brief This function must be implemented by the user of the shell.
@details The user should return its PVRShell object defining the
behaviour of the application.
@return The demo supplied by the user
*****************************************************************************/
PVRShell* NewDemo();
#endif /* __PVRSHELL_H_ */
/*****************************************************************************
End of file (PVRShell.h)
*****************************************************************************/