/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include #include "OGLTrans_Shaders.hxx" namespace unx { #include #include } bool OGLShaders::cbInitialized = false; #ifdef GL_VERSION_2_0 PFNGLCREATESHADERPROC OGLShaders::glCreateShader = NULL; PFNGLSHADERSOURCEPROC OGLShaders::glShaderSource = NULL; PFNGLCOMPILESHADERPROC OGLShaders::glCompileShader = NULL; PFNGLGETSHADERIVPROC OGLShaders::glGetShaderiv = NULL; PFNGLGETSHADERINFOLOGPROC OGLShaders::glGetShaderInfoLog = NULL; PFNGLDELETESHADERPROC OGLShaders::glDeleteShader = NULL; PFNGLCREATEPROGRAMPROC OGLShaders::glCreateProgram = NULL; PFNGLATTACHSHADERPROC OGLShaders::glAttachShader = NULL; PFNGLLINKPROGRAMPROC OGLShaders::glLinkProgram = NULL; PFNGLGETPROGRAMIVPROC OGLShaders::glGetProgramiv = NULL; PFNGLGETPROGRAMINFOLOGPROC OGLShaders::glGetProgramInfoLog = NULL; PFNGLUSEPROGRAMPROC OGLShaders::glUseProgram = NULL; PFNGLDELETEPROGRAMPROC OGLShaders::glDeleteProgram = NULL; PFNGLGETUNIFORMLOCATIONPROC OGLShaders::glGetUniformLocation = NULL; PFNGLUNIFORM1IPROC OGLShaders::glUniform1i = NULL; PFNGLUNIFORM1FPROC OGLShaders::glUniform1f = NULL; #endif bool OGLShaders::Initialize() { #ifdef GL_VERSION_2_0 if( !cbInitialized ) { glCreateShader = (PFNGLCREATESHADERPROC) unx::glXGetProcAddress( (unsigned char *) "glCreateShader" ); glShaderSource = (PFNGLSHADERSOURCEPROC) unx::glXGetProcAddress( (unsigned char *) "glShaderSource" ); glCompileShader = (PFNGLCOMPILESHADERPROC) unx::glXGetProcAddress( (unsigned char *) "glCompileShader" ); glGetShaderiv = (PFNGLGETSHADERIVPROC) unx::glXGetProcAddress( (unsigned char *) "glGetShaderiv" ); glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) unx::glXGetProcAddress( (unsigned char *) "glGetShaderInfoLog" ); glDeleteShader = (PFNGLDELETESHADERPROC) unx::glXGetProcAddress( (unsigned char *) "glDeleteShader" ); glCreateProgram = (PFNGLCREATEPROGRAMPROC) unx::glXGetProcAddress( (unsigned char *) "glCreateProgram" ); glAttachShader = (PFNGLATTACHSHADERPROC) unx::glXGetProcAddress( (unsigned char *) "glAttachShader" ); glLinkProgram = (PFNGLLINKPROGRAMPROC) unx::glXGetProcAddress( (unsigned char *) "glLinkProgram" ); glGetProgramiv = (PFNGLGETPROGRAMIVPROC) unx::glXGetProcAddress( (unsigned char *) "glGetProgramiv" ); glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) unx::glXGetProcAddress( (unsigned char *) "glGetProgramInfoLog" ); glUseProgram = (PFNGLUSEPROGRAMPROC) unx::glXGetProcAddress( (unsigned char *) "glUseProgram" ); glDeleteProgram = (PFNGLDELETEPROGRAMPROC) unx::glXGetProcAddress( (unsigned char *) "glDeleteProgram" ); glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) unx::glXGetProcAddress( (unsigned char *) "glGetUniformLocation" ); glUniform1i = (PFNGLUNIFORM1IPROC) unx::glXGetProcAddress( (unsigned char *) "glUniform1i" ); glUniform1f = (PFNGLUNIFORM1FPROC) unx::glXGetProcAddress( (unsigned char *) "glUniform1f" ); cbInitialized = true; } return glCreateShader != NULL; #else return false; #endif } GLuint OGLShaders::LinkProgram( const char *vertexShader, const char *fragmentShader ) { #ifdef GL_VERSION_2_0 if( !Initialize() ) return 0; GLhandleARB vertexObject, fragmentObject, programObject; GLint vertexCompiled, fragmentCompiled, programLinked; char log[1024]; vertexObject = glCreateShader( GL_VERTEX_SHADER ); fragmentObject = glCreateShader( GL_FRAGMENT_SHADER ); OSL_TRACE("checkpoint 1: shaders created (%d) vertex: %d fragment: %d", glGetError() == GL_NO_ERROR, vertexObject, fragmentObject ); glShaderSource( vertexObject, 1, &vertexShader, NULL ); glShaderSource( fragmentObject, 1, &fragmentShader, NULL ); glCompileShader( vertexObject ); glGetShaderInfoLog( vertexObject, sizeof( log ), NULL, log ); OSL_TRACE("vertex compile log: %s", log); glGetShaderiv( vertexObject, GL_COMPILE_STATUS, &vertexCompiled ); glCompileShader( fragmentObject ); glGetShaderInfoLog( fragmentObject, sizeof( log ), NULL, log ); OSL_TRACE("fragment compile log: %s", log); glGetShaderiv( fragmentObject, GL_COMPILE_STATUS, &fragmentCompiled ); if( !vertexCompiled || !fragmentCompiled ) return 0; OSL_TRACE("checkpoint 2: shaders compiled (%d)", glGetError() == GL_NO_ERROR); programObject = glCreateProgram(); glAttachShader( programObject, vertexObject ); glAttachShader( programObject, fragmentObject ); glLinkProgram( programObject ); glGetProgramInfoLog( programObject, sizeof( log ), NULL, log ); OSL_TRACE("program link log: %s", log); glGetProgramiv( programObject, GL_LINK_STATUS, &programLinked ); if( !programLinked ) return 0; OSL_TRACE("checkpoint 3: program linked (%d)", glGetError() == GL_NO_ERROR); return programObject; #else return 0; #endif }