Home | History | Annotate | Download | only in OGLES2
      1 /*!****************************************************************************
      2 
      3  @file         OGLES2/PVRTPFXParserAPI.h
      4  @ingroup      API_OGLES2
      5  @copyright    Copyright (c) Imagination Technologies Limited.
      6  @brief        Declaration of PFX file parser
      7 
      8 ******************************************************************************/
      9 
     10 #ifndef _PVRTPFXPARSERAPI_H_
     11 #define _PVRTPFXPARSERAPI_H_
     12 
     13 /*!
     14  @addtogroup   API_OGLES2
     15  @{
     16 */
     17 
     18 // Everything been documented in OGL/PVRTPFXParserAPI.h. This would cause documentation duplication in the
     19 // current version of Doxygen.
     20 #ifndef NO_DOXYGEN
     21 
     22 #include "../PVRTError.h"
     23 
     24 /****************************************************************************
     25 ** Structures
     26 ****************************************************************************/
     27 
     28 /*!**************************************************************************
     29  @struct        SPVRTPFXUniformSemantic
     30  @brief         Struct to convert a semantic string to a number.
     31  @details       The application supplies an array of these so PVRTPFX can translate semantic strings to numbers
     32 ****************************************************************************/
     33 struct SPVRTPFXUniformSemantic
     34 {
     35 	const char		*p;	/*!< String containing semantic */
     36 	unsigned int	n;	/*!< Application-defined semantic value */
     37 };
     38 
     39 /*!**************************************************************************
     40  @struct       SPVRTPFXUniform
     41  @brief        A struct containing GL uniform data.
     42  @details      PVRTPFX returns an array of these to indicate GL locations & semantics to the application
     43  ***************************************************************************/
     44 struct SPVRTPFXUniform
     45 {
     46 	unsigned int	nLocation;		/*!< GL location of the Uniform */
     47 	unsigned int	nSemantic;		/*!< Application-defined semantic value */
     48 	unsigned int	nIdx;			/*!< Index; for example two semantics might be LIGHTPOSITION0 and LIGHTPOSITION1 */
     49 	CPVRTString		sValueName;		/*!< The name of the variable referenced in shader code */
     50 };
     51 
     52 /*!**************************************************************************
     53  @struct       SPVRTPFXTexture
     54  @brief        A texture data array.
     55  @details      An array of these is gained from PVRTPFX so the application can fill in the texture handles
     56  ***************************************************************************/
     57 struct SPVRTPFXTexture
     58 {
     59 	CPVRTStringHash		Name;	    /*!< texture name */
     60 	GLuint				ui;		    /*!< Loaded texture handle */
     61 	GLuint				unit;	    /*!< The bound texture unit */
     62 	unsigned int		flags;	    /*!< Texture type i.e 2D, Cubemap */
     63 };
     64 
     65 /*!**************************************************************************
     66  @class        PVRTPFXEffectDelegate
     67  @brief        Receives callbacks for effects.
     68  ***************************************************************************/
     69 class PVRTPFXEffectDelegate
     70 {
     71 public:
     72 	virtual EPVRTError PVRTPFXOnLoadTexture(const CPVRTStringHash& TextureName, GLuint& uiHandle, unsigned int& uiFlags) = 0; /*!< Returns error if texture could not be loaded */
     73 	virtual ~PVRTPFXEffectDelegate() { }  /*!< Destructor */
     74 };
     75 
     76 /*!**************************************************************************
     77  @class CPVRTPFXEffect
     78  @brief PFX effect
     79 ****************************************************************************/
     80 class CPVRTPFXEffect
     81 {
     82 public:
     83 	/*!***************************************************************************
     84 	@brief      		Sets the context to NULL and initialises the member variables to zero.
     85 	*****************************************************************************/
     86 	CPVRTPFXEffect();
     87 
     88 	/*!***************************************************************************
     89 	@brief      		Sets the context and initialises the member variables to zero.
     90 	*****************************************************************************/
     91 	CPVRTPFXEffect(SPVRTContext &sContext);
     92 
     93 	/*!***************************************************************************
     94 	@brief      		Calls Destroy().
     95 	*****************************************************************************/
     96 	~CPVRTPFXEffect();
     97 
     98 	/*!***************************************************************************
     99 	@brief		        Loads the specified effect from the CPVRTPFXParser object.
    100 						Compiles and links the shaders. Initialises texture data.
    101 	@param[in]			src					PFX Parser Object
    102 	@param[in]			pszEffect			Effect name
    103 	@param[in]			pszFileName			Effect file name
    104 	@param[in]			pDelegate			A delegate which will receive callbacks
    105 	@param[out]			uiUnknownUniforms	Number of unknown uniforms found
    106 	@param[out]			pReturnError		Error string
    107 	@return			    PVR_SUCCESS if load succeeded
    108 	*****************************************************************************/
    109 	EPVRTError Load(CPVRTPFXParser &src, const char * const pszEffect, const char * const pszFileName,
    110 					PVRTPFXEffectDelegate* pDelegate, unsigned int& uiUnknownUniforms, CPVRTString *pReturnError);
    111 
    112 	/*!***************************************************************************
    113 	@brief		        Deletes the gl program object and texture data.
    114 	*****************************************************************************/
    115 	void Destroy();
    116 
    117 	/*!***************************************************************************
    118 	@brief		        Selects the gl program object and binds the textures.
    119 						If the render target texture for the current render pass is required
    120 						in this effect (and therefore cannot be sampled),
    121 						load the replacement texture instead.
    122 	@param[in]			i32RenderTextureId		The ID of the render target of the current task
    123 	@param[in]			ui32ReplacementTexture	The ID of the texture that should be used instead
    124 	@return			    EPVRTError				PVR_SUCCESS if activate succeeded
    125 	*****************************************************************************/
    126 	EPVRTError Activate(const int i32RenderTextureId=-1, const unsigned int ui32ReplacementTexture=0);
    127 
    128 	/*!***************************************************************************
    129 	@brief		        Gets the texture data array.
    130 	@return			    SPVRTPFXTexture*		pointer to the texture data array
    131 	*****************************************************************************/
    132 	const CPVRTArray<SPVRTPFXTexture>& GetTextureArray() const;
    133 
    134 	/*!***************************************************************************
    135 	@brief	            Returns a list of known semantics.
    136 	@return			    const CPVRTArray<SPVRTPFXUniform>&
    137 	*****************************************************************************/
    138 	const CPVRTArray<SPVRTPFXUniform>& GetUniformArray() const;
    139 
    140 	/*!***************************************************************************
    141 	@brief	            Gets the array of registered semantics which will be used to
    142                         match PFX code.
    143 	@return			    const CPVRTArray<SPVRTPFXUniformSemantic>&
    144 	*****************************************************************************/
    145 	const CPVRTArray<SPVRTPFXUniformSemantic>& GetSemanticArray() const;
    146 
    147 	/*!***************************************************************************
    148 	@brief		        Sets the textrue and applys the filtering.
    149 	@param[in]			nIdx				texture number
    150 	@param[in]			ui					opengl texture handle
    151 	@param[in]			u32flags			texture flags
    152 	*****************************************************************************/
    153 	void SetTexture(const unsigned int nIdx, const GLuint ui, const unsigned int u32flags=0);
    154 
    155 	/*!***************************************************************************
    156 	@brief		        Sets the dafault value for the uniform semantic.
    157 	@param[in]			pszName				name of uniform
    158 	@param[in]			psDefaultValue      pointer to default value
    159 	*****************************************************************************/
    160 	void SetDefaultUniformValue(const char *const pszName, const SPVRTSemanticDefaultData *psDefaultValue);
    161 
    162 	/*!***************************************************************************
    163 	@brief	            Registers a user-provided uniform semantic.
    164 	@param[in]			psUniforms			Array of semantics to register
    165 	@param[in]			uiNumUniforms		Number provided
    166 	@param[out]			pReturnError		Human-readable error if any
    167 	@return			    PVR_SUCCESS on success
    168 	*****************************************************************************/
    169 	EPVRTError RegisterUniformSemantic(const SPVRTPFXUniformSemantic* const psUniforms, unsigned int uiNumUniforms, CPVRTString* pReturnError);
    170 
    171 	/*!***************************************************************************
    172 	@brief	            Removes a given semantic ID from the 'known' semantic list and
    173                         re-parses the effect to update the uniform table.
    174 	@param[in]			uiSemanticID
    175 	@param[out]			pReturnError
    176 	@return			    PVR_SUCCESS on success
    177 	*****************************************************************************/
    178 	EPVRTError RemoveUniformSemantic(unsigned int uiSemanticID, CPVRTString* pReturnError);
    179 
    180 	/*!***************************************************************************
    181 	 @brief		        Sets the context for this effect.
    182 	 @param[in]			pContext			context pointer
    183 	 *****************************************************************************/
    184 	void SetContext(SPVRTContext * const pContext);
    185 
    186 	/*!***************************************************************************
    187 	@brief	            Returns the OGL program handle.
    188 	@return			    unsigned int
    189 	*****************************************************************************/
    190 	unsigned int GetProgramHandle() const;
    191 
    192 	/*!***************************************************************************
    193 	@brief	            Gets the active effect index within the PFX file.
    194 	@return			    unsigned int
    195 	*****************************************************************************/
    196 	unsigned int GetEffectIndex() const;
    197 
    198 private:
    199 	/*!***************************************************************************
    200 	@brief	            Loads all of the GLSL shaders for an effect.
    201 	@param[in]			pszFileName
    202 	@param[out]			pReturnError
    203 	@return			    EPVRTError
    204 	*****************************************************************************/
    205 	EPVRTError LoadShadersForEffect(CPVRTPFXParser &src, const char * const pszFileName, CPVRTString *pReturnError);
    206 
    207 	/*!***************************************************************************
    208 	@brief	            Loads all of the textures for this effect.
    209 	@param[out]			pReturnError
    210 	@return			    EPVRTError
    211 	*****************************************************************************/
    212 	EPVRTError LoadTexturesForEffect(PVRTPFXEffectDelegate* pDelegate, CPVRTString *pReturnError);
    213 
    214 	/*!***************************************************************************
    215 	@brief	            Builds the uniform table from a list of known semantics.
    216 	@param[out]			uiUnknownSemantics
    217 	@param[out]			pReturnError
    218 	@return			    EPVRTError
    219 	*****************************************************************************/
    220 	EPVRTError RebuildUniformTable(unsigned int& uiUnknownSemantics, CPVRTString* pReturnError);
    221 
    222 protected:
    223 	bool									m_bLoaded;
    224 	SPVRTContext*							m_psContext;
    225 	CPVRTPFXParser*							m_pParser;
    226 	unsigned int							m_nEffect;
    227 
    228 	GLuint									m_uiProgram;		// Loaded program
    229 
    230 	CPVRTArray<SPVRTPFXTexture>				m_Textures;			// Array of loaded textures
    231 	CPVRTArray<SPVRTPFXUniform>				m_Uniforms;			// Array of found uniforms
    232 
    233 	CPVRTArray<SPVRTPFXUniformSemantic>		m_Semantics;		// An array of registered semantics.
    234 };
    235 
    236 /****************************************************************************
    237 ** Auxiliary functions
    238 ****************************************************************************/
    239 
    240 /*!**************************************************************************
    241  @brief                 'Equivalent to' operator
    242  @param[in]             lhs     First SPVRTPFXUniformSemantic
    243  @param[in]             rhs     Second SPVRTPFXUniformSemantic
    244  @return                True if the numbers in the two SPVRTPFXUniformSemantics are equivalent.
    245 ****************************************************************************/
    246 inline bool operator==(const SPVRTPFXUniformSemantic& lhs, const SPVRTPFXUniformSemantic& rhs)
    247 {
    248 	return (lhs.n == rhs.n);
    249 }
    250 
    251  #endif
    252 
    253 /*! @} */
    254 
    255 #endif /* _PVRTPFXPARSERAPI_H_ */
    256 
    257 /*****************************************************************************
    258  End of file (PVRTPFXParserAPI.h)
    259 *****************************************************************************/
    260 
    261