/*!**************************************************************************** @Function InitView @Return bool true if no error occured @Description Code in InitView() will be called by PVRShell upon initialization or after a change in the rendering context. Used to initialize variables that are dependant on the rendering context (e.g. textures, vertex buffers, etc.) ******************************************************************************/ bool OGLES2BinaryShader::InitView() { // Initialise a colour to draw our triangle // (For this training course, binary loaded shaders use a different colour // To show which is being used. Red means it had to compile the shaders, // green shows that it retrieved the binary from memory. float afColour[]={0.0,0.0,0.0}; // Filename and path strings. char* pWritePath = (char*)PVRShellGet(prefWritePath); char* shaderPath = new char[strlen(pWritePath) + 13]; sprintf(shaderPath, "%sShaderBinary", pWritePath); //Checks if the program binary handling extension is supported. m_bBinaryShaderSupported=IsGLExtensionSupported("GL_OES_get_program_binary"); #if !defined (TARGET_OS_IPHONE) glGetProgramBinaryOES=0; glProgramBinaryOES=0; // Retrieves the functions needed to use the extension. if (m_bBinaryShaderSupported) { glGetProgramBinaryOES = (PFNGLGETPROGRAMBINARYOESPROC) PVRGetProcAddress(glGetProgramBinaryOES); glProgramBinaryOES = (PFNGLPROGRAMBINARYOESPROC) PVRGetProcAddress(glProgramBinaryOES); } #endif // If binary shaders are not supported or there isn't a valid binary shader stored, recompile the shaders. if (!m_bBinaryShaderSupported || !loadBinaryProgram(shaderPath,m_uiProgramObject)) { { // Fragment shader code const char* pszFragShader = "\ uniform lowp vec3 myColour;\ void main (void)\ {\ gl_FragColor = vec4(myColour, 1.0);\ }"; // Create the fragment shader object m_uiFragShader = glCreateShader(GL_FRAGMENT_SHADER); // Load the source code into it glShaderSource(m_uiFragShader, 1, (const char**)&pszFragShader, NULL); // Compile the source code glCompileShader(m_uiFragShader); // Check if compilation succeeded GLint bShaderCompiled; glGetShaderiv(m_uiFragShader, GL_COMPILE_STATUS, &bShaderCompiled); if (!bShaderCompiled) { // An error happened, first retrieve the length of the log message int i32InfoLogLength, i32CharsWritten; glGetShaderiv(m_uiFragShader, GL_INFO_LOG_LENGTH, &i32InfoLogLength); // Allocate enough space for the message and retrieve it char* pszInfoLog = new char[i32InfoLogLength]; glGetShaderInfoLog(m_uiFragShader, i32InfoLogLength, &i32CharsWritten, pszInfoLog); /* Displays the message in a dialog box when the application quits using the shell PVRShellSet function with first parameter prefExitMessage. */ char* pszMsg = new char[i32InfoLogLength+256]; strcpy(pszMsg, "Failed to compile fragment shader: "); strcat(pszMsg, pszInfoLog); PVRShellSet(prefExitMessage, pszMsg); delete [] pszMsg; delete [] pszInfoLog; delete [] shaderPath; return false; } }
/*!*************************************************************************** @Function LoadExtensions @Description Initialises IMG extensions *****************************************************************************/ void CPVRTglesExt::LoadExtensions() { glCurrentPaletteMatrixOES = 0; glLoadPaletteFromModelViewMatrixOES = 0; glMatrixIndexPointerOES = 0; glWeightPointerOES = 0; glBlendEquationOES = 0; glBlendEquationSeparateOES = 0; glClipPlanexIMG = 0; glClipPlanefIMG = 0; glVertexAttribPointerARB = 0; glEnableVertexAttribArrayARB = 0; glDisableVertexAttribArrayARB = 0; glProgramStringARB = 0; glBindProgramARB = 0; glDeleteProgramsARB = 0; glIsProgramARB = 0; glGenProgramsARB = 0; glVertexAttrib4fvARB = 0; glVertexAttrib4xvIMG = 0; glProgramLocalParameter4xIMG = 0; glProgramLocalParameter4xvIMG = 0; glProgramEnvParameter4xIMG = 0; glProgramEnvParameter4xvIMG = 0; glProgramEnvParameter4fARB = 0; glProgramEnvParameter4fvARB = 0; glProgramLocalParameter4fARB = 0; glProgramLocalParameter4fvARB = 0; glDrawTexiOES = 0; glDrawTexivOES = 0; glDrawTexsOES = 0; glDrawTexsvOES = 0; glDrawTexxOES = 0; glDrawTexxvOES = 0; glDrawTexfOES = 0; glDrawTexfvOES = 0; glGetTexStreamDeviceAttribivIMG = 0; glTexBindStreamIMG = 0; glGetTexStreamDeviceNameIMG = 0; glMultiDrawElementsEXT = 0; glMultiDrawArraysEXT = 0; glMapBufferOES = 0; glUnmapBufferOES = 0; glGetBufferPointervOES = 0; glIsRenderbufferOES = 0; glBindRenderbufferOES = 0; glDeleteRenderbuffersOES = 0; glGenRenderbuffersOES = 0; glRenderbufferStorageOES = 0; glGetRenderbufferParameterivOES = 0; glIsFramebufferOES = 0; glBindFramebufferOES = 0; glDeleteFramebuffersOES = 0; glGenFramebuffersOES = 0; glCheckFramebufferStatusOES = 0; glFramebufferTexture2DOES = 0; glFramebufferRenderbufferOES = 0; glGetFramebufferAttachmentParameterivOES = 0; glGenerateMipmapOES = 0; glPointSizePointerOES = 0; glQueryMatrixxOES = 0; glDiscardFramebufferEXT = 0; glBindVertexArrayOES = 0; glDeleteVertexArraysOES = 0; glGenVertexArraysOES = 0; glIsVertexArrayOES = 0; const GLubyte *pszGLExtensions; /* Retrieve GL extension string */ pszGLExtensions = glGetString(GL_EXTENSIONS); /* GL_OES_matrix_palette */ if (strstr((char *)pszGLExtensions, "GL_OES_matrix_palette")) { glCurrentPaletteMatrixOES = (PFNGLCURRENTPALETTEMATRIXOES)PVRGetProcAddress(glCurrentPaletteMatrixOES); glLoadPaletteFromModelViewMatrixOES = (PFNGLLOADPALETTEFROMMODELVIEWMATRIXOES)PVRGetProcAddress(glLoadPaletteFromModelViewMatrixOES); glMatrixIndexPointerOES = (PFNGLMATRIXINDEXPOINTEROES)PVRGetProcAddress(glMatrixIndexPointerOES); glWeightPointerOES = (PFNGLWEIGHTPOINTEROES)PVRGetProcAddress(glWeightPointerOES); } /* GL_OES_draw_texture */ if (strstr((char *)pszGLExtensions, "GL_OES_draw_texture")) { glDrawTexiOES = (PFNGLDRAWTEXIOES)PVRGetProcAddress(glDrawTexiOES); glDrawTexivOES = (PFNGLDRAWTEXIVOES)PVRGetProcAddress(glDrawTexivOES); glDrawTexsOES = (PFNGLDRAWTEXSOES)PVRGetProcAddress(glDrawTexsOES); glDrawTexsvOES = (PFNGLDRAWTEXSVOES)PVRGetProcAddress(glDrawTexsvOES); glDrawTexxOES = (PFNGLDRAWTEXXOES)PVRGetProcAddress(glDrawTexxOES); glDrawTexxvOES = (PFNGLDRAWTEXXVOES)PVRGetProcAddress(glDrawTexxvOES); glDrawTexfOES = (PFNGLDRAWTEXFOES)PVRGetProcAddress(glDrawTexfOES); glDrawTexfvOES = (PFNGLDRAWTEXFVOES)PVRGetProcAddress(glDrawTexfvOES); } /* GL_EXT_multi_draw_arrays */ if (strstr((char *)pszGLExtensions, "GL_OES_mapbuffer")) { glMapBufferOES = (PFNGLMAPBUFFEROES)PVRGetProcAddress(glMapBufferOES); glUnmapBufferOES = (PFNGLUNMAPBUFFEROES)PVRGetProcAddress(glUnmapBufferOES); glGetBufferPointervOES = (PFNGLGETBUFFERPOINTERVOES)PVRGetProcAddress(glGetBufferPointervOES); } /* GL_OES_Framebuffer_object*/ if (strstr((char *)pszGLExtensions, "GL_OES_framebuffer_object")) { glIsRenderbufferOES = (PFNGLISRENDERBUFFEROES)PVRGetProcAddress(glIsRenderbufferOES) ; glBindRenderbufferOES = (PFNGLBINDRENDERBUFFEROES)PVRGetProcAddress(glBindRenderbufferOES); glDeleteRenderbuffersOES = (PFNGLDELETERENDERBUFFERSOES)PVRGetProcAddress(glDeleteRenderbuffersOES); glGenRenderbuffersOES = (PFNGLGENRENDERBUFFERSOES)PVRGetProcAddress(glGenRenderbuffersOES); glRenderbufferStorageOES = (PFNGLRENDERBUFFERSTORAGEOES)PVRGetProcAddress(glRenderbufferStorageOES); glGetRenderbufferParameterivOES = (PFNGLGETRENDERBUFFERPARAMETERIVOES)PVRGetProcAddress(glGetRenderbufferParameterivOES); glIsFramebufferOES = (PFNGLISFRAMEBUFFEROES)PVRGetProcAddress(glIsFramebufferOES); glBindFramebufferOES = (PFNGLBINDFRAMEBUFFEROES)PVRGetProcAddress(glBindFramebufferOES); glDeleteFramebuffersOES = (PFNGLDELETEFRAMEBUFFERSOES)PVRGetProcAddress(glDeleteFramebuffersOES); glGenFramebuffersOES = (PFNGLGENFRAMEBUFFERSOES)PVRGetProcAddress(glGenFramebuffersOES); glCheckFramebufferStatusOES = (PFNGLCHECKFRAMEBUFFERSTATUSOES)PVRGetProcAddress(glCheckFramebufferStatusOES); glFramebufferTexture2DOES = (PFNGLFRAMEBUFFERTEXTURE2DOES)PVRGetProcAddress(glFramebufferTexture2DOES); glFramebufferRenderbufferOES = (PFNGLFRAMEBUFFERRENDERBUFFEROES)PVRGetProcAddress(glFramebufferRenderbufferOES); glGetFramebufferAttachmentParameterivOES = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOES)PVRGetProcAddress(glGetFramebufferAttachmentParameterivOES); glGenerateMipmapOES = (PFNGLGENERATEMIPMAPOES)PVRGetProcAddress(glGenerateMipmapOES); } /* GL_OES_point_size_array */ if (strstr((char *)pszGLExtensions, "GL_OES_point_size_array")) { glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROES)PVRGetProcAddress(glPointSizePointerOES); } #if !defined (TARGET_OS_IPHONE) /* GL_IMG_user_clip_plane */ if (strstr((char *)pszGLExtensions, "GL_IMG_user_clip_plane")) { /* glClipPlanexIMG and glClipPlanefIMG */ glClipPlanexIMG = (PFNGLCLIPPLANEXIMG)PVRGetProcAddress(glClipPlanexIMG); glClipPlanefIMG = (PFNGLCLIPPLANEFIMG)PVRGetProcAddress(glClipPlanefIMG); } /* GL_IMG_vertex_program */ if (strstr((char *)pszGLExtensions, "GL_IMG_vertex_program")) { glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARB)PVRGetProcAddress(glVertexAttribPointerARB); glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARB)PVRGetProcAddress(glEnableVertexAttribArrayARB); glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARB)PVRGetProcAddress(glDisableVertexAttribArrayARB); glProgramStringARB = (PFNGLPROGRAMSTRINGARB)PVRGetProcAddress(glProgramStringARB); glBindProgramARB = (PFNGLBINDPROGRAMARB)PVRGetProcAddress(glBindProgramARB); glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARB)PVRGetProcAddress(glDeleteProgramsARB); glIsProgramARB = (PFNGLISPROGRAMARB)PVRGetProcAddress(glIsProgramARB); glGenProgramsARB = (PFNGLGENPROGRAMSARB)PVRGetProcAddress(glGenProgramsARB); glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARB)PVRGetProcAddress(glVertexAttrib4fvARB); glVertexAttrib4xvIMG = (PFNGLVERTEXATTRIB4XVIMG)PVRGetProcAddress(glVertexAttrib4xvIMG); glProgramLocalParameter4xIMG = (PFNGLPROGRAMLOCALPARAMETER4XIMG)PVRGetProcAddress(glProgramLocalParameter4xIMG); glProgramLocalParameter4xvIMG = (PFNGLPROGRAMLOCALPARAMETER4XVIMG)PVRGetProcAddress(glProgramLocalParameter4xvIMG); glProgramEnvParameter4xIMG = (PFNGLPROGRAMENVPARAMETER4XIMG)PVRGetProcAddress(glProgramEnvParameter4xIMG); glProgramEnvParameter4xvIMG = (PFNGLPROGRAMENVPARAMETER4XVIMG)PVRGetProcAddress(glProgramEnvParameter4xvIMG); glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARB)PVRGetProcAddress(glProgramEnvParameter4fARB); glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARB)PVRGetProcAddress(glProgramEnvParameter4fvARB); glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARB)PVRGetProcAddress(glProgramLocalParameter4fARB); glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARB)PVRGetProcAddress(glProgramLocalParameter4fvARB); } /* IMG_texture_stream */ if (strstr((char *)pszGLExtensions, "GL_IMG_texture_stream")) { glGetTexStreamDeviceAttribivIMG = (PFNGLGETTEXSTREAMDEVICEATTRIBIVIMG)PVRGetProcAddress(glGetTexStreamDeviceAttribivIMG); glTexBindStreamIMG = (PFNGLTEXBINDSTREAMIMG)PVRGetProcAddress(glTexBindStreamIMG); glGetTexStreamDeviceNameIMG = (PFNGLGETTEXSTREAMDEVICENAMEIMG)PVRGetProcAddress(glGetTexStreamDeviceNameIMG); } /* GL_EXT_multi_draw_arrays */ if (strstr((char *)pszGLExtensions, "GL_EXT_multi_draw_arrays")) { glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTS)PVRGetProcAddress(glMultiDrawElementsEXT); glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYS)PVRGetProcAddress(glMultiDrawArraysEXT); } /* GL_OES_query_matrix */ if (strstr((char *)pszGLExtensions, "GL_OES_query_matrix")) { glQueryMatrixxOES = (PFNGLQUERYMATRIXXOES)PVRGetProcAddress(glQueryMatrixxOES); } /* GL_OES_blend_equation */ if (strstr((char *)pszGLExtensions, "GL_OES_blend_subtract")) { glBlendEquationOES = (PFNGLBLENDEQUATIONOES)PVRGetProcAddress(glBlendEquationOES); } /* GL_OES_query_matrix */ if (strstr((char *)pszGLExtensions, "GL_OES_blend_equation_separate")) { glBlendEquationSeparateOES = (PFNGLBLENDEQUATIONSEPARATEOES)PVRGetProcAddress(glBlendEquationSeparateOES); } /* GL_OES_vertex_array_object */ if (strstr((char *)pszGLExtensions, "GL_OES_vertex_array_object")) { glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOES) PVRGetProcAddress(glBindVertexArrayOES); glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOES) PVRGetProcAddress(glDeleteVertexArraysOES); glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOES) PVRGetProcAddress(glGenVertexArraysOES); glIsVertexArrayOES = (PFNGLISVERTEXARRAYOES) PVRGetProcAddress(glIsVertexArrayOES); } #endif #if defined(GL_EXT_discard_framebuffer) /* GL_EXT_discard_framebuffer */ if (strstr((char *)pszGLExtensions, "GL_EXT_discard_framebuffer")) { glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXT) PVRGetProcAddress(glDiscardFramebufferEXT); } #endif }
/*!*************************************************************************** @Function LoadExtensions @Description Initialises IMG extensions *****************************************************************************/ void CPVRTgles2Ext::LoadExtensions() { glMultiDrawElementsEXT = 0; glMultiDrawArraysEXT = 0; glMapBufferOES = 0; glUnmapBufferOES = 0; glGetBufferPointervOES = 0; glDiscardFramebufferEXT = 0; glBindVertexArrayOES = 0; glDeleteVertexArraysOES = 0; glGenVertexArraysOES = 0; glIsVertexArrayOES = 0; glRenderbufferStorageMultisampleIMG = 0; glFramebufferTexture2DMultisampleIMG = 0; // Supported extensions provide new entry points for OpenGL ES 2.0. const GLubyte *pszGLExtensions; /* Retrieve GL extension string */ pszGLExtensions = glGetString(GL_EXTENSIONS); #if !defined(TARGET_OS_IPHONE) /* GL_EXT_multi_draw_arrays */ if (strstr((char *)pszGLExtensions, "GL_EXT_multi_draw_arrays")) { glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTS) PVRGetProcAddress(glMultiDrawElementsEXT); glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYS) PVRGetProcAddress(glMultiDrawArraysEXT); } /* GL_EXT_multi_draw_arrays */ if (strstr((char *)pszGLExtensions, "GL_OES_mapbuffer")) { glMapBufferOES = (PFNGLMAPBUFFEROES) PVRGetProcAddress(glMapBufferOES); glUnmapBufferOES = (PFNGLUNMAPBUFFEROES) PVRGetProcAddress(glUnmapBufferOES); glGetBufferPointervOES = (PFNGLGETBUFFERPOINTERVOES) PVRGetProcAddress(glGetBufferPointervOES); } /* GL_OES_vertex_array_object */ if (strstr((char *)pszGLExtensions, "GL_OES_vertex_array_object")) { glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOES) PVRGetProcAddress(glBindVertexArrayOES); glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOES) PVRGetProcAddress(glDeleteVertexArraysOES); glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOES) PVRGetProcAddress(glGenVertexArraysOES); glIsVertexArrayOES = (PFNGLISVERTEXARRAYOES) PVRGetProcAddress(glIsVertexArrayOES); } /* GL_IMG_multisampled_render_to_texture */ if (strstr((char *)pszGLExtensions, "GL_IMG_multisampled_render_to_texture")) { glRenderbufferStorageMultisampleIMG = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG)PVRGetProcAddress(glRenderbufferStorageMultisampleIMG); glFramebufferTexture2DMultisampleIMG = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMG)PVRGetProcAddress(glFramebufferTexture2DMultisampleIMG); } #endif #if defined(GL_EXT_discard_framebuffer) /* GL_EXT_discard_framebuffer */ if (strstr((char *)pszGLExtensions, "GL_EXT_discard_framebuffer")) { glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXT) PVRGetProcAddress(glDiscardFramebufferEXT); } #endif }