int S9xOpenGLDisplayDriver::load_shaders (const char *vertex_file, const char *fragment_file) { char *fragment, *vertex; if (!load_shader_functions ()) { fprintf (stderr, _("Cannot load GLSL shader functions.\n")); return 0; } fragment = get_file_contents (fragment_file); if (!fragment) { fprintf (stderr, _("Cannot load fragment program.\n")); return 0; } vertex = get_file_contents (vertex_file); if (!vertex) { fprintf (stderr, _("Cannot load vertex program.\n")); delete[] fragment; return 0; } program = glCreateProgram (); vertex_shader = glCreateShader (GL_VERTEX_SHADER); fragment_shader = glCreateShader (GL_FRAGMENT_SHADER); glShaderSource (vertex_shader, 1, (const GLchar **) &vertex, NULL); glShaderSource (fragment_shader, 1, (const GLchar **) &fragment, NULL); glCompileShader (vertex_shader); glCompileShader (fragment_shader); glAttachShader (program, vertex_shader); glAttachShader (program, fragment_shader); glLinkProgram (program); glUseProgram (program); return 1; }
int S9xOpenGLDisplayDriver::load_shaders (const char *shader_file) { xmlDoc *xml_doc = NULL; xmlNodePtr node = NULL; char *fragment = NULL, *vertex = NULL; if (!load_shader_functions ()) { fprintf (stderr, _("Cannot load GLSL shader functions.\n")); return 0; } xml_doc = xmlReadFile (shader_file, NULL, 0); if (!xml_doc) { fprintf (stderr, _("Cannot read shader file.\n")); return 0; } node = xmlDocGetRootElement (xml_doc); if (xmlStrcasecmp (node->name, BAD_CAST "shader")) { fprintf (stderr, _("File %s is not a shader file.\n"), shader_file); xmlFreeDoc (xml_doc); return 0; } for (xmlNodePtr i = node->children; i; i = i->next) { if (!xmlStrcasecmp (i->name, BAD_CAST "vertex")) { if (i->children) vertex = (char *) i->children->content; } if (!xmlStrcasecmp (i->name, BAD_CAST "fragment")) { if (i->children) fragment = (char *) i->children->content; } } if (!vertex && !fragment) { fprintf (stderr, _("Shader lacks any programs.\n")); xmlFreeDoc (xml_doc); return 0; } program = glCreateProgram (); if (vertex) { vertex_shader = glCreateShader (GL_VERTEX_SHADER); glShaderSource (vertex_shader, 1, (const GLchar **) &vertex, NULL); glCompileShader (vertex_shader); glAttachShader (program, vertex_shader); } if (fragment) { fragment_shader = glCreateShader (GL_FRAGMENT_SHADER); glShaderSource (fragment_shader, 1, (const GLchar **) &fragment, NULL); glCompileShader (fragment_shader); glAttachShader (program, fragment_shader); } glLinkProgram (program); glUseProgram (program); xmlFreeDoc (xml_doc); return 1; }