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