17b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/****************************************************************************** 27b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 37b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @File OGLES2/PVRTBackground.cpp 47b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 57b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Title OGLES2/PVRTBackground 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 Function to draw a background texture. 147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/ 167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTShader.h" 177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTBackground.h" 187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// The header that contains the shaders 207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTBackgroundShaders.h" 217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// Index to bind the attributes to vertex shaders 237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst int VERTEX_ARRAY = 0; 247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst int TEXCOORD_ARRAY = 1; 257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/**************************************************************************** 277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Structures 287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/ 297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// The struct to include various API variables 317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct SPVRTBackgroundAPI 327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLuint m_ui32VertexShader; 347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLuint m_ui32FragShader; 357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLuint m_ui32ProgramObject; 367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLuint m_ui32VertexBufferObject; 377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}; 387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/**************************************************************************** 407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Class: CPVRTBackground 417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/ 427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/***************************************************************************** 447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function Background 457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description Init some values. 467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 477b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTBackground::CPVRTBackground(void) 487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_bInit = false; 507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI = 0; 517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/***************************************************************************** 557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function ~Background 567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description Calls Destroy() 577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 587b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensCPVRTBackground::~CPVRTBackground(void) 597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens delete m_pAPI; 617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI = 0; 627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*************************************************************************** 657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function Destroy 667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description Destroys the background and releases API specific resources 677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid CPVRTBackground::Destroy() 697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_bInit) 717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Delete shaders 737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDeleteProgram(m_pAPI->m_ui32ProgramObject); 747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDeleteShader(m_pAPI->m_ui32VertexShader); 757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDeleteShader(m_pAPI->m_ui32FragShader); 767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Delete buffer objects 787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDeleteBuffers(1, &m_pAPI->m_ui32VertexBufferObject); 797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_bInit = false; 817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens delete m_pAPI; 847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI = 0; 857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*************************************************************************** 887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function Init 897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input pContext A pointer to a PVRTContext 907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input bRotate true to rotate texture 90 degrees. 917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input pszError An option string for returning errors 927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Return PVR_SUCCESS on success 937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description Initialises the background 947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 957b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTBackground::Init(const SPVRTContext * const pContext, bool bRotate, CPVRTString *pszError) 967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens PVRT_UNREFERENCED_PARAMETER(pContext); 987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens Destroy(); 1007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI = new SPVRTBackgroundAPI; 1027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!m_pAPI) 1047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pszError) 1067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pszError = "Error: Insufficient memory to allocate SCPVRTBackgroundAPI."; 1077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return PVR_FAIL; 1097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI->m_ui32VertexShader = 0; 1127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI->m_ui32FragShader = 0; 1137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI->m_ui32ProgramObject = 0; 1147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI->m_ui32VertexBufferObject = 0; 1157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bool bResult; 1177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens CPVRTString sTmpErrStr; 1187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // The shader loading code doesn't expect a null pointer for the error string 1207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!pszError) 1217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pszError = &sTmpErrStr; 1227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* Compiles the shaders. For a more detailed explanation, see IntroducingPVRTools */ 1247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(GL_SGX_BINARY_IMG) 1257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Try binary shaders first 1267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bResult = (PVRTShaderLoadBinaryFromMemory(_BackgroundFragShader_fsc, _BackgroundFragShader_fsc_size, 1277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GL_FRAGMENT_SHADER, GL_SGX_BINARY_IMG, &m_pAPI->m_ui32FragShader, pszError) == PVR_SUCCESS) 1287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens && (PVRTShaderLoadBinaryFromMemory(_BackgroundVertShader_vsc, _BackgroundVertShader_vsc_size, 1297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GL_VERTEX_SHADER, GL_SGX_BINARY_IMG, &m_pAPI->m_ui32VertexShader, pszError) == PVR_SUCCESS); 1307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!bResult) 1317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // if binary shaders don't work, try source shaders 1347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bResult = (PVRTShaderLoadSourceFromMemory(_BackgroundFragShader_fsh, GL_FRAGMENT_SHADER, &m_pAPI->m_ui32FragShader, pszError) == PVR_SUCCESS) && 1357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens (PVRTShaderLoadSourceFromMemory(_BackgroundVertShader_vsh, GL_VERTEX_SHADER, &m_pAPI->m_ui32VertexShader, pszError) == PVR_SUCCESS); 1367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens _ASSERT(bResult); 1397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!bResult) 1417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return PVR_FAIL; 1427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Reset the error string 1447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pszError) 1457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pszError = ""; 1467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Create the shader program 1487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pAPI->m_ui32ProgramObject = glCreateProgram(); 1497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Attach the fragment and vertex shaders to it 1517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glAttachShader(m_pAPI->m_ui32ProgramObject, m_pAPI->m_ui32FragShader); 1527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glAttachShader(m_pAPI->m_ui32ProgramObject, m_pAPI->m_ui32VertexShader); 1537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Bind the custom vertex attribute "myVertex" to location VERTEX_ARRAY 1557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBindAttribLocation(m_pAPI->m_ui32ProgramObject, VERTEX_ARRAY, "myVertex"); 1567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Bind the custom vertex attribute "myUV" to location TEXCOORD_ARRAY 1587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBindAttribLocation(m_pAPI->m_ui32ProgramObject, TEXCOORD_ARRAY, "myUV"); 1597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Link the program 1617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glLinkProgram(m_pAPI->m_ui32ProgramObject); 1627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLint Linked; 1637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glGetProgramiv(m_pAPI->m_ui32ProgramObject, GL_LINK_STATUS, &Linked); 1647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (!Linked) 1657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int i32InfoLogLength, i32CharsWritten; 1677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glGetProgramiv(m_pAPI->m_ui32ProgramObject, GL_INFO_LOG_LENGTH, &i32InfoLogLength); 1687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens char* pszInfoLog = new char[i32InfoLogLength]; 1697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glGetProgramInfoLog(m_pAPI->m_ui32ProgramObject, i32InfoLogLength, &i32CharsWritten, pszInfoLog); 1707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pszError = CPVRTString("Failed to link: ") + pszInfoLog + "\n"; 1717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens delete [] pszInfoLog; 1727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bResult = false; 1737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens _ASSERT(bResult); 1767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!bResult) 1787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return PVR_FAIL; 1797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Use the loaded shader program 1817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glUseProgram(m_pAPI->m_ui32ProgramObject); 1827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Set the sampler2D variable to the first texture unit 1847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glUniform1i(glGetUniformLocation(m_pAPI->m_ui32ProgramObject, "sampler2d"), 0); 1857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Create the vertex buffer object 1877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLfloat *pVertexData = 0; 1887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // The vertex data for non-rotated 1907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLfloat afVertexData[16] = { -1, -1, 1, -1, -1, 1, 1, 1, 1917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 0, 0, 1, 0, 0, 1, 1, 1}; 1927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // The vertex data for rotated 1947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLfloat afVertexDataRotated[16] = {-1, 1, -1, -1, 1, 1, 1, -1, 1957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1, 1, 0, 1, 1, 0, 0, 0}; 1967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!bRotate) 1987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pVertexData = &afVertexData[0]; 1997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 2007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pVertexData = &afVertexDataRotated[0]; 2017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glGenBuffers(1, &m_pAPI->m_ui32VertexBufferObject); 2037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBindBuffer(GL_ARRAY_BUFFER, m_pAPI->m_ui32VertexBufferObject); 2047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 16, pVertexData, GL_STATIC_DRAW); 2067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBindBuffer(GL_ARRAY_BUFFER, 0); 2087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_bInit = true; 2107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return PVR_SUCCESS; 2127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 2137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*************************************************************************** 2167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function Draw 2177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input ui32Texture Texture to use 2187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Return PVR_SUCCESS on success 2197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description Draws a texture on a quad covering the whole screen. 2207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 2217b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEPVRTError CPVRTBackground::Draw(const GLuint ui32Texture) 2227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 2237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!m_bInit) 2247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return PVR_FAIL; 2257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glActiveTexture(GL_TEXTURE0); 2277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBindTexture(GL_TEXTURE_2D, ui32Texture); 2297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDisable(GL_DEPTH_TEST); 2317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDisable(GL_CULL_FACE); 2327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Use the loaded shader program 2347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glUseProgram(m_pAPI->m_ui32ProgramObject); 2357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Set vertex data 2377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBindBuffer(GL_ARRAY_BUFFER, m_pAPI->m_ui32VertexBufferObject); 2387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glEnableVertexAttribArray(VERTEX_ARRAY); 2407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glVertexAttribPointer(VERTEX_ARRAY, 2, GL_FLOAT, GL_FALSE, 0, (const void*) 0); 2417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Set texture coordinates 2437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glEnableVertexAttribArray(TEXCOORD_ARRAY); 2447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, 0, (const void*) (8 * sizeof(float))); 2457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Render geometry 2477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDrawArrays(GL_TRIANGLE_STRIP,0,4); 2487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDisableVertexAttribArray(VERTEX_ARRAY); 2507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDisableVertexAttribArray(TEXCOORD_ARRAY); 2517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glBindBuffer(GL_ARRAY_BUFFER, 0); 2537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glUseProgram(0); 2557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return PVR_SUCCESS; 2577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 2587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/***************************************************************************** 2607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens End of file (CPVRTBackground.cpp) 2617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 2627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 263