Warning, file /plasma/kwin/autotests/libkwineffects/kwinglplatformtest.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 #include "mock_gl.h" 0010 #include <QTest> 0011 #include <kwinglplatform.h> 0012 0013 #include <KConfig> 0014 #include <KConfigGroup> 0015 0016 Q_DECLARE_METATYPE(KWin::Driver) 0017 Q_DECLARE_METATYPE(KWin::ChipClass) 0018 0019 using namespace KWin; 0020 0021 void KWin::cleanupGL() 0022 { 0023 GLPlatform::cleanup(); 0024 } 0025 0026 class GLPlatformTest : public QObject 0027 { 0028 Q_OBJECT 0029 private Q_SLOTS: 0030 void cleanup(); 0031 0032 void testDriverToString_data(); 0033 void testDriverToString(); 0034 void testChipClassToString_data(); 0035 void testChipClassToString(); 0036 void testPriorDetect(); 0037 void testDetect_data(); 0038 void testDetect(); 0039 }; 0040 0041 void GLPlatformTest::cleanup() 0042 { 0043 cleanupGL(); 0044 delete s_gl; 0045 s_gl = nullptr; 0046 } 0047 0048 void GLPlatformTest::testDriverToString_data() 0049 { 0050 QTest::addColumn<Driver>("driver"); 0051 QTest::addColumn<QString>("expected"); 0052 0053 QTest::newRow("R100") << Driver_R100 << QStringLiteral("Radeon"); 0054 QTest::newRow("R200") << Driver_R200 << QStringLiteral("R200"); 0055 QTest::newRow("R300C") << Driver_R300C << QStringLiteral("R300C"); 0056 QTest::newRow("R300G") << Driver_R300G << QStringLiteral("R300G"); 0057 QTest::newRow("R600C") << Driver_R600C << QStringLiteral("R600C"); 0058 QTest::newRow("R600G") << Driver_R600G << QStringLiteral("R600G"); 0059 QTest::newRow("RadeonSI") << Driver_RadeonSI << QStringLiteral("RadeonSI"); 0060 QTest::newRow("Nouveau") << Driver_Nouveau << QStringLiteral("Nouveau"); 0061 QTest::newRow("Intel") << Driver_Intel << QStringLiteral("Intel"); 0062 QTest::newRow("NVidia") << Driver_NVidia << QStringLiteral("NVIDIA"); 0063 QTest::newRow("Catalyst") << Driver_Catalyst << QStringLiteral("Catalyst"); 0064 QTest::newRow("Swrast") << Driver_Swrast << QStringLiteral("Software rasterizer"); 0065 QTest::newRow("Softpipe") << Driver_Softpipe << QStringLiteral("softpipe"); 0066 QTest::newRow("Llvmpipe") << Driver_Llvmpipe << QStringLiteral("LLVMpipe"); 0067 QTest::newRow("VirtualBox") << Driver_VirtualBox << QStringLiteral("VirtualBox (Chromium)"); 0068 QTest::newRow("VMware") << Driver_VMware << QStringLiteral("VMware (SVGA3D)"); 0069 QTest::newRow("Qualcomm") << Driver_Qualcomm << QStringLiteral("Qualcomm"); 0070 QTest::newRow("Virgl") << Driver_Virgl << QStringLiteral("Virgl (virtio-gpu, Qemu/KVM guest)"); 0071 QTest::newRow("Panfrost") << Driver_Panfrost << QStringLiteral("Panfrost"); 0072 QTest::newRow("Lima") << Driver_Lima << QStringLiteral("Mali (Lima)"); 0073 QTest::newRow("VC4") << Driver_VC4 << QStringLiteral("VideoCore IV"); 0074 QTest::newRow("V3D") << Driver_V3D << QStringLiteral("VideoCore 3D"); 0075 QTest::newRow("Unknown") << Driver_Unknown << QStringLiteral("Unknown"); 0076 } 0077 0078 void GLPlatformTest::testDriverToString() 0079 { 0080 QFETCH(Driver, driver); 0081 QTEST(GLPlatform::driverToString(driver), "expected"); 0082 } 0083 0084 void GLPlatformTest::testChipClassToString_data() 0085 { 0086 QTest::addColumn<ChipClass>("chipClass"); 0087 QTest::addColumn<QString>("expected"); 0088 0089 QTest::newRow("R100") << R100 << QStringLiteral("R100"); 0090 QTest::newRow("R200") << R200 << QStringLiteral("R200"); 0091 QTest::newRow("R300") << R300 << QStringLiteral("R300"); 0092 QTest::newRow("R400") << R400 << QStringLiteral("R400"); 0093 QTest::newRow("R500") << R500 << QStringLiteral("R500"); 0094 QTest::newRow("R600") << R600 << QStringLiteral("R600"); 0095 QTest::newRow("R700") << R700 << QStringLiteral("R700"); 0096 QTest::newRow("Evergreen") << Evergreen << QStringLiteral("EVERGREEN"); 0097 QTest::newRow("NorthernIslands") << NorthernIslands << QStringLiteral("Northern Islands"); 0098 QTest::newRow("SouthernIslands") << SouthernIslands << QStringLiteral("Southern Islands"); 0099 QTest::newRow("SeaIslands") << SeaIslands << QStringLiteral("Sea Islands"); 0100 QTest::newRow("VolcanicIslands") << VolcanicIslands << QStringLiteral("Volcanic Islands"); 0101 QTest::newRow("Arctic Islands") << ArcticIslands << QStringLiteral("Arctic Islands"); 0102 QTest::newRow("Vega") << Vega << QStringLiteral("Vega"); 0103 QTest::newRow("UnknownRadeon") << UnknownRadeon << QStringLiteral("Unknown"); 0104 QTest::newRow("NV10") << NV10 << QStringLiteral("NV10"); 0105 QTest::newRow("NV20") << NV20 << QStringLiteral("NV20"); 0106 QTest::newRow("NV30") << NV30 << QStringLiteral("NV30"); 0107 QTest::newRow("NV40") << NV40 << QStringLiteral("NV40/G70"); 0108 QTest::newRow("G80") << G80 << QStringLiteral("G80/G90"); 0109 QTest::newRow("GF100") << GF100 << QStringLiteral("GF100"); 0110 QTest::newRow("UnknownNVidia") << UnknownNVidia << QStringLiteral("Unknown"); 0111 QTest::newRow("I8XX") << I8XX << QStringLiteral("i830/i835"); 0112 QTest::newRow("I915") << I915 << QStringLiteral("i915/i945"); 0113 QTest::newRow("I965") << I965 << QStringLiteral("i965"); 0114 QTest::newRow("SandyBridge") << SandyBridge << QStringLiteral("SandyBridge"); 0115 QTest::newRow("IvyBridge") << IvyBridge << QStringLiteral("IvyBridge"); 0116 QTest::newRow("Haswell") << Haswell << QStringLiteral("Haswell"); 0117 QTest::newRow("UnknownIntel") << UnknownIntel << QStringLiteral("Unknown"); 0118 QTest::newRow("Adreno1XX") << Adreno1XX << QStringLiteral("Adreno 1xx series"); 0119 QTest::newRow("Adreno2XX") << Adreno2XX << QStringLiteral("Adreno 2xx series"); 0120 QTest::newRow("Adreno3XX") << Adreno3XX << QStringLiteral("Adreno 3xx series"); 0121 QTest::newRow("Adreno4XX") << Adreno4XX << QStringLiteral("Adreno 4xx series"); 0122 QTest::newRow("Adreno5XX") << Adreno5XX << QStringLiteral("Adreno 5xx series"); 0123 QTest::newRow("UnknownAdreno") << UnknownAdreno << QStringLiteral("Unknown"); 0124 QTest::newRow("MaliT7XX") << MaliT7XX << QStringLiteral("Mali T7xx series"); 0125 QTest::newRow("MaliT8XX") << MaliT8XX << QStringLiteral("Mali T8xx series"); 0126 QTest::newRow("MaliGXX") << MaliGXX << QStringLiteral("Mali Gxx series"); 0127 QTest::newRow("UnknownPanfrost") << UnknownPanfrost << QStringLiteral("Unknown"); 0128 QTest::newRow("Mali400") << Mali400 << QStringLiteral("Mali 400 series"); 0129 QTest::newRow("Mali450") << Mali450 << QStringLiteral("Mali 450 series"); 0130 QTest::newRow("Mali470") << Mali470 << QStringLiteral("Mali 470 series"); 0131 QTest::newRow("UnknownLima") << UnknownLima << QStringLiteral("Unknown"); 0132 QTest::newRow("VC4_2_1") << VC4_2_1 << QStringLiteral("VideoCore IV"); 0133 QTest::newRow("UnknownVideoCore4") << UnknownVideoCore4 << QStringLiteral("Unknown"); 0134 QTest::newRow("V3D_4_2") << V3D_4_2 << QStringLiteral("VideoCore 3D"); 0135 QTest::newRow("UnknownVideoCore3D") << UnknownVideoCore3D << QStringLiteral("Unknown"); 0136 QTest::newRow("UnknownChipClass") << UnknownChipClass << QStringLiteral("Unknown"); 0137 } 0138 0139 void GLPlatformTest::testChipClassToString() 0140 { 0141 QFETCH(ChipClass, chipClass); 0142 QTEST(GLPlatform::chipClassToString(chipClass), "expected"); 0143 } 0144 0145 void GLPlatformTest::testPriorDetect() 0146 { 0147 auto *gl = GLPlatform::instance(); 0148 QVERIFY(gl); 0149 QCOMPARE(gl->supports(LooseBinding), false); 0150 QCOMPARE(gl->supports(GLSL), false); 0151 QCOMPARE(gl->supports(LimitedGLSL), false); 0152 QCOMPARE(gl->supports(TextureNPOT), false); 0153 QCOMPARE(gl->supports(LimitedNPOT), false); 0154 0155 QCOMPARE(gl->glVersion(), 0); 0156 QCOMPARE(gl->glslVersion(), 0); 0157 QCOMPARE(gl->mesaVersion(), 0); 0158 QCOMPARE(gl->galliumVersion(), 0); 0159 QCOMPARE(gl->serverVersion(), 0); 0160 QCOMPARE(gl->kernelVersion(), 0); 0161 QCOMPARE(gl->driverVersion(), 0); 0162 0163 QCOMPARE(gl->driver(), Driver_Unknown); 0164 QCOMPARE(gl->chipClass(), UnknownChipClass); 0165 0166 QCOMPARE(gl->isMesaDriver(), false); 0167 QCOMPARE(gl->isGalliumDriver(), false); 0168 QCOMPARE(gl->isRadeon(), false); 0169 QCOMPARE(gl->isNvidia(), false); 0170 QCOMPARE(gl->isIntel(), false); 0171 QCOMPARE(gl->isPanfrost(), false); 0172 QCOMPARE(gl->isLima(), false); 0173 QCOMPARE(gl->isVideoCore4(), false); 0174 QCOMPARE(gl->isVideoCore3D(), false); 0175 0176 QCOMPARE(gl->isVirtualBox(), false); 0177 QCOMPARE(gl->isVMware(), false); 0178 0179 QCOMPARE(gl->isSoftwareEmulation(), false); 0180 QCOMPARE(gl->isVirtualMachine(), false); 0181 0182 QCOMPARE(gl->glVersionString(), QByteArray()); 0183 QCOMPARE(gl->glRendererString(), QByteArray()); 0184 QCOMPARE(gl->glVendorString(), QByteArray()); 0185 QCOMPARE(gl->glShadingLanguageVersionString(), QByteArray()); 0186 0187 QCOMPARE(gl->isLooseBinding(), false); 0188 QCOMPARE(gl->isGLES(), false); 0189 QCOMPARE(gl->recommendedCompositor(), QPainterCompositing); 0190 QCOMPARE(gl->preferBufferSubData(), false); 0191 QCOMPARE(gl->platformInterface(), NoOpenGLPlatformInterface); 0192 } 0193 0194 void GLPlatformTest::testDetect_data() 0195 { 0196 QTest::addColumn<QString>("configFile"); 0197 0198 QDir dir(QFINDTESTDATA("data/glplatform")); 0199 const QStringList entries = dir.entryList(QDir::NoDotAndDotDot | QDir::Files); 0200 0201 for (const QString &file : entries) { 0202 QTest::newRow(file.toUtf8().constData()) << dir.absoluteFilePath(file); 0203 } 0204 } 0205 0206 static qint64 readVersion(const KConfigGroup &group, const char *entry) 0207 { 0208 const QStringList parts = group.readEntry(entry, QString()).split(','); 0209 if (parts.count() < 2) { 0210 return 0; 0211 } 0212 QVector<qint64> versionParts; 0213 for (int i = 0; i < parts.count(); ++i) { 0214 bool ok = false; 0215 const auto value = parts.at(i).toLongLong(&ok); 0216 if (ok) { 0217 versionParts << value; 0218 } else { 0219 versionParts << 0; 0220 } 0221 } 0222 while (versionParts.count() < 3) { 0223 versionParts << 0; 0224 } 0225 return kVersionNumber(versionParts.at(0), versionParts.at(1), versionParts.at(2)); 0226 } 0227 0228 void GLPlatformTest::testDetect() 0229 { 0230 QFETCH(QString, configFile); 0231 KConfig config(configFile); 0232 const KConfigGroup driverGroup = config.group("Driver"); 0233 s_gl = new MockGL; 0234 s_gl->getString.vendor = driverGroup.readEntry("Vendor").toUtf8(); 0235 s_gl->getString.renderer = driverGroup.readEntry("Renderer").toUtf8(); 0236 s_gl->getString.version = driverGroup.readEntry("Version").toUtf8(); 0237 s_gl->getString.shadingLanguageVersion = driverGroup.readEntry("ShadingLanguageVersion").toUtf8(); 0238 s_gl->getString.extensions = QVector<QByteArray>{QByteArrayLiteral("GL_ARB_shader_objects"), 0239 QByteArrayLiteral("GL_ARB_fragment_shader"), 0240 QByteArrayLiteral("GL_ARB_vertex_shader"), 0241 QByteArrayLiteral("GL_ARB_texture_non_power_of_two")}; 0242 s_gl->getString.extensionsString = QByteArray(); 0243 0244 auto *gl = GLPlatform::instance(); 0245 QVERIFY(gl); 0246 gl->detect(EglPlatformInterface); 0247 QCOMPARE(gl->platformInterface(), EglPlatformInterface); 0248 0249 const KConfigGroup settingsGroup = config.group("Settings"); 0250 0251 QCOMPARE(gl->supports(LooseBinding), settingsGroup.readEntry("LooseBinding", false)); 0252 QCOMPARE(gl->supports(GLSL), settingsGroup.readEntry("GLSL", false)); 0253 QCOMPARE(gl->supports(LimitedGLSL), settingsGroup.readEntry("LimitedGLSL", false)); 0254 QCOMPARE(gl->supports(TextureNPOT), settingsGroup.readEntry("TextureNPOT", false)); 0255 QCOMPARE(gl->supports(LimitedNPOT), settingsGroup.readEntry("LimitedNPOT", false)); 0256 0257 QCOMPARE(gl->glVersion(), readVersion(settingsGroup, "GLVersion")); 0258 QCOMPARE(gl->glslVersion(), readVersion(settingsGroup, "GLSLVersion")); 0259 QCOMPARE(gl->mesaVersion(), readVersion(settingsGroup, "MesaVersion")); 0260 QCOMPARE(gl->galliumVersion(), readVersion(settingsGroup, "GalliumVersion")); 0261 QCOMPARE(gl->serverVersion(), 0); 0262 QEXPECT_FAIL("amd-catalyst-radeonhd-7700M-3.1.13399", "Detects GL version instead of driver version", Continue); 0263 QCOMPARE(gl->driverVersion(), readVersion(settingsGroup, "DriverVersion")); 0264 0265 QCOMPARE(gl->driver(), Driver(settingsGroup.readEntry("Driver", int(Driver_Unknown)))); 0266 QCOMPARE(gl->chipClass(), ChipClass(settingsGroup.readEntry("ChipClass", int(UnknownChipClass)))); 0267 0268 QCOMPARE(gl->isMesaDriver(), settingsGroup.readEntry("Mesa", false)); 0269 QCOMPARE(gl->isGalliumDriver(), settingsGroup.readEntry("Gallium", false)); 0270 QCOMPARE(gl->isRadeon(), settingsGroup.readEntry("Radeon", false)); 0271 QCOMPARE(gl->isNvidia(), settingsGroup.readEntry("Nvidia", false)); 0272 QCOMPARE(gl->isIntel(), settingsGroup.readEntry("Intel", false)); 0273 QCOMPARE(gl->isVirtualBox(), settingsGroup.readEntry("VirtualBox", false)); 0274 QCOMPARE(gl->isVMware(), settingsGroup.readEntry("VMware", false)); 0275 QCOMPARE(gl->isAdreno(), settingsGroup.readEntry("Adreno", false)); 0276 QCOMPARE(gl->isPanfrost(), settingsGroup.readEntry("Panfrost", false)); 0277 QCOMPARE(gl->isLima(), settingsGroup.readEntry("Lima", false)); 0278 QCOMPARE(gl->isVideoCore4(), settingsGroup.readEntry("VC4", false)); 0279 QCOMPARE(gl->isVideoCore3D(), settingsGroup.readEntry("V3D", false)); 0280 QCOMPARE(gl->isVirgl(), settingsGroup.readEntry("Virgl", false)); 0281 0282 QCOMPARE(gl->isSoftwareEmulation(), settingsGroup.readEntry("SoftwareEmulation", false)); 0283 QCOMPARE(gl->isVirtualMachine(), settingsGroup.readEntry("VirtualMachine", false)); 0284 0285 QCOMPARE(gl->glVersionString(), s_gl->getString.version); 0286 QCOMPARE(gl->glRendererString(), s_gl->getString.renderer); 0287 QCOMPARE(gl->glVendorString(), s_gl->getString.vendor); 0288 QCOMPARE(gl->glShadingLanguageVersionString(), s_gl->getString.shadingLanguageVersion); 0289 0290 QCOMPARE(gl->isLooseBinding(), settingsGroup.readEntry("LooseBinding", false)); 0291 QCOMPARE(gl->isGLES(), settingsGroup.readEntry("GLES", false)); 0292 QCOMPARE(gl->recommendedCompositor(), CompositingType(settingsGroup.readEntry("Compositor", int(NoCompositing)))); 0293 QCOMPARE(gl->preferBufferSubData(), settingsGroup.readEntry("PreferBufferSubData", false)); 0294 } 0295 0296 QTEST_GUILESS_MAIN(GLPlatformTest) 0297 #include "kwinglplatformtest.moc"