22 auto str = gl.GetString(name);
26 return reinterpret_cast<const char*
>(str);
32 auto str = gl.GetStringi(name, index);
36 return reinterpret_cast<const char*
>(str);
55 if (version.empty()) {
59 std::stringstream stream;
60 for (
size_t i = 0; i < version.size(); i++) {
61 const auto character = version[i];
62 if (std::isdigit(character) || character ==
'.') {
68 std::istringstream istream;
69 istream.str(stream.str());
70 std::vector<size_t> version_components;
71 for (std::string version_component;
72 std::getline(istream, version_component,
'.');) {
73 version_components.push_back(std::stoul(version_component));
82 sl_version_string_(
GetGLString(gl, GL_SHADING_LANGUAGE_VERSION)) {
86 if (!gl_version.has_value()) {
90 gl_version_ = gl_version.value();
94 int extension_count = 0;
95 gl.GetIntegerv(GL_NUM_EXTENSIONS, &extension_count);
96 for (
auto i = 0; i < extension_count; i++) {
100 const auto extensions =
GetGLString(gl, GL_EXTENSIONS);
101 std::stringstream extensions_stream(extensions);
102 std::string extension;
103 while (std::getline(extensions_stream, extension,
' ')) {
104 extensions_.insert(extension);
109 if (!sl_version.has_value()) {
113 sl_version_ = sl_version.value();
126 return "Unknown Renderer.";
129 std::vector<std::pair<std::string, std::string>> items;
131 items.emplace_back(std::make_pair(
"Vendor", vendor_));
132 items.emplace_back(std::make_pair(
"Renderer", renderer_));
133 items.emplace_back(std::make_pair(
"GL Version", gl_version_string_));
135 std::make_pair(
"Shading Language Version", sl_version_string_));
137 std::make_pair(
"Extensions", std::to_string(extensions_.size())));
139 size_t max_width = 0u;
140 for (
const auto& item : items) {
141 max_width = std::max(max_width, item.first.size());
144 std::stringstream stream;
145 stream <<
"OpenGL Renderer:" << std::endl;
146 for (
const auto& item : items) {
147 stream << std::setw(max_width + 1) << item.first <<
": " << item.second
151 const auto pad = std::string(max_width + 3,
' ');
152 for (
const auto& extension : extensions_) {
153 stream << pad << extension << std::endl;
164 return extensions_.find(ext) != extensions_.end();