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; }
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; } // 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. assert(vs.rendererType < MAX_RENDERER_TYPE); assert(rendererCreateFunc[vs.rendererType]); Renderer *renderer = rendererCreateFunc[vs.rendererType](vs); if(renderer==nullptr) { Error("Failed to set video mode: %s", SDL_GetError()); return nullptr; } if (vs.rendererType == Graphics::RENDERER_DUMMY) { width = vs.width; height = vs.height; } else { width = renderer->GetWindowWidth(); height = renderer->GetWindowHeight(); } Output("Initialized %s\n", renderer->GetName()); { std::ostringstream buf; renderer->WriteRendererInfo(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); } initted = true; MaterialDescriptor desc; desc.effect = EFFECT_VTXCOLOR; desc.vertexColors = true; vtxColorMaterial = renderer->CreateMaterial(desc); vtxColorMaterial->IncRefCount(); return renderer; }
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(); glewInit(); if (!glewIsSupported("GL_ARB_vertex_buffer_object")) OS::Error("OpenGL extension ARB_vertex_buffer_object not supported. Pioneer can not run on your graphics card."); Renderer *renderer = 0; shadersAvailable = glewIsSupported("GL_VERSION_2_0"); shadersEnabled = vs.shaders && shadersAvailable; if (shadersEnabled) renderer = new RendererGL2(window, vs); else renderer = new RendererLegacy(window, vs); printf("Initialized %s\n", renderer->GetName()); initted = true; MaterialDescriptor desc; desc.vertexColors = true; vtxColorMaterial = renderer->CreateMaterial(desc); vtxColorMaterial->IncRefCount(); return renderer; }
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; } const SDL_VideoInfo *info = SDL_GetVideoInfo(); //printf("SDL_GetVideoInfo says %d bpp\n", info->vfmt->BitsPerPixel); switch (info->vfmt->BitsPerPixel) { case 16: SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); break; case 24: case 32: SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); break; default: fprintf(stderr, "Invalid pixel depth: %d bpp\n", info->vfmt->BitsPerPixel); } SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, vs.requestedSamples ? 1 : 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, vs.requestedSamples); SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vs.vsync); Uint32 flags = SDL_OPENGL; if (vs.fullscreen) flags |= SDL_FULLSCREEN; // attempt sequence is: // 1- requested mode SDL_Surface *scrSurface = SDL_SetVideoMode(vs.width, vs.height, info->vfmt->BitsPerPixel, flags); // 2- requested mode with no anti-aliasing (skipped if no AA was requested anyway) if (!scrSurface && vs.requestedSamples) { fprintf(stderr, "Failed to set video mode. (%s). Re-trying without multisampling.\n", SDL_GetError()); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); scrSurface = SDL_SetVideoMode(vs.width, vs.height, info->vfmt->BitsPerPixel, flags); } // 3- requested mode with 16 bit depth buffer if (!scrSurface) { fprintf(stderr, "Failed to set video mode. (%s). Re-trying with 16-bit depth buffer\n", SDL_GetError()); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, vs.requestedSamples ? 1 : 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, vs.requestedSamples); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); scrSurface = SDL_SetVideoMode(vs.width, vs.height, info->vfmt->BitsPerPixel, flags); } // 4- requested mode with 16-bit depth buffer and no anti-aliasing // (skipped if no AA was requested anyway) if (!scrSurface && vs.requestedSamples) { fprintf(stderr, "Failed to set video mode. (%s). Re-trying with 16-bit depth buffer and no multisampling\n", SDL_GetError()); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); scrSurface = SDL_SetVideoMode(vs.width, vs.height, info->vfmt->BitsPerPixel, flags); } // 5- abort! if (!scrSurface) { OS::Error("Failed to set video mode: %s", SDL_GetError()); } // this valuable is not reliable if antialiasing settings are overridden by // nvidia/ati/whatever settings int actualSamples = 0; SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &actualSamples); if (vs.requestedSamples != actualSamples) fprintf(stderr, "Requested AA mode: %dx, actual: %dx\n", vs.requestedSamples, actualSamples); glewInit(); if (!glewIsSupported("GL_ARB_vertex_buffer_object")) OS::Error("OpenGL extension ARB_vertex_buffer_object not supported. Pioneer can not run on your graphics card."); Renderer *renderer = 0; shadersAvailable = glewIsSupported("GL_VERSION_2_0"); shadersEnabled = vs.shaders && shadersAvailable; if (shadersEnabled) renderer = new RendererGL2(vs); else renderer = new RendererLegacy(vs); printf("Initialized %s\n", renderer->GetName()); initted = true; MaterialDescriptor desc; desc.vertexColors = true; vtxColorMaterial = renderer->CreateMaterial(desc); vtxColorMaterial->IncRefCount(); Graphics::settings = vs; return renderer; }
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(); 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); } if (!glewIsSupported("GL_VERSION_2_0") ) Error("OpenGL Version 2.0 is not supported. Pioneer cannot run on your graphics card."); if (!glewIsSupported("GL_ARB_vertex_buffer_object")) Error("OpenGL extension ARB_vertex_buffer_object not supported. Pioneer can not run on your graphics card."); if (!glewIsSupported("GL_EXT_texture_compression_s3tc")) 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 RendererGL2(window, vs); Output("Initialized %s\n", renderer->GetName()); initted = true; MaterialDescriptor desc; desc.vertexColors = true; vtxColorMaterial = renderer->CreateMaterial(desc); vtxColorMaterial->IncRefCount(); return renderer; }
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; }