/** * Link vertex shader, fragment shader and geometry shader objects into a * usable shader executable. * * Prints linker errors (if any) to the log. * * @param vertex_object Compiled vertex shader object * @param fragment_object Compiled fragment shader object * @param geometry_object Compiled geometry shader object * @return Shader executable */ GLhandleARB opengl_shader_link_object(GLhandleARB vertex_object, GLhandleARB fragment_object, GLhandleARB geometry_object) { GLhandleARB shader_object = 0; GLint status = 0; shader_object = vglCreateProgramObjectARB(); if (vertex_object) { vglAttachObjectARB(shader_object, vertex_object); } if (fragment_object) { vglAttachObjectARB(shader_object, fragment_object); } if (geometry_object) { vglAttachObjectARB(shader_object, geometry_object); if ( Current_geo_sdr_params != NULL) { #ifdef __APPLE__ vglProgramParameteriEXT((long)shader_object, GL_GEOMETRY_INPUT_TYPE_EXT, Current_geo_sdr_params->input_type); vglProgramParameteriEXT((long)shader_object, GL_GEOMETRY_OUTPUT_TYPE_EXT, Current_geo_sdr_params->output_type); vglProgramParameteriEXT((long)shader_object, GL_GEOMETRY_VERTICES_OUT_EXT, Current_geo_sdr_params->vertices_out); #else vglProgramParameteriEXT((GLuint)shader_object, GL_GEOMETRY_INPUT_TYPE_EXT, Current_geo_sdr_params->input_type); vglProgramParameteriEXT((GLuint)shader_object, GL_GEOMETRY_OUTPUT_TYPE_EXT, Current_geo_sdr_params->output_type); vglProgramParameteriEXT((GLuint)shader_object, GL_GEOMETRY_VERTICES_OUT_EXT, Current_geo_sdr_params->vertices_out); #endif } } vglLinkProgramARB(shader_object); // check if the link was successful vglGetObjectParameterivARB(shader_object, GL_OBJECT_LINK_STATUS_ARB, &status); opengl_shader_check_info_log(shader_object); // we failed, bail out now... if (status == 0) { mprintf(("Shader failed to link:\n%s\n", GLshader_info_log)); if (shader_object) { vglDeleteObjectARB(shader_object); } return 0; } // we succeeded, maybe output warnings too if (strlen(GLshader_info_log) > 5) { nprintf(("SHADER-DEBUG", "Shader linked with warnings:\n%s\n", GLshader_info_log)); } return shader_object; }
/** * Link a vertex shader object and a fragment shader object into a usable shader executable. * Prints linker errors (if any) to the log. * * @param vertex_object Compiled vertex shader object * @param fragment_object Compiled fragment shader object * @return Shader executable */ GLhandleARB opengl_shader_link_object(GLhandleARB vertex_object, GLhandleARB fragment_object) { GLhandleARB shader_object = 0; GLint status = 0; shader_object = vglCreateProgramObjectARB(); if (vertex_object) { vglAttachObjectARB(shader_object, vertex_object); } if (fragment_object) { vglAttachObjectARB(shader_object, fragment_object); } vglLinkProgramARB(shader_object); // check if the link was successful vglGetObjectParameterivARB(shader_object, GL_OBJECT_LINK_STATUS_ARB, &status); opengl_shader_check_info_log(shader_object); // we failed, bail out now... if (status == 0) { mprintf(("Shader failed to link:\n%s\n", GLshader_info_log)); if (shader_object) { vglDeleteObjectARB(shader_object); } return 0; } // we succeeded, maybe output warnings too if (strlen(GLshader_info_log) > 5) { nprintf(("SHADER-DEBUG", "Shader linked with warnings:\n%s\n", GLshader_info_log)); } return shader_object; }