17b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/******************************************************************************
27b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
37b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @File         OGLES2/PVRTPFXParserAPI.cpp
47b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
57b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Title        OGLES2/PVRTPFXParserAPI
67b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
77b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Version
87b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
97b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Copyright    Copyright (c) Imagination Technologies Limited.
107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Platform     ANSI compatible
127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description  PFX file parser.
147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/
167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Includes
197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <stdio.h>
217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <string.h>
227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <stdlib.h>
237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTContext.h"
257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTMatrix.h"
267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTFixedPoint.h"
277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTString.h"
287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTShader.h"
297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTPFXParser.h"
307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTPFXParserAPI.h"
317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTPFXSemantics.h"
327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTTexture.h"
337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTTextureAPI.h"
347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			CPVRTPFXEffect Constructor
377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Sets the context and initialises the member variables to zero.
387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
397b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTPFXEffect::CPVRTPFXEffect():
407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_bLoaded(false), m_psContext(NULL), m_pParser(NULL), m_nEffect(0), m_uiProgram(0), m_Semantics(PVRTPFXSemanticsGetSemanticList(), ePVRTPFX_NumSemantics)
417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			CPVRTPFXEffect Constructor
467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Sets the context and initialises the member variables to zero.
477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
487b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTPFXEffect::CPVRTPFXEffect(SPVRTContext &sContext):
497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_bLoaded(false), m_psContext(&sContext), m_pParser(NULL), m_nEffect(0), m_uiProgram(0), m_Semantics(PVRTPFXSemanticsGetSemanticList(), ePVRTPFX_NumSemantics)
507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			CPVRTPFXEffect Destructor
557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Calls Destroy().
567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
577b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTPFXEffect::~CPVRTPFXEffect()
587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	Destroy();
607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Free allocated strings
627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(unsigned int uiIndex = ePVRTPFX_NumSemantics; uiIndex < m_Semantics.GetSize(); ++uiIndex)
637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		delete [] m_Semantics[uiIndex].p;
657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Semantics[uiIndex].p = NULL;
667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			Load
717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				src					PFX Parser Object
727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				pszEffect			Effect name
737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				pszFileName			Effect file name
747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Output			pReturnError		Error string
757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Returns			EPVRTError			PVR_SUCCESS if load succeeded
767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Loads the specified effect from the CPVRTPFXParser object.
777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					Compiles and links the shaders. Initialises texture data.
787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
797b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTPFXEffect::Load(CPVRTPFXParser &src, const char * const pszEffect, const char * const pszFileName,
807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens								PVRTPFXEffectDelegate* pDelegate, unsigned int& uiUnknownUniforms, CPVRTString *pReturnError)
817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int	 i;
837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(!src.GetNumberEffects())
857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// --- First find the named effect from the effect file
887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(pszEffect)
897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int iEffect = src.FindEffectByName(CPVRTStringHash(pszEffect));
917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(iEffect == -1)
927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_nEffect = (unsigned int)iEffect;
957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	else
977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_nEffect = 0;
997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// --- Now load the effect
1027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_pParser = &src;
1037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const SPVRTPFXParserEffect &ParserEffect = src.GetEffect(m_nEffect);
1047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Create room for per-texture data
1067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const CPVRTArray<SPVRTPFXParserEffectTexture>& EffectTextures = src.GetEffect(m_nEffect).Textures;
1077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int uiNumTexturesForEffect = EffectTextures.GetSize();
1087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Textures.SetCapacity(uiNumTexturesForEffect);
1097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Initialise each Texture
1117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(i = 0; i < uiNumTexturesForEffect; ++i)
1127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int iTexIdx = src.FindTextureByName(EffectTextures[i].Name);
1147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(iTexIdx < 0)
1157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
1167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*pReturnError += PVRTStringFromFormattedStr("ERROR: Effect '%s' requests non-existent texture: %s\n", ParserEffect.Name.c_str(), EffectTextures[i].Name.c_str());
1177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
1187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
1197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiTexIdx = m_Textures.Append();
1217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Textures[uiTexIdx].Name	= src.GetTexture((unsigned int)iTexIdx)->Name;
1227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Textures[uiTexIdx].ui		= 0xFFFFFFFF;
1237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Textures[uiTexIdx].flags	= 0;
1247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Textures[uiTexIdx].unit	= 0;
1257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Load the shaders
1287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(LoadShadersForEffect(src, pszFileName, pReturnError) != PVR_SUCCESS)
1297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
1307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Build uniform table
1327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(RebuildUniformTable(uiUnknownUniforms, pReturnError) != PVR_SUCCESS)
1337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
1347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Load the requested textures
1367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(pDelegate)
1377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(LoadTexturesForEffect(pDelegate, pReturnError) != PVR_SUCCESS)
1397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
1407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_bLoaded = true;
1437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
1457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
1467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
1487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		LoadTexturesForEffect
1497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Output			pReturnError
1507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			EPVRTError
1517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Loads all of the textures for this effect.
1527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
1537b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTPFXEffect::LoadTexturesForEffect(PVRTPFXEffectDelegate* pDelegate, CPVRTString *pReturnError)
1547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
1557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLuint			uiHandle;
1567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int	uiFlags;
1577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(unsigned int i = 0; i < m_Textures.GetSize(); ++i)
1597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int iTexID = m_pParser->FindTextureByName(m_Textures[i].Name);
1617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(iTexID == -1)
1627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
1637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*pReturnError += PVRTStringFromFormattedStr("ERROR: Cannot find texture '%s' in any TEXTURE block.\n", m_Textures[i].Name.c_str());
1647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
1657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
1667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const SPVRTPFXParserTexture* pTexDesc = m_pParser->GetTexture(iTexID);
1687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		uiHandle = 0xBADF00D;
1717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		uiFlags  = 0;
1727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(pDelegate->PVRTPFXOnLoadTexture(pTexDesc->FileName, uiHandle, uiFlags) != PVR_SUCCESS)
1747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
1757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*pReturnError += PVRTStringFromFormattedStr("ERROR: Failed to load texture: %s.\n", pTexDesc->FileName.c_str());
1767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
1777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
1787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Make sure uiHandle was written.
1807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(uiHandle == 0xBADF00D)
1817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
1827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*pReturnError += PVRTStringFromFormattedStr("ERROR: GL handle for texture '%s' not set!\n", pTexDesc->FileName.c_str());
1837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
1847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
1857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		SetTexture(i, uiHandle, uiFlags);
1877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
1907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
1917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
1937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		LoadShadersForEffect
1947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input			pszFileName
1957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Output			pReturnError
1967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			EPVRTError
1977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Loads all of the GLSL shaders for an effect.
1987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
1997b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTPFXEffect::LoadShadersForEffect(CPVRTPFXParser &src, const char * const pszFileName, CPVRTString *pReturnError)
2007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
2017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// initialise attributes to default values
2027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char *pszVertexShader		= NULL;
2037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char *pszFragmentShader		= NULL;
2047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bFreeVertexShader		= false;
2057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool bFreeFragmentShader	= false;
2067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int uiVertIdx		= 0;
2077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int uiFragIdx		= 0;
2087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int uiVertexShader	= 0;
2097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int uiFragShader	= 0;
2107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const SPVRTPFXParserEffect &ParserEffect = src.GetEffect(m_nEffect);
2127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// find shaders requested
2147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(uiVertIdx = 0; uiVertIdx < src.GetNumberVertexShaders(); ++uiVertIdx)
2157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const SPVRTPFXParserShader& VertexShader = src.GetVertexShader(uiVertIdx);
2177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(ParserEffect.VertexShaderName == VertexShader.Name)
2187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(VertexShader.bUseFileName)
2207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
2217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszVertexShader = VertexShader.pszGLSLcode;
2227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
2237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			else
2247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
2257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(!VertexShader.pszGLSLcode)
2267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					continue;			// No code specified.
2277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if 0
2287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				// offset glsl code by nFirstLineNumber
2297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszVertexShader = (char *)malloc((strlen(VertexShader.pszGLSLcode) + (VertexShader.nFirstLineNumber) + 1) * sizeof(char));
2307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszVertexShader[0] = '\0';
2317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			 	for(unsigned int n = 0; n < VertexShader.nFirstLineNumber; n++)
2327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					strcat(pszVertexShader, "\n");
2337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				strcat(pszVertexShader, VertexShader.pszGLSLcode);
2347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else
2357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszVertexShader = (char *)malloc(strlen(VertexShader.pszGLSLcode) + 1);
2367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszVertexShader[0] = '\0';
2377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				strcat(pszVertexShader, VertexShader.pszGLSLcode);
2387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
2397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				bFreeVertexShader = true;
2407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
2417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
2437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(uiFragIdx = 0; uiFragIdx < src.GetNumberFragmentShaders(); ++uiFragIdx)
2467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const SPVRTPFXParserShader& FragmentShader = src.GetFragmentShader(uiFragIdx);
2487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(ParserEffect.FragmentShaderName == FragmentShader.Name)
2497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(FragmentShader.bUseFileName)
2517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
2527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszFragmentShader = FragmentShader.pszGLSLcode;
2537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
2547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			else
2557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
2567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(!FragmentShader.pszGLSLcode)
2577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					continue;			// No code specified.
2587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if 0
2607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				// offset glsl code by nFirstLineNumber
2617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszFragmentShader = (char *)malloc((strlen(FragmentShader.pszGLSLcode) + (FragmentShader.nFirstLineNumber) + 1) * sizeof(char));
2627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszFragmentShader[0] = '\0';
2637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				for(unsigned int n = 0; n < FragmentShader.nFirstLineNumber; n++)
2647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					strcat(pszFragmentShader, "\n");
2657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				strcat(pszFragmentShader, FragmentShader.pszGLSLcode);
2667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else
2677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszFragmentShader = (char *)malloc(strlen(FragmentShader.pszGLSLcode) + 1);
2687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				pszFragmentShader[0] = '\0';
2697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				strcat(pszFragmentShader, FragmentShader.pszGLSLcode);
2707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
2717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				bFreeFragmentShader = true;
2727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
2737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
2757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString error;
2797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool		bLoadSource = 1;
2807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Try first to load from the binary block
2827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (src.GetVertexShader(uiVertIdx).pbGLSLBinary!=NULL)
2837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(GL_SGX_BINARY_IMG)
2857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (PVRTShaderLoadBinaryFromMemory(src.GetVertexShader(uiVertIdx).pbGLSLBinary, src.GetVertexShader(uiVertIdx).nGLSLBinarySize,
2867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			GL_VERTEX_SHADER, GL_SGX_BINARY_IMG, &uiVertexShader, &error) == PVR_SUCCESS)
2877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// success loading the binary block so we do not need to load the source
2897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bLoadSource = 0;
2907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
2927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
2937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
2947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bLoadSource = 1;
2957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
2967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// If it fails, load from source
2997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (bLoadSource)
3007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(pszVertexShader)
3027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if (PVRTShaderLoadSourceFromMemory(pszVertexShader, GL_VERTEX_SHADER, &uiVertexShader, &error) != PVR_SUCCESS)
3047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
3057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*pReturnError = CPVRTString("ERROR: Vertex Shader compile error in file '") + pszFileName + "':\n" + error;
3067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(bFreeVertexShader)	FREE(pszVertexShader);
3077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(bFreeFragmentShader)	FREE(pszFragmentShader);
3087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return PVR_FAIL;
3097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
3107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else // Shader not found or failed binary block
3127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if (src.GetVertexShader(uiVertIdx).pbGLSLBinary==NULL)
3147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
3157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*pReturnError = CPVRTString("ERROR: Vertex shader ") + ParserEffect.VertexShaderName.String() + "  not found in " + pszFileName + ".\n";
3167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
3177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			else
3187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
3197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*pReturnError = CPVRTString("ERROR: Binary vertex shader ") + ParserEffect.VertexShaderName.String() + " not supported.\n";
3207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
3217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bFreeVertexShader)	FREE(pszVertexShader);
3237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bFreeFragmentShader)	FREE(pszFragmentShader);
3247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
3257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Try first to load from the binary block
3297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (src.GetFragmentShader(uiFragIdx).pbGLSLBinary!=NULL)
3307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(GL_SGX_BINARY_IMG)
3327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (PVRTShaderLoadBinaryFromMemory(src.GetFragmentShader(uiFragIdx).pbGLSLBinary, src.GetFragmentShader(uiFragIdx).nGLSLBinarySize,
3337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			GL_FRAGMENT_SHADER, GL_SGX_BINARY_IMG, &uiFragShader, &error) == PVR_SUCCESS)
3347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// success loading the binary block so we do not need to load the source
3367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bLoadSource = 0;
3377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
3397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
3407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			bLoadSource = 1;
3427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// If it fails, load from source
3467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (bLoadSource)
3477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(pszFragmentShader)
3497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if (PVRTShaderLoadSourceFromMemory(pszFragmentShader, GL_FRAGMENT_SHADER, &uiFragShader, &error) != PVR_SUCCESS)
3517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
3527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*pReturnError = CPVRTString("ERROR: Fragment Shader compile error in file '") + pszFileName + "':\n" + error;
3537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(bFreeVertexShader)	FREE(pszVertexShader);
3547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(bFreeFragmentShader)	FREE(pszFragmentShader);
3557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				return PVR_FAIL;
3567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
3577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else // Shader not found or failed binary block
3597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
3607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if (src.GetFragmentShader(uiFragIdx).pbGLSLBinary==NULL)
3617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
3627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*pReturnError = CPVRTString("ERROR: Fragment shader ") + ParserEffect.FragmentShaderName.String() + "  not found in " + pszFileName + ".\n";
3637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
3647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			else
3657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
3667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*pReturnError = CPVRTString("ERROR: Binary Fragment shader ") + ParserEffect.FragmentShaderName.String() + " not supported.\n";
3677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
3687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bFreeVertexShader)
3707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				FREE(pszVertexShader);
3717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bFreeFragmentShader)
3727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				FREE(pszFragmentShader);
3737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
3757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
3767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(bFreeVertexShader)
3797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		FREE(pszVertexShader);
3807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(bFreeFragmentShader)
3827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		FREE(pszFragmentShader);
3837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Create the shader program
3857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_uiProgram = glCreateProgram();
3867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Attach the fragment and vertex shaders to it
3897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glAttachShader(m_uiProgram, uiFragShader);
3907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glAttachShader(m_uiProgram, uiVertexShader);
3917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glDeleteShader(uiVertexShader);
3937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glDeleteShader(uiFragShader);
3947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Bind vertex attributes
3967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(unsigned int i = 0; i < ParserEffect.Attributes.GetSize(); ++i)
3977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glBindAttribLocation(m_uiProgram, i, ParserEffect.Attributes[i].pszName);
3997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	//	Link the program.
4027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glLinkProgram(m_uiProgram);
4037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLint Linked;
4047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glGetProgramiv(m_uiProgram, GL_LINK_STATUS, &Linked);
4057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if (!Linked)
4067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int i32InfoLogLength, i32CharsWritten;
4087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glGetProgramiv(m_uiProgram, GL_INFO_LOG_LENGTH, &i32InfoLogLength);
4097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		char* pszInfoLog = new char[i32InfoLogLength];
4107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glGetProgramInfoLog(m_uiProgram, i32InfoLogLength, &i32CharsWritten, pszInfoLog);
4117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*pReturnError = CPVRTString("ERROR: Linking shaders in file '") + pszFileName + "':\n\n"
4127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			+ CPVRTString("Failed to link: ") + pszInfoLog + "\n";
4137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		delete [] pszInfoLog;
4147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
4157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
4187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
4197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			Destroy
4227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Deletes the gl program object and texture data.
4237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
4247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTPFXEffect::Destroy()
4257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
4267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_uiProgram != 0)
4287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
4297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens            GLint val;
4307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens            glGetProgramiv(m_uiProgram, GL_DELETE_STATUS, &val);
4317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens            if(val == GL_FALSE)
4327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens            {
4337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens                glDeleteProgram(m_uiProgram);
4347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens            }
4357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_uiProgram = 0;
4367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
4377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_bLoaded = false;
4407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
4417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			Activate
4447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Returns			PVR_SUCCESS if activate succeeded
4457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Selects the gl program object and binds the textures.
4467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
4477b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTPFXEffect::Activate(const int i32RenderTextureId, const unsigned int ui32ReplacementTexture)
4487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
4497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLuint uiTextureId;
4507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLenum eTarget;
4517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Set the program
4537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	glUseProgram(m_uiProgram);
4547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Set the textures
4567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(unsigned int uiTex = 0; uiTex < m_Textures.GetSize(); ++uiTex)
4577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		uiTextureId = m_Textures[uiTex].ui;
4597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(i32RenderTextureId != -1 && (uiTextureId == (unsigned int)i32RenderTextureId))
4607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			uiTextureId = ui32ReplacementTexture;
4617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Set active texture unit.
4637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glActiveTexture(GL_TEXTURE0 + m_Textures[uiTex].unit);
4647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Bind texture
4667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		eTarget = (m_Textures[uiTex].flags & PVRTEX_CUBEMAP ? GL_TEXTURE_CUBE_MAP : GL_TEXTURE_2D);
4677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		glBindTexture(eTarget, uiTextureId);
4687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
4717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
4727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			GetSemantics
4757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Output			aUniforms				an array of uniform data
4767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Output			pnUnknownUniformCount	unknown uniform count
4777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				psParams				pointer to semantic data array
4787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				nParamCount				number of samantic items
4797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				psUniformSemantics		pointer to uniform semantics array
4807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				nUniformSemantics		number of uniform semantic items
4817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				pglesExt				opengl extensions object
4827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				uiProgram				program object index
4837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				bIsAttribue				true if getting attribute semantics
4847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Output			errorMsg				error string
4857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Returns			unsigned int			number of successful semantics
4867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Get the data array for the semantics.
4877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
4887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstatic unsigned int GetSemantics(
4897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTArray<SPVRTPFXUniform>&				aUniforms,
4907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const CPVRTArray<SPVRTPFXParserSemantic>&	aParams,
4917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const CPVRTArray<SPVRTPFXUniformSemantic>&	aUniformSemantics,
4927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int*								const pnUnknownUniformCount,
4937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const GLuint								uiProgram,
4947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool										bIsAttribue,
4957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	CPVRTString*								const errorMsg)
4967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
4977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int	i, j, nCount, nCountUnused;
4987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	int				nLocation;
4997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*
5017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		Loop over the parameters searching for their semantics. If
5027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		found/recognised, it should be placed in the output array.
5037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*/
5047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	nCount = 0;
5057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	nCountUnused = 0;
5067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	char szTmpUniformName[2048];		// Temporary buffer to use for building uniform names.
5077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(j = 0; j < aParams.GetSize(); ++j)
5097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(i = 0; i < aUniformSemantics.GetSize(); ++i)
5117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
5127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(strcmp(aParams[j].pszValue, aUniformSemantics[i].p) != 0)
5137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
5147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				continue;
5157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
5167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Semantic found for this parameter
5187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(bIsAttribue)
5197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
5207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				nLocation = glGetAttribLocation(uiProgram, aParams[j].pszName);
5217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
5227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			else
5237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
5247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				nLocation = glGetUniformLocation(uiProgram, aParams[j].pszName);
5257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				// Check for array. Workaround for some OpenGL:ES implementations which require array element appended to uniform name
5277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				// in order to return the correct location.
5287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				if(nLocation == -1)
5297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				{
5307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					strcpy(szTmpUniformName, aParams[j].pszName);
5317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					strcat(szTmpUniformName, "[0]");
5327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					nLocation = glGetUniformLocation(uiProgram, szTmpUniformName);
5337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				}
5347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
5357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			if(nLocation != -1)
5377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
5387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				unsigned int uiIdx = aUniforms.Append();
5397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				aUniforms[uiIdx].nSemantic	= aUniformSemantics[i].n;
5407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				aUniforms[uiIdx].nLocation	= nLocation;
5417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				aUniforms[uiIdx].nIdx		= aParams[j].nIdx;
5427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				aUniforms[uiIdx].sValueName	= aParams[j].pszName;
5437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				++nCount;
5447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
5457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			else
5467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
5477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*errorMsg += "WARNING: Variable not used by GLSL code: ";
5487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*errorMsg += CPVRTString(aParams[j].pszName) + " ";
5497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				*errorMsg += CPVRTString(aParams[j].pszValue) + "\n";
5507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				++nCountUnused;
5517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
5527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Skip to the next parameter
5547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
5557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
5567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(i == aUniformSemantics.GetSize())
5577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
5587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*errorMsg += "WARNING: Semantic unknown to application: ";
5597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*errorMsg += CPVRTString(aParams[j].pszValue) + "\n";
5607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
5617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	*pnUnknownUniformCount	= aParams.GetSize() - nCount - nCountUnused;
5647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return nCount;
5657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
5667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		GetUniformArray
5697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			const CPVRTArray<SPVRTPFXUniform>&
5707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Returns a list of known semantics.
5717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
5727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst CPVRTArray<SPVRTPFXUniform>& CPVRTPFXEffect::GetUniformArray() const
5737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
5747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_Uniforms;
5757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
5767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		BuildUniformTable
5797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Output			uiUnknownSemantics
5807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Output			pReturnError
5817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			EPVRTError
5827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Builds the uniform table from a list of known semantics.
5837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
5847b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTPFXEffect::RebuildUniformTable(unsigned int& uiUnknownSemantics, CPVRTString* pReturnError)
5857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
5867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int			nUnknownCount;
5877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const SPVRTPFXParserEffect&	ParserEffect = m_pParser->GetEffect(m_nEffect);
5887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GetSemantics(m_Uniforms, ParserEffect.Uniforms, m_Semantics, &nUnknownCount, m_uiProgram, false, pReturnError);
5907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	uiUnknownSemantics	= nUnknownCount;
5917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GetSemantics(m_Uniforms, ParserEffect.Attributes, m_Semantics, &nUnknownCount, m_uiProgram, true, pReturnError);
5937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	uiUnknownSemantics	+= nUnknownCount;
5947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
5967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
5977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		RegisterUniformSemantic
6007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input			psUniforms
6017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input			uiNumUniforms
6027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			EPVRTError
6037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Registers a user-provided uniform semantic.
6047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
6057b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTPFXEffect::RegisterUniformSemantic(const SPVRTPFXUniformSemantic* const psUniforms, unsigned int uiNumUniforms, CPVRTString* pReturnError)
6067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	for(unsigned int uiIndex = 0; uiIndex < uiNumUniforms; ++uiIndex)
6087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Check that this doesn't already exist.
6107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(m_Semantics.Contains(psUniforms[uiIndex]))
6117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
6127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			*pReturnError += PVRTStringFromFormattedStr("ERROR: Uniform semantic with ID '%u' already exists.\n", psUniforms[uiIndex].n);
6137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return PVR_FAIL;
6147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
6157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Make copy as we need to manage the memory.
6177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		char* pSemName = new char[strlen(psUniforms[uiIndex].p)+1];
6187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		strcpy(pSemName, psUniforms[uiIndex].p);
6197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiIdx = m_Semantics.Append();
6217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Semantics[uiIdx].n = psUniforms[uiIndex].n;
6227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Semantics[uiIdx].p = pSemName;
6237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Check if the effect has already been loaded. If it hasn't, great. If it has, we need to rebuild the uniform table.
6267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(m_bLoaded)
6277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Clear the current list.
6297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Uniforms.Clear();
6307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiUnknownSemantics;
6327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return RebuildUniformTable(uiUnknownSemantics, pReturnError);
6337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
6367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		RemoveUniformSemantic
6407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input			uiSemanticID
6417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Output			pReturnError
6427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			PVR_SUCCESS on success
6437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Removes a given semantic ID from the 'known' semantic list and
6447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				re-parses the effect to update the uniform table.
6457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
6467b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTPFXEffect::RemoveUniformSemantic(unsigned int uiSemanticID, CPVRTString* pReturnError)
6477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Make sure that the given ID isn't a PFX semantic
6497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(uiSemanticID < ePVRTPFX_NumSemantics)
6507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*pReturnError += "ERROR: Cannot remove a default PFX semantic.";
6527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
6537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Find the index in the array
6567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	unsigned int uiSemanticIndex = 0;
6577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	while(uiSemanticIndex < m_Semantics.GetSize() && m_Semantics[uiSemanticIndex].n != uiSemanticID) ++uiSemanticIndex;
6587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(uiSemanticIndex == m_Semantics.GetSize())
6607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*pReturnError += PVRTStringFromFormattedStr("ERROR: Semantic with ID %d does not exist.", uiSemanticID);
6627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVR_FAIL;
6637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_Semantics.Remove(uiSemanticIndex);
6667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Check if the effect has already been loaded. If it hasn't, great. If it has, we need to rebuild the uniform table.
6687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(m_bLoaded)
6697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Clear the current list.
6717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Uniforms.Clear();
6727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiUnknownSemantics;
6747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return RebuildUniformTable(uiUnknownSemantics, pReturnError);
6757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return PVR_SUCCESS;
6787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			GetTextureArray
6827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Output			nCount					number of textures
6837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Returns			SPVRTPFXTexture*		pointer to the texture data array
6847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Gets the texture data array.
6857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
6867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst CPVRTArray<SPVRTPFXTexture>& CPVRTPFXEffect::GetTextureArray() const
6877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_Textures;
6897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
6907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			SetTexture
6937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				nIdx				texture number
6947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				ui					opengl texture handle
6957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				u32flags			texture flags
6967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Sets the textrue and applys the filtering.
6977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
6987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTPFXEffect::SetTexture(const unsigned int nIdx, const GLuint ui, const unsigned int u32flags)
6997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
7007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(nIdx < (unsigned int) m_Textures.GetSize())
7017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		GLenum u32Target = GL_TEXTURE_2D;
7037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Check if texture is a cubemap
7057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if((u32flags & PVRTEX_CUBEMAP) != 0)
7067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			u32Target = GL_TEXTURE_CUBE_MAP;
7077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Get the texture details from the PFX Parser. This contains details such as mipmapping and filter modes.
7097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const CPVRTStringHash& TexName = m_pParser->GetEffect(m_nEffect).Textures[nIdx].Name;
7107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int iTexIdx = m_pParser->FindTextureByName(TexName);
7117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(iTexIdx == -1)
7127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			return;
7137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const SPVRTPFXParserTexture* pPFXTex = m_pParser->GetTexture(iTexIdx);
7157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Only change parameters if ui (handle is > 0)
7177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(ui > 0)
7187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
7197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glBindTexture(u32Target, ui);
7207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// Set default filter from PFX file
7227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// --- Mipmapping/Minification
7247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			switch(pPFXTex->nMIP)
7257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
7267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eFilter_None:			// No mipmapping
7277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				switch(pPFXTex->nMin)
7287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				{
7297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				case eFilter_Nearest:
7307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					glTexParameteri(u32Target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);					// Off
7317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					break;
7327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				case eFilter_Linear:
7337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					glTexParameteri(u32Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);					// Bilinear - no Mipmap
7347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					break;
7357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				}
7367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eFilter_Nearest:		// Standard mipmapping
7387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				switch(pPFXTex->nMin)
7397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				{
7407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				case eFilter_Nearest:
7417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					glTexParameteri(u32Target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);		// Nearest	- std. Mipmap
7427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					break;
7437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				case eFilter_Linear:
7447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					glTexParameteri(u32Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);		// Bilinear - std. Mipmap
7457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					break;
7467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				}
7477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eFilter_Linear:		// Trilinear mipmapping
7497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				switch(pPFXTex->nMin)
7507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				{
7517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				case eFilter_Nearest:
7527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					glTexParameteri(u32Target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);		// Nearest - Trilinear
7537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					break;
7547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				case eFilter_Linear:
7557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					glTexParameteri(u32Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);			// Bilinear - Trilinear
7567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					break;
7577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				}
7587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
7607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// --- Magnification
7627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			switch(pPFXTex->nMag)
7637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
7647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eFilter_Nearest:
7657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
7667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eFilter_Linear:
7687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
7697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
7717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// --- Wrapping S
7737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			switch(pPFXTex->nWrapS)
7747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
7757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eWrap_Clamp:
7767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
7777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eWrap_Repeat:
7797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_WRAP_S, GL_REPEAT);
7807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
7827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// --- Wrapping T
7847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			switch(pPFXTex->nWrapT)
7857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
7867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eWrap_Clamp:
7877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
7887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eWrap_Repeat:
7907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_WRAP_T, GL_REPEAT);
7917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
7927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
7937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			// --- Wrapping R
7957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	#ifdef GL_TEXTURE_WRAP_R
7967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			switch(pPFXTex->nWrapR)
7977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
7987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eWrap_Clamp:
7997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
8007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
8017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			case eWrap_Repeat:
8027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				glTexParameteri(u32Target, GL_TEXTURE_WRAP_R, GL_REPEAT);
8037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				break;
8047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
8057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	#endif
8067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Store the texture details
8097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Textures[nIdx].ui	   = ui;
8107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		m_Textures[nIdx].flags = u32flags;
8117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Find the texture unit from the parser
8137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		unsigned int uiIndex = m_pParser->FindTextureIndex(pPFXTex->Name, m_nEffect);
8147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if(uiIndex != 0xFFFFFFFF)
8157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
8167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			m_Textures[nIdx].unit = m_pParser->GetEffect(m_nEffect).Textures[uiIndex].nNumber;
8177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
8187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function			SetDefaultSemanticValue
8247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				pszName				name of uniform
8257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input				psDefaultValue      pointer to default value
8267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description		Sets the default value for the uniform semantic.
8277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
8287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTPFXEffect::SetDefaultUniformValue(const char *const pszName, const SPVRTSemanticDefaultData *psDefaultValue)
8297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	GLint nLocation = glGetUniformLocation(m_uiProgram, pszName);
8327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// Check for array. Workaround for some OpenGL:ES implementations which require array element appended to uniform name
8337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// in order to return the correct location.
8347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	if(nLocation == -1)
8357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		char szTmpUniformName[2048];
8377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		strcpy(szTmpUniformName, pszName);
8387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		strcat(szTmpUniformName, "[0]");
8397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		nLocation = glGetUniformLocation(m_uiProgram, szTmpUniformName);
8407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	switch(psDefaultValue->eType)
8437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeMat2:
8457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniformMatrix2fv(nLocation, 1, GL_FALSE, psDefaultValue->pfData);
8467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeMat3:
8487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniformMatrix3fv(nLocation, 1, GL_FALSE, psDefaultValue->pfData);
8497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeMat4:
8517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniformMatrix4fv(nLocation, 1, GL_FALSE, psDefaultValue->pfData);
8527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeVec2:
8547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform2fv(nLocation, 1, psDefaultValue->pfData);
8557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeRGB:
8577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeVec3:
8587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform3fv(nLocation, 1, psDefaultValue->pfData);
8597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeRGBA:
8617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeVec4:
8627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform4fv(nLocation, 1, psDefaultValue->pfData);
8637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeIvec2:
8657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform2iv(nLocation, 1, psDefaultValue->pnData);
8667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeIvec3:
8687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform3iv(nLocation, 1, psDefaultValue->pnData);
8697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeIvec4:
8717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform4iv(nLocation, 1, psDefaultValue->pnData);
8727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeBvec2:
8747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform2i(nLocation, psDefaultValue->pbData[0] ? 1 : 0, psDefaultValue->pbData[1] ? 1 : 0);
8757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeBvec3:
8777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform3i(nLocation, psDefaultValue->pbData[0] ? 1 : 0, psDefaultValue->pbData[1] ? 1 : 0, psDefaultValue->pbData[2] ? 1 : 0);
8787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeBvec4:
8807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform4i(nLocation, psDefaultValue->pbData[0] ? 1 : 0, psDefaultValue->pbData[1] ? 1 : 0, psDefaultValue->pbData[2] ? 1 : 0, psDefaultValue->pbData[3] ? 1 : 0);
8817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeFloat:
8837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform1f(nLocation, psDefaultValue->pfData[0]);
8847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeInt:
8867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform1i(nLocation, psDefaultValue->pnData[0]);
8877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeBool:
8897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			glUniform1i(nLocation, psDefaultValue->pbData[0] ? 1 : 0);
8907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eNumDefaultDataTypes:
8937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		case eDataTypeNone:
8947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		default:
8957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			break;
8967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		SetContext
9017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input			pContext
9027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description
9037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
9047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTPFXEffect::SetContext(SPVRTContext *const pContext)
9057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	m_psContext = pContext;
9077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
9087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		GetProgramHandle
9117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			unsigned int
9127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Returns the OGL program handle.
9137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
9147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensunsigned int CPVRTPFXEffect::GetProgramHandle() const
9157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_uiProgram;
9177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
9187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		GetEffectIndex
9217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			unsigned int
9227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Gets the active effect index within the PFX file.
9237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
9247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensunsigned int CPVRTPFXEffect::GetEffectIndex() const
9257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_nEffect;
9277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
9287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function		GetSemanticArray
9317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Return			const CPVRTArray<SPVRTPFXUniformSemantic>&
9327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Description	Gets the array of registered semantics which will be used to
9337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				match PFX code.
9347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
9357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst CPVRTArray<SPVRTPFXUniformSemantic>& CPVRTPFXEffect::GetSemanticArray() const
9367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return m_Semantics;
9387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
9397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
9417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens End of file (PVRTPFXParserAPI.cpp)
9427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
9437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
944