KWin
Loading...
Searching...
No Matches
openglcontext.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "openglcontext.h"
10
11#include <QByteArray>
12#include <QList>
13
14#include <epoxy/gl.h>
15
16namespace KWin
17{
18
19static QSet<QByteArray> getExtensions(OpenGlContext *context)
20{
21 QSet<QByteArray> ret;
22 if (!context->isOpenglES() && context->hasVersion(Version(3, 0))) {
23 int count;
24 glGetIntegerv(GL_NUM_EXTENSIONS, &count);
25
26 for (int i = 0; i < count; i++) {
27 const char *name = (const char *)glGetStringi(GL_EXTENSIONS, i);
28 ret.insert(name);
29 }
30 } else {
31 const QByteArray extensions = (const char *)glGetString(GL_EXTENSIONS);
32 QList<QByteArray> extensionsList = extensions.split(' ');
33 ret = {extensionsList.constBegin(), extensionsList.constEnd()};
34 }
35 return ret;
36}
37
39 : m_versionString((const char *)glGetString(GL_VERSION))
40 , m_version(Version::parseString(m_versionString))
41 , m_vendor((const char *)glGetString(GL_VENDOR))
42 , m_renderer((const char *)glGetString(GL_RENDERER))
43 , m_isOpenglES(m_versionString.startsWith("OpenGL ES"))
44 , m_extensions(getExtensions(this))
45 , m_supportsTimerQueries(checkTimerQuerySupport())
46{
47}
48
50{
51 if (qEnvironmentVariableIsSet("KWIN_NO_TIMER_QUERY")) {
52 return false;
53 }
54 if (m_isOpenglES) {
55 // 3.0 is required so query functions can be used without "EXT" suffix.
56 // Timer queries are still not part of the core OpenGL ES specification.
57 return openglVersion() >= Version(3, 0) && hasOpenglExtension("GL_EXT_disjoint_timer_query");
58 } else {
59 return openglVersion() >= Version(3, 3) || hasOpenglExtension("GL_ARB_timer_query");
60 }
61}
62
64{
65 return m_version >= version;
66}
67
69{
70 return m_versionString;
71}
72
77
78QByteArrayView OpenGlContext::vendor() const
79{
80 return m_vendor;
81}
82
83QByteArrayView OpenGlContext::renderer() const
84{
85 return m_renderer;
86}
87
89{
90 return m_isOpenglES;
91}
92
93bool OpenGlContext::hasOpenglExtension(QByteArrayView name) const
94{
95 return std::any_of(m_extensions.cbegin(), m_extensions.cend(), [name](const auto &string) {
96 return string == name;
97 });
98}
99
101{
102 return m_renderer.contains("softpipe") || m_renderer.contains("Software Rasterizer") || m_renderer.contains("llvmpipe");
103}
104
109
111{
112 const bool supportsGLSL = m_isOpenglES || (hasOpenglExtension("GL_ARB_shader_objects") && hasOpenglExtension("GL_ARB_fragment_shader") && hasOpenglExtension("GL_ARB_vertex_shader"));
113 const bool supportsNonPowerOfTwoTextures = m_isOpenglES || hasOpenglExtension("GL_ARB_texture_non_power_of_two");
114 const bool supports3DTextures = !m_isOpenglES || hasVersion(Version(3, 0)) || hasOpenglExtension("GL_OES_texture_3D");
115 return supportsGLSL && supportsNonPowerOfTwoTextures && supports3DTextures;
116}
117}
const bool m_isOpenglES
const Version m_version
Version openglVersion() const
bool isOpenglES() const
bool supportsTimerQueries() const
bool checkTimerQuerySupport() const
bool isSoftwareRenderer() const
const bool m_supportsTimerQueries
QByteArrayView renderer() const
bool checkSupported() const
const QSet< QByteArray > m_extensions
QByteArrayView openglVersionString() const
const QByteArrayView m_vendor
const QByteArrayView m_renderer
QByteArrayView vendor() const
bool hasVersion(const Version &version) const
bool hasOpenglExtension(QByteArrayView name) const
const QByteArrayView m_versionString
constexpr int version