Renderer* Init(Settings vs) { assert(!initted); if (initted) return 0; // no mode set, find an ok one if ((vs.width <= 0) || (vs.height <= 0)) { const std::vector<VideoMode> modes = GetAvailableVideoModes(); assert(!modes.empty()); vs.width = modes.front().width; vs.height = modes.front().height; } WindowSDL *window = new WindowSDL(vs, "Pioneer"); width = window->GetWidth(); height = window->GetHeight(); const int didLoad = ogl_LoadFunctions(); if (!didLoad) Error("glLoadGen failed to load functions.\n"); { std::ostringstream buf; write_opengl_info(buf); FILE *f = FileSystem::userFiles.OpenWriteStream("opengl.txt", FileSystem::FileSourceFS::WRITE_TEXT); if (!f) Output("Could not open 'opengl.txt'\n"); const std::string &s = buf.str(); fwrite(s.c_str(), 1, s.size(), f); fclose(f); } if (ogl_ext_EXT_texture_compression_s3tc == ogl_LOAD_FAILED) { Error("OpenGL extension GL_EXT_texture_compression_s3tc not supported.\nPioneer can not run on your graphics card as it does not support compressed (DXTn/S3TC) format textures."); } // We deliberately ignore the value from GL_NUM_COMPRESSED_TEXTURE_FORMATS, because some drivers // choose not to list any formats (despite supporting texture compression). See issue #3132. // This is (probably) allowed by the spec, which states that only formats which are "suitable // for general-purpose usage" should be enumerated. Renderer *renderer = new RendererOGL(window, vs); Output("Initialized %s\n", renderer->GetName()); std::ostringstream dummy; dump_and_clear_opengl_errors(dummy); initted = true; MaterialDescriptor desc; desc.effect = EFFECT_VTXCOLOR; desc.vertexColors = true; vtxColorMaterial = renderer->CreateMaterial(desc); vtxColorMaterial->IncRefCount(); return renderer; }
static void write_opengl_info(std::ostream &out) { out << "OpenGL version " << glGetString(GL_VERSION); out << ", running on " << glGetString(GL_VENDOR); out << " " << glGetString(GL_RENDERER) << "\n"; out << "Available extensions:" << "\n"; { out << "Shading language version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << "\n"; GLint numext = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &numext); for (int i = 0; i < numext; ++i) { out << " " << glGetStringi(GL_EXTENSIONS, i) << "\n"; } } out << "\nImplementation Limits:\n"; // first, clear all OpenGL error flags dump_and_clear_opengl_errors(out); #define DUMP_GL_VALUE(name) dump_opengl_value(out, #name, name, 1) #define DUMP_GL_VALUE2(name) dump_opengl_value(out, #name, name, 2) DUMP_GL_VALUE(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS); DUMP_GL_VALUE(GL_MAX_CUBE_MAP_TEXTURE_SIZE); DUMP_GL_VALUE(GL_MAX_DRAW_BUFFERS); DUMP_GL_VALUE(GL_MAX_ELEMENTS_INDICES); DUMP_GL_VALUE(GL_MAX_ELEMENTS_VERTICES); DUMP_GL_VALUE(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS); DUMP_GL_VALUE(GL_MAX_TEXTURE_IMAGE_UNITS); DUMP_GL_VALUE(GL_MAX_TEXTURE_LOD_BIAS); DUMP_GL_VALUE(GL_MAX_TEXTURE_SIZE); DUMP_GL_VALUE(GL_MAX_VERTEX_ATTRIBS); DUMP_GL_VALUE(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS); DUMP_GL_VALUE(GL_MAX_VERTEX_UNIFORM_COMPONENTS); DUMP_GL_VALUE(GL_NUM_COMPRESSED_TEXTURE_FORMATS); DUMP_GL_VALUE(GL_SAMPLE_BUFFERS); DUMP_GL_VALUE(GL_SAMPLES); DUMP_GL_VALUE2(GL_ALIASED_LINE_WIDTH_RANGE); DUMP_GL_VALUE2(GL_MAX_VIEWPORT_DIMS); DUMP_GL_VALUE2(GL_SMOOTH_LINE_WIDTH_RANGE); DUMP_GL_VALUE2(GL_SMOOTH_POINT_SIZE_RANGE); #undef DUMP_GL_VALUE #undef DUMP_GL_VALUE2 // enumerate compressed texture formats { dump_and_clear_opengl_errors(out); out << "\nCompressed texture formats:\n"; GLint nformats; GLint formats[128]; // XXX 128 should be enough, right? glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &nformats); GLenum err = glGetError(); if (err != GL_NO_ERROR) { out << "Get NUM_COMPRESSED_TEXTURE_FORMATS failed\n"; dump_and_clear_opengl_errors(out, err); } else { assert(nformats >= 0 && nformats < int(COUNTOF(formats))); glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats); err = glGetError(); if (err != GL_NO_ERROR) { out << "Get COMPRESSED_TEXTURE_FORMATS failed\n"; dump_and_clear_opengl_errors(out, err); } else { for (int i = 0; i < nformats; ++i) { out << stringf(" %0{x#}\n", unsigned(formats[i])); } } } } // one last time dump_and_clear_opengl_errors(out); }
static void write_opengl_info(std::ostream &out) { out << "OpenGL version " << glGetString(GL_VERSION); out << ", running on " << glGetString(GL_VENDOR); out << " " << glGetString(GL_RENDERER) << "\n"; out << "GLEW version " << glewGetString(GLEW_VERSION) << "\n"; if (glewIsSupported("GL_VERSION_2_0")) out << "Shading language version: " << glGetString(GL_SHADING_LANGUAGE_VERSION_ARB) << "\n"; out << "Available extensions:" << "\n"; if (glewIsSupported("GL_VERSION_3_0")) { GLint numext = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &numext); for (int i = 0; i < numext; ++i) { out << " " << glGetStringi(GL_EXTENSIONS, i) << "\n"; } } else { out << " "; std::istringstream ext(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS))); std::copy( std::istream_iterator<std::string>(ext), std::istream_iterator<std::string>(), std::ostream_iterator<std::string>(out, "\n ")); } out << "\nImplementation Limits:\n"; // first, clear all OpenGL error flags dump_and_clear_opengl_errors(out); #define DUMP_GL_VALUE(name) dump_opengl_value(out, #name, name, 1) #define DUMP_GL_VALUE2(name) dump_opengl_value(out, #name, name, 2) DUMP_GL_VALUE(GL_MAX_3D_TEXTURE_SIZE); DUMP_GL_VALUE(GL_MAX_ATTRIB_STACK_DEPTH); DUMP_GL_VALUE(GL_MAX_CLIENT_ATTRIB_STACK_DEPTH); DUMP_GL_VALUE(GL_MAX_CLIP_PLANES); DUMP_GL_VALUE(GL_MAX_COLOR_ATTACHMENTS_EXT); DUMP_GL_VALUE(GL_MAX_COLOR_MATRIX_STACK_DEPTH); DUMP_GL_VALUE(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS); DUMP_GL_VALUE(GL_MAX_CUBE_MAP_TEXTURE_SIZE); DUMP_GL_VALUE(GL_MAX_DRAW_BUFFERS); DUMP_GL_VALUE(GL_MAX_ELEMENTS_INDICES); DUMP_GL_VALUE(GL_MAX_ELEMENTS_VERTICES); DUMP_GL_VALUE(GL_MAX_EVAL_ORDER); DUMP_GL_VALUE(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS); DUMP_GL_VALUE(GL_MAX_LIGHTS); DUMP_GL_VALUE(GL_MAX_LIST_NESTING); DUMP_GL_VALUE(GL_MAX_MODELVIEW_STACK_DEPTH); DUMP_GL_VALUE(GL_MAX_NAME_STACK_DEPTH); DUMP_GL_VALUE(GL_MAX_PIXEL_MAP_TABLE); DUMP_GL_VALUE(GL_MAX_PROJECTION_STACK_DEPTH); DUMP_GL_VALUE(GL_MAX_RENDERBUFFER_SIZE_EXT); DUMP_GL_VALUE(GL_MAX_SAMPLES_EXT); DUMP_GL_VALUE(GL_MAX_TEXTURE_COORDS); DUMP_GL_VALUE(GL_MAX_TEXTURE_IMAGE_UNITS); DUMP_GL_VALUE(GL_MAX_TEXTURE_LOD_BIAS); DUMP_GL_VALUE(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT); DUMP_GL_VALUE(GL_MAX_TEXTURE_SIZE); DUMP_GL_VALUE(GL_MAX_TEXTURE_STACK_DEPTH); DUMP_GL_VALUE(GL_MAX_TEXTURE_UNITS); DUMP_GL_VALUE(GL_MAX_VARYING_FLOATS); DUMP_GL_VALUE(GL_MAX_VERTEX_ATTRIBS); DUMP_GL_VALUE(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS); DUMP_GL_VALUE(GL_MAX_VERTEX_UNIFORM_COMPONENTS); DUMP_GL_VALUE(GL_NUM_COMPRESSED_TEXTURE_FORMATS); DUMP_GL_VALUE(GL_SAMPLE_BUFFERS); DUMP_GL_VALUE(GL_SAMPLES); DUMP_GL_VALUE2(GL_ALIASED_LINE_WIDTH_RANGE); DUMP_GL_VALUE2(GL_ALIASED_POINT_SIZE_RANGE); DUMP_GL_VALUE2(GL_MAX_VIEWPORT_DIMS); DUMP_GL_VALUE2(GL_SMOOTH_LINE_WIDTH_RANGE); DUMP_GL_VALUE2(GL_SMOOTH_POINT_SIZE_RANGE); #undef DUMP_GL_VALUE #undef DUMP_GL_VALUE2 // enumerate compressed texture formats { dump_and_clear_opengl_errors(out); out << "\nCompressed texture formats:\n"; GLint nformats; GLint formats[128]; // XXX 128 should be enough, right? glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &nformats); GLenum err = glGetError(); if (err != GL_NO_ERROR) { out << "Get NUM_COMPRESSED_TEXTURE_FORMATS failed\n"; dump_and_clear_opengl_errors(out, err); } else { assert(nformats >= 0 && nformats < int(COUNTOF(formats))); glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats); err = glGetError(); if (err != GL_NO_ERROR) { out << "Get COMPRESSED_TEXTURE_FORMATS failed\n"; dump_and_clear_opengl_errors(out, err); } else { for (int i = 0; i < nformats; ++i) { out << stringf(" %0{x#}\n", unsigned(formats[i])); } } } } }
Renderer* Init(Settings vs) { assert(!initted); if (initted) return 0; // no mode set, find an ok one if ((vs.width <= 0) || (vs.height <= 0)) { const std::vector<VideoMode> modes = GetAvailableVideoModes(); assert(!modes.empty()); vs.width = modes.front().width; vs.height = modes.front().height; } WindowSDL *window = new WindowSDL(vs, "Pioneer"); width = window->GetWidth(); height = window->GetHeight(); glewExperimental = true; GLenum glew_err; if ((glew_err = glewInit()) != GLEW_OK) Error("GLEW initialisation failed: %s", glewGetErrorString(glew_err)); { std::ostringstream buf; write_opengl_info(buf); FILE *f = FileSystem::userFiles.OpenWriteStream("opengl.txt", FileSystem::FileSourceFS::WRITE_TEXT); if (!f) Output("Could not open 'opengl.txt'\n"); const std::string &s = buf.str(); fwrite(s.c_str(), 1, s.size(), f); fclose(f); } // pump this once as glewExperimental is necessary but spews a single error GLenum err = glGetError(); if (!glewIsSupported("GL_VERSION_3_2") ) Error("OpenGL Version 3.2 is not supported. Pioneer cannot run on your graphics card."); // Brilliantly under OpenGL 3.2 CORE profile Glew says this isn't supported, this forces us to use a COMPATIBILITY profile :/ if (!glewIsSupported("GL_EXT_texture_compression_s3tc")) { if (glewIsSupported("GL_ARB_texture_compression")) { GLint intv[4]; glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &intv[0]); if( intv[0] == 0 ) { Error("GL_NUM_COMPRESSED_TEXTURE_FORMATS is zero.\nPioneer can not run on your graphics card as it does not support compressed (DXTn/S3TC) format textures."); } } else { Error("OpenGL extension GL_EXT_texture_compression_s3tc not supported.\nPioneer can not run on your graphics card as it does not support compressed (DXTn/S3TC) format textures."); } } // We deliberately ignore the value from GL_NUM_COMPRESSED_TEXTURE_FORMATS, because some drivers // choose not to list any formats (despite supporting texture compression). See issue #3132. // This is (probably) allowed by the spec, which states that only formats which are "suitable // for general-purpose usage" should be enumerated. Renderer *renderer = new RendererOGL(window, vs); Output("Initialized %s\n", renderer->GetName()); std::ostringstream dummy; dump_and_clear_opengl_errors(dummy); initted = true; MaterialDescriptor desc; desc.effect = EFFECT_VTXCOLOR; desc.vertexColors = true; vtxColorMaterial = renderer->CreateMaterial(desc); vtxColorMaterial->IncRefCount(); return renderer; }