Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOpenGL Class Reference

#include <kis_opengl.h>

Classes

struct  RendererConfig
 

Public Types

enum  AngleRenderer { AngleRendererDefault = 0x0000 , AngleRendererD3d11 = 0x0002 , AngleRendererD3d9 = 0x0004 , AngleRendererD3d11Warp = 0x0008 }
 
enum  FilterMode { NearestFilterMode , BilinearFilterMode , TrilinearFilterMode , HighQualityFiltering }
 
enum  OpenGLRenderer {
  RendererNone = 0x00 , RendererAuto = 0x01 , RendererDesktopGL = 0x02 , RendererOpenGLES = 0x04 ,
  RendererSoftware = 0x08
}
 

Static Public Member Functions

static OpenGLRenderer convertConfigToOpenGLRenderer (QString renderer)
 
static QString convertOpenGLRendererToConfig (OpenGLRenderer renderer)
 
static QString currentDriver ()
 
static bool forceDisableTextureBuffers ()
 
static OpenGLRenderer getCurrentOpenGLRenderer ()
 
static const QString & getDebugText ()
 
static QStringList getOpenGLWarnings ()
 
static OpenGLRenderer getQtPreferredOpenGLRenderer ()
 
static OpenGLRenderers getSupportedOpenGLRenderers ()
 
static OpenGLRenderer getUserPreferredOpenGLRendererConfig ()
 
static void glInvalidateBufferData (uint buffer)
 
static bool hasOpenGL ()
 Check for OpenGL.
 
static bool hasOpenGL3 ()
 
static bool hasOpenGLES ()
 
static void initialize ()
 Request OpenGL version 3.2.
 
static void initializeContext (QOpenGLContext *ctx)
 Initialize shared OpenGL context.
 
static bool needsFenceWorkaround ()
 
static RendererConfig selectSurfaceConfig (KisOpenGL::OpenGLRenderer preferredRenderer, KisConfig::RootSurfaceFormat preferredRootSurfaceFormat, KisConfig::CanvasSurfaceBitDepthMode preferredCanvasSurfaceBitMode, bool enableDebug)
 
static void setDebugSynchronous (bool value)
 
static void setDefaultSurfaceConfig (const RendererConfig &config)
 
static void setUserPreferredOpenGLRendererConfig (OpenGLRenderer renderer)
 
static bool shouldUseTextureBuffers (bool userPreference)
 
static bool supportsBufferMapping ()
 
static bool supportsFenceSync ()
 supportsFilter
 
static bool supportsLoD ()
 
static bool supportsVAO ()
 
static void testingInitializeDefaultSurfaceFormat ()
 
static bool useFBOForToolOutlineRendering ()
 supportsRenderToFBO
 
static bool useTextureBufferInvalidation ()
 

Private Member Functions

 KisOpenGL ()
 

Static Private Member Functions

static void fakeInitWindowsOpenGL (KisOpenGL::OpenGLRenderers supportedRenderers, KisOpenGL::OpenGLRenderer preferredByQt)
 

Detailed Description

This class manages a shared OpenGL context and provides utility functions for checking capabilities and error reporting.

Definition at line 30 of file kis_opengl.h.

Member Enumeration Documentation

◆ AngleRenderer

Enumerator
AngleRendererDefault 
AngleRendererD3d11 
AngleRendererD3d9 
AngleRendererD3d11Warp 

Definition at line 49 of file kis_opengl.h.

49 {
50 AngleRendererDefault = 0x0000,
51 AngleRendererD3d11 = 0x0002,
52 AngleRendererD3d9 = 0x0004,
53 AngleRendererD3d11Warp = 0x0008, // "Windows Advanced Rasterization Platform"
54 };
@ AngleRendererD3d11Warp
Definition kis_opengl.h:53
@ AngleRendererD3d11
Definition kis_opengl.h:51
@ AngleRendererD3d9
Definition kis_opengl.h:52
@ AngleRendererDefault
Definition kis_opengl.h:50

◆ FilterMode

Enumerator
NearestFilterMode 
BilinearFilterMode 
TrilinearFilterMode 
HighQualityFiltering 

Definition at line 33 of file kis_opengl.h.

33 {
34 NearestFilterMode, // nearest
35 BilinearFilterMode, // linear, no mipmap
36 TrilinearFilterMode, // LINEAR_MIPMAP_LINEAR
37 HighQualityFiltering // Mipmaps + custom shader
38 };
@ NearestFilterMode
Definition kis_opengl.h:34
@ HighQualityFiltering
Definition kis_opengl.h:37
@ BilinearFilterMode
Definition kis_opengl.h:35
@ TrilinearFilterMode
Definition kis_opengl.h:36

◆ OpenGLRenderer

Enumerator
RendererNone 
RendererAuto 
RendererDesktopGL 
RendererOpenGLES 
RendererSoftware 

Definition at line 40 of file kis_opengl.h.

40 {
41 RendererNone = 0x00,
42 RendererAuto = 0x01,
43 RendererDesktopGL = 0x02,
44 RendererOpenGLES = 0x04,
45 RendererSoftware = 0x08
46 };
@ RendererSoftware
Definition kis_opengl.h:45
@ RendererDesktopGL
Definition kis_opengl.h:43
@ RendererOpenGLES
Definition kis_opengl.h:44

Constructor & Destructor Documentation

◆ KisOpenGL()

KisOpenGL::KisOpenGL ( )
private

Member Function Documentation

◆ convertConfigToOpenGLRenderer()

KisOpenGL::OpenGLRenderer KisOpenGL::convertConfigToOpenGLRenderer ( QString renderer)
static

Definition at line 468 of file kis_opengl.cpp.

469{
470 if (renderer == "desktop") {
471 return RendererDesktopGL;
472 } else if (renderer == "angle") {
473 return RendererOpenGLES;
474 } else if (renderer == "software") {
475 return RendererSoftware;
476 } else if (renderer == "none") {
477 return RendererNone;
478 } else {
479 return RendererAuto;
480 }
481}

References RendererAuto, RendererDesktopGL, RendererNone, RendererOpenGLES, and RendererSoftware.

◆ convertOpenGLRendererToConfig()

QString KisOpenGL::convertOpenGLRendererToConfig ( KisOpenGL::OpenGLRenderer renderer)
static

Definition at line 452 of file kis_opengl.cpp.

453{
454 switch (renderer) {
455 case RendererNone:
456 return QStringLiteral("none");
457 case RendererSoftware:
458 return QStringLiteral("software");
460 return QStringLiteral("desktop");
461 case RendererOpenGLES:
462 return QStringLiteral("angle");
463 default:
464 return QStringLiteral("auto");
465 }
466}

References RendererDesktopGL, RendererNone, RendererOpenGLES, and RendererSoftware.

◆ currentDriver()

QString KisOpenGL::currentDriver ( )
static

Definition at line 329 of file kis_opengl.cpp.

330{
331 initialize();
332 if (openGLCheckResult) {
333 return openGLCheckResult->driverVersionString();
334 }
335 return QString();
336}
static void initialize()
Request OpenGL version 3.2.

References initialize().

◆ fakeInitWindowsOpenGL()

static void KisOpenGL::fakeInitWindowsOpenGL ( KisOpenGL::OpenGLRenderers supportedRenderers,
KisOpenGL::OpenGLRenderer preferredByQt )
staticprivate

◆ forceDisableTextureBuffers()

bool KisOpenGL::forceDisableTextureBuffers ( )
static

Definition at line 376 of file kis_opengl.cpp.

377{
378 initialize();
379 return g_forceDisableTextureBuffers;
380}

References initialize().

◆ getCurrentOpenGLRenderer()

KisOpenGL::OpenGLRenderer KisOpenGL::getCurrentOpenGLRenderer ( )
static

Definition at line 422 of file kis_opengl.cpp.

423{
424 if (!openGLCheckResult) return RendererAuto;
425 return getRendererFromProbeResult(*openGLCheckResult);
426}

References RendererAuto.

◆ getDebugText()

const QString & KisOpenGL::getDebugText ( )
static

Definition at line 315 of file kis_opengl.cpp.

316{
317 initialize();
318 return g_debugText;
319}

References initialize().

◆ getOpenGLWarnings()

QStringList KisOpenGL::getOpenGLWarnings ( )
static

Definition at line 321 of file kis_opengl.cpp.

321 {
322 QStringList strings;
323 Q_FOREACH (const KLocalizedString &item, g_openglWarningStrings) {
324 strings << item.toString();
325 }
326 return strings;
327}

◆ getQtPreferredOpenGLRenderer()

KisOpenGL::OpenGLRenderer KisOpenGL::getQtPreferredOpenGLRenderer ( )
static

Definition at line 428 of file kis_opengl.cpp.

429{
430 return g_rendererPreferredByQt;
431}

◆ getSupportedOpenGLRenderers()

KisOpenGL::OpenGLRenderers KisOpenGL::getSupportedOpenGLRenderers ( )
static

Definition at line 433 of file kis_opengl.cpp.

434{
435 return g_supportedRenderers;
436}

◆ getUserPreferredOpenGLRendererConfig()

KisOpenGL::OpenGLRenderer KisOpenGL::getUserPreferredOpenGLRendererConfig ( )
static

Definition at line 438 of file kis_opengl.cpp.

439{
440 const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
441 QSettings kritarc(configPath + QStringLiteral("/kritadisplayrc"), QSettings::IniFormat);
442 return convertConfigToOpenGLRenderer(kritarc.value("OpenGLRenderer", "auto").toString());
443}
static OpenGLRenderer convertConfigToOpenGLRenderer(QString renderer)

References convertConfigToOpenGLRenderer().

◆ glInvalidateBufferData()

void KisOpenGL::glInvalidateBufferData ( uint buffer)
static

Definition at line 417 of file kis_opengl.cpp.

418{
419 g_glInvalidateBufferData(buffer);
420}

◆ hasOpenGL()

bool KisOpenGL::hasOpenGL ( )
static

Check for OpenGL.

Definition at line 1134 of file kis_opengl.cpp.

1135{
1136 return openGLCheckResult->isSupportedVersion();
1137}

◆ hasOpenGL3()

bool KisOpenGL::hasOpenGL3 ( )
static

Definition at line 346 of file kis_opengl.cpp.

347{
348 initialize();
349 return openGLCheckResult && openGLCheckResult->hasOpenGL3();
350}

References initialize().

◆ hasOpenGLES()

bool KisOpenGL::hasOpenGLES ( )
static

Definition at line 358 of file kis_opengl.cpp.

359{
360 initialize();
361 return openGLCheckResult && openGLCheckResult->isOpenGLES();
362}

References initialize().

◆ initialize()

void KisOpenGL::initialize ( )
static

Request OpenGL version 3.2.

The large pixmap cache workaround was originally added to fix the bug 361709 and later extended to all GPU/OS configurations. This setting is still left here in case anyone finds the cached method performing better that the direct drawing of assistants onto the canvas.

See bugs: https://bugs.kde.org/show_bug.cgi?id=361709 https://bugs.kde.org/show_bug.cgi?id=401940

Definition at line 128 of file kis_opengl.cpp.

129{
130 if (openGLCheckResult) return;
131
132 KIS_SAFE_ASSERT_RECOVER_NOOP(g_sanityDefaultFormatIsSet);
133
135 config.format = QSurfaceFormat::defaultFormat();
136
137 openGLCheckResult =
139
140#ifdef Q_OS_WIN
141
142 if (!qEnvironmentVariableIsSet("KRITA_UNLOCK_TEXTURE_BUFFERS") &&
143 openGLCheckResult->rendererString().toUpper().contains("ANGLE")) {
144
145 // Angle should always be openGLES...
147
159 g_forceDisableTextureBuffers = true;
160 appendOpenGLWarningString(
161 ki18n("Texture buffers are explicitly disabled on ANGLE renderer due "
162 "to performance issues."));
163 }
164#endif
165
166
167 g_debugText.clear();
168 QDebug debugOut(&g_debugText);
169 debugOut << "OpenGL Info\n";
170
171 if (openGLCheckResult) {
172 debugOut << "\n Qt Platform Name: " << QGuiApplication::platformName();
173 debugOut << "\n Vendor: " << openGLCheckResult->vendorString();
174 debugOut << "\n Renderer: " << openGLCheckResult->rendererString();
175 debugOut << "\n Driver version: " << openGLCheckResult->driverVersionString();
176 debugOut << "\n Shading language: " << openGLCheckResult->shadingLanguageString();
177 debugOut << "\n Requested format: " << QSurfaceFormat::defaultFormat();
178 debugOut << "\n Current format: " << openGLCheckResult->format();
179 {
180 QDebugStateSaver saver(debugOut);
181 debugOut.nospace() << "\n GL version: " << openGLCheckResult->glMajorVersion() << "."
182 << openGLCheckResult->glMinorVersion();
183 }
184 debugOut << "\n Supports deprecated functions" << openGLCheckResult->supportsDeprecatedFunctions();
185 debugOut << "\n Is OpenGL ES:" << openGLCheckResult->isOpenGLES();
186 debugOut << "\n supportsBufferMapping:" << openGLCheckResult->supportsBufferMapping();
187 debugOut << "\n supportsBufferInvalidation:" << openGLCheckResult->supportsBufferInvalidation();
188 debugOut << "\n forceDisableTextureBuffers:" << g_forceDisableTextureBuffers;
189 debugOut << "\n Extensions:";
190 {
191 QDebugStateSaver saver(debugOut);
192 Q_FOREACH (const QByteArray &i, openGLCheckResult->extensions()) {
193 debugOut.noquote() << "\n " << QString::fromLatin1(i);
194 }
195 }
196 }
197
198 debugOut << "\n\nQPA OpenGL Detection Info";
199 debugOut << "\n supportsDesktopGL:" << bool(g_supportedRenderers & RendererDesktopGL);
200#ifdef Q_OS_WIN
201 debugOut << "\n supportsAngleD3D11:" << bool(g_supportedRenderers & RendererOpenGLES);
202 debugOut << "\n isQtPreferAngle:" << bool(g_rendererPreferredByQt == RendererOpenGLES);
203#else
204 debugOut << "\n supportsOpenGLES:" << bool(g_supportedRenderers & RendererOpenGLES);
205 debugOut << "\n isQtPreferOpenGLES:" << bool(g_rendererPreferredByQt == RendererOpenGLES);
206#endif
207 debugOut << "\n Detected renderers:";
208 {
209 QDebugStateSaver saver(debugOut);
210 Q_FOREACH (const DetectedRenderer &x, g_detectedRenderers) {
211 debugOut.noquote().nospace() << "\n " << (std::get<2>(x) ? "(Supported)" : "(Unsupported)") << " "
212 << std::get<0>(x) << " (" << std::get<1>(x) << ") ";
213 }
214 }
215
216// debugOut << "\n== log ==\n";
217// debugOut.noquote();
218// debugOut << g_surfaceFormatDetectionLog;
219// debugOut.resetFormat();
220// debugOut << "\n== end log ==";
221
222 dbgOpenGL.noquote().nospace() << g_debugText;
223 KisUsageLogger::writeSysInfo(g_debugText);
224
225 if (!openGLCheckResult) {
226 return;
227 }
228
229
230 // Check if we have a bugged driver that needs fence workaround
231 bool isOnX11 = false;
232#ifdef HAVE_X11
233 isOnX11 = true;
234#endif
235
236 KisConfig cfg(true);
237
238 g_useBufferInvalidation = cfg.readEntry("useBufferInvalidation", false);
239 KisUsageLogger::writeSysInfo(QString("\nuseBufferInvalidation (config option): %1\n").arg(g_useBufferInvalidation ? "true" : "false"));
240
241 if ((isOnX11 && openGLCheckResult->rendererString().startsWith("AMD")) || cfg.forceOpenGLFenceWorkaround()) {
242 g_needsFenceWorkaround = true;
243 }
244
257 if (cfg.assistantsDrawMode() == KisConfig::ASSISTANTS_DRAW_MODE_LARGE_PIXMAP_CACHE) {
258 const qreal devicePixelRatio = QGuiApplication::primaryScreen()->devicePixelRatio();
259 const QSize screenSize = QGuiApplication::primaryScreen()->size() * devicePixelRatio;
260 const int minCacheSize = 20 * 1024;
261
262 // reserve space for at least 4 textures
263 const int cacheSize = 2048 + 5 * 4 * screenSize.width() * screenSize.height() / 1024; // KiB
264
265 QPixmapCache::setCacheLimit(qMax(minCacheSize, cacheSize));
266 }
267}
@ ASSISTANTS_DRAW_MODE_LARGE_PIXMAP_CACHE
Definition kis_config.h:770
static KisOpenGLModeProber * instance()
boost::optional< Result > probeFormat(const KisOpenGL::RendererConfig &rendererConfig, bool adjustGlobalState=true)
static bool hasOpenGLES()
static void writeSysInfo(const QString &message)
Writes to the system information file and Krita log.
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define dbgOpenGL
Definition kis_debug.h:60
QSurfaceFormat format
Definition kis_opengl.h:57

References KisConfig::ASSISTANTS_DRAW_MODE_LARGE_PIXMAP_CACHE, KisConfig::assistantsDrawMode(), dbgOpenGL, KisConfig::forceOpenGLFenceWorkaround(), KisOpenGL::RendererConfig::format, hasOpenGLES(), KisOpenGLModeProber::instance(), KIS_SAFE_ASSERT_RECOVER_NOOP, KisOpenGLModeProber::probeFormat(), KisConfig::readEntry(), RendererDesktopGL, RendererOpenGLES, and KisUsageLogger::writeSysInfo().

◆ initializeContext()

void KisOpenGL::initializeContext ( QOpenGLContext * ctx)
static

Initialize shared OpenGL context.

Definition at line 269 of file kis_opengl.cpp.

270{
271 KisConfig cfg(true);
272 initialize();
273
274 const bool isDebugEnabled = ctx->format().testOption(QSurfaceFormat::DebugContext);
275
276 dbgUI << "OpenGL: Opening new context";
277 if (isDebugEnabled) {
278 // Passing ctx for ownership management only, not specifying context.
279 // QOpenGLDebugLogger only function on the current active context.
280 // FIXME: Do we need to make sure ctx is the active context?
281 QOpenGLDebugLogger* openglLogger = new QOpenGLDebugLogger(ctx);
282 if (openglLogger->initialize()) {
283 qDebug() << "QOpenGLDebugLogger is initialized. Check whether you get a message below.";
284 QObject::connect(openglLogger, &QOpenGLDebugLogger::messageLogged, &openglOnMessageLogged);
285 openglLogger->startLogging(g_isDebugSynchronous ? QOpenGLDebugLogger::SynchronousLogging : QOpenGLDebugLogger::AsynchronousLogging);
286 openglLogger->logMessage(QOpenGLDebugMessage::createApplicationMessage(QStringLiteral("QOpenGLDebugLogger is logging.")));
287 } else {
288 qDebug() << "QOpenGLDebugLogger cannot be initialized.";
289 delete openglLogger;
290 }
291 }
292
293 // Double check we were given the version we requested
294 QSurfaceFormat format = ctx->format();
295 QOpenGLFunctions *f = ctx->functions();
296 f->initializeOpenGLFunctions();
297
298 if (openGLCheckResult->supportsBufferInvalidation()) {
299 QOpenGLContext *ctx = QOpenGLContext::currentContext();
300 g_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)ctx->getProcAddress("glInvalidateBufferData");
301 }
302
303 QFile log(QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/krita-opengl.txt");
304 log.open(QFile::WriteOnly);
305 QString vendor((const char*)f->glGetString(GL_VENDOR));
306 log.write(vendor.toLatin1());
307 log.write(", ");
308 log.write(openGLCheckResult->rendererString().toLatin1());
309 log.write(", ");
310 QString version((const char*)f->glGetString(GL_VERSION));
311 log.write(version.toLatin1());
312 log.close();
313}
#define dbgUI
Definition kis_debug.h:52

References dbgUI, and initialize().

◆ needsFenceWorkaround()

bool KisOpenGL::needsFenceWorkaround ( )
static

Returns true if we have a driver that has bugged support to sync objects (a fence) and false otherwise.

Definition at line 401 of file kis_opengl.cpp.

402{
403 initialize();
404 return g_needsFenceWorkaround;
405}

References initialize().

◆ selectSurfaceConfig()

KisOpenGL::RendererConfig KisOpenGL::selectSurfaceConfig ( KisOpenGL::OpenGLRenderer preferredRenderer,
KisConfig::RootSurfaceFormat preferredRootSurfaceFormat,
KisConfig::CanvasSurfaceBitDepthMode preferredCanvasSurfaceBitMode,
bool enableDebug )
static

On Windows we always prefer Angle, not what Qt suggests us

Definition at line 881 of file kis_opengl.cpp.

885{
886 QVector<KLocalizedString> warningMessages;
887
888 using Info = boost::optional<KisOpenGLModeProber::Result>;
889
890 QHash<OpenGLRenderer, Info> renderersToTest;
891#ifndef Q_OS_ANDROID
892 renderersToTest.insert(RendererDesktopGL, Info());
893#endif
894 renderersToTest.insert(RendererOpenGLES, Info());
895
896#ifdef Q_OS_WIN
897 renderersToTest.insert(RendererSoftware, Info());
898#endif
899
900 auto makeDefaultSurfaceFormatPair = [] () -> std::pair<KisSurfaceColorSpaceWrapper, int> {
902 };
903
904#if defined HAVE_HDR
905 std::vector<std::pair<KisSurfaceColorSpaceWrapper, int>> formatSymbolPairs(
906 {
907 // TODO: check if we can use real sRGB space here
911 });
912#elif KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
913 std::vector<std::pair<KisSurfaceColorSpaceWrapper, int>> formatSymbolPairs(
914 {
917 });
918#else
919 std::vector<std::pair<KisSurfaceColorSpaceWrapper, int>> formatSymbolPairs(
920 {
922 });
923#endif
924
925 KisOpenGL::RendererConfig defaultConfig = generateSurfaceConfig(KisOpenGL::RendererAuto,
926 makeDefaultSurfaceFormatPair(), false);
927 Info info = KisOpenGLModeProber::instance()->probeFormat(defaultConfig);
928
929#ifdef Q_OS_WIN
930 if (!info) {
931 // try software rasterizer (WARP)
932 defaultConfig = generateSurfaceConfig(KisOpenGL::RendererSoftware,
933 makeDefaultSurfaceFormatPair(), false);
934 info = KisOpenGLModeProber::instance()->probeFormat(defaultConfig);
935
936 if (!info) {
937 renderersToTest.remove(RendererSoftware);
938 }
939 }
940#endif
941
942 if (!info) return KisOpenGL::RendererConfig();
943
944 const OpenGLRenderer defaultRenderer = getRendererFromProbeResult(*info);
945
949#ifdef Q_OS_WIN
950 const OpenGLRenderer preferredAutoRenderer = RendererOpenGLES;
951#else
952 const OpenGLRenderer preferredAutoRenderer = defaultRenderer;
953#endif
954
955 OpenGLRenderers supportedRenderers = RendererNone;
956
957 FormatPositionLess compareOp;
958 compareOp.setPreferredRendererByQt(preferredAutoRenderer);
959
960#ifdef HAVE_HDR
961 compareOp.setPreferredColorSpace(
963 preferredRootSurfaceFormat == KisConfig::BT709_G10 ? KisSurfaceColorSpaceWrapper::scRGBColorSpace :
964 KisSurfaceColorSpaceWrapper::bt2020PQColorSpace);
965#else
966 Q_UNUSED(preferredRootSurfaceFormat);
967 compareOp.setPreferredColorSpace(KisSurfaceColorSpaceWrapper::sRGBColorSpace);
968#endif
969
970#ifdef Q_OS_WIN
971 compareOp.setPreferredRendererByHDR(KisOpenGL::RendererOpenGLES);
972#endif
973 compareOp.setPreferredRendererByUser(preferredRenderer);
974 compareOp.setOpenGLESBlacklisted(false); // We cannot blacklist ES drivers atm
975
976#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
977 // 10-bit is the default, 8-bit is set explicitly by the user
978 compareOp.setUserPreferredBitDepth(preferredCanvasSurfaceBitMode == KisConfig::CanvasSurfaceBitDepthMode::Depth8Bit ? 8 : 10);
979#else
980 Q_UNUSED(preferredCanvasSurfaceBitMode)
981#endif
982
983 renderersToTest[defaultRenderer] = info;
984
985 for (auto it = renderersToTest.begin(); it != renderersToTest.end(); ++it) {
986 Info info = it.value();
987
988 if (!info) {
989 const RendererConfig config = generateSurfaceConfig(it.key(), makeDefaultSurfaceFormatPair(), false);
990 dbgOpenGL << "Probing" << it.key() << "from default:" << config.format << config.angleRenderer
991 << config.rendererId();
993 *it = info;
994 } else {
995 dbgOpenGL << "Already probed:" << it.key();
996 }
997
998 compareOp.setOpenGLBlacklisted(
999 !info ||
1000 isOpenGLRendererBlacklisted(info->rendererString(),
1001 info->driverVersionString(),
1002 &warningMessages));
1003
1004 if (info) {
1005 dbgOpenGL << "Result:" << info->rendererString() << info->driverVersionString()
1006 << info->isSupportedVersion();
1007 }
1008
1009 if (info) {
1010 g_detectedRenderers << std::make_tuple(info->rendererString(),
1011 info->driverVersionString(),
1012 info->isSupportedVersion());
1013 }
1014
1015 if (info && info->isSupportedVersion()) {
1016 supportedRenderers |= it.key();
1017 }
1018 }
1019
1020 OpenGLRenderer preferredByQt = preferredAutoRenderer;
1021
1022 if (preferredByQt == RendererDesktopGL &&
1023 supportedRenderers & RendererDesktopGL &&
1024 compareOp.isOpenGLBlacklisted()) {
1025
1026 preferredByQt = RendererOpenGLES;
1027
1028 } else if (preferredByQt == RendererOpenGLES &&
1029 supportedRenderers & RendererOpenGLES &&
1030 compareOp.isOpenGLESBlacklisted()) {
1031
1032 preferredByQt = RendererDesktopGL;
1033 }
1034
1035 QVector<RendererConfig> preferredConfigs;
1036 for (auto it = renderersToTest.begin(); it != renderersToTest.end(); ++it) {
1037 // if default mode of the renderer doesn't work, then custom won't either
1038 if (!it.value()) continue;
1039
1040 Q_FOREACH (const auto &formatPair, formatSymbolPairs) {
1041 preferredConfigs << generateSurfaceConfig(it.key(), formatPair, enableDebug);
1042 }
1043 }
1044
1045 std::stable_sort(preferredConfigs.begin(), preferredConfigs.end(), compareOp);
1046
1047 dbgDetection() << "Supported renderers:" << supportedRenderers;
1048
1049 dbgDetection() << "Surface format preference list:";
1050 Q_FOREACH (const KisOpenGL::RendererConfig &config, preferredConfigs) {
1051 dbgDetection() << "*" << config.format;
1052 dbgDetection() << " " << config.rendererId();
1053 }
1054
1055 KisOpenGL::RendererConfig resultConfig = defaultConfig;
1056
1057 if (preferredRenderer != RendererNone) {
1058 Q_FOREACH (const KisOpenGL::RendererConfig &config, preferredConfigs) {
1059 dbgDetection() <<"Probing format..." << config.format.colorSpace() << config.rendererId();
1060 Info info = KisOpenGLModeProber::instance()->probeFormat(config);
1061
1062 if (info && info->isSupportedVersion()) {
1063
1064#ifdef Q_OS_WIN
1065 // HACK: Block ANGLE with Direct3D9
1066 // Direct3D9 does not give OpenGL ES 3.0
1067 // Some versions of ANGLE returns OpenGL version 3.0 incorrectly
1068
1069 if (info->isUsingAngle() &&
1070 info->rendererString().contains("Direct3D9", Qt::CaseInsensitive)) {
1071
1072 dbgDetection() << "Skipping Direct3D 9 Angle implementation, it shouldn't have happened.";
1073
1074 continue;
1075 }
1076#endif
1077
1078 dbgDetection() << "Found format:" << config.format;
1079 dbgDetection() << " " << config.rendererId();
1080
1081 resultConfig = config;
1082 break;
1083 }
1084 }
1085
1086 {
1087 const bool colorSpaceIsCorrect =
1088 KisOpenGLModeProber::fuzzyCompareColorSpaces(compareOp.preferredColorSpace(),
1089 KisSurfaceColorSpaceWrapper::fromQtColorSpace(resultConfig.format.colorSpace()));
1090
1091 const bool rendererIsCorrect =
1092 compareOp.preferredRendererByUser() == KisOpenGL::RendererAuto ||
1093 compareOp.preferredRendererByUser() == resultConfig.rendererId();
1094
1095 if (!rendererIsCorrect && colorSpaceIsCorrect) {
1096 warningMessages << ki18n("Preferred renderer doesn't support requested surface format. Another renderer has been selected.");
1097 } else if (!colorSpaceIsCorrect) {
1098 warningMessages << ki18n("Preferred output format is not supported by available renderers");
1099 }
1100
1101 }
1102 } else {
1103 resultConfig.format = QSurfaceFormat();
1104 resultConfig.angleRenderer = AngleRendererDefault;
1105 }
1106
1107 overrideSupportedRenderers(supportedRenderers, preferredByQt);
1108 overrideOpenGLWarningString(warningMessages);
1109
1110 return resultConfig;
1111}
static bool fuzzyCompareColorSpaces(const KisSurfaceColorSpaceWrapper &lhs, const KisSurfaceColorSpaceWrapper &rhs)
static KisSurfaceColorSpaceWrapper fromQtColorSpace(const QColorSpace &colorSpace)
#define dbgDetection()
AngleRenderer angleRenderer
Definition kis_opengl.h:58
OpenGLRenderer rendererId() const

References KisOpenGL::RendererConfig::angleRenderer, AngleRendererDefault, KisSurfaceColorSpaceWrapper::bt2020PQColorSpace, KisConfig::BT709_G10, KisConfig::BT709_G22, dbgDetection, dbgOpenGL, KisSurfaceColorSpaceWrapper::DefaultColorSpace, KisConfig::Depth8Bit, KisOpenGL::RendererConfig::format, KisSurfaceColorSpaceWrapper::fromQtColorSpace(), KisOpenGLModeProber::fuzzyCompareColorSpaces(), KisOpenGLModeProber::instance(), KisOpenGLModeProber::probeFormat(), RendererAuto, RendererDesktopGL, KisOpenGL::RendererConfig::rendererId(), RendererNone, RendererOpenGLES, RendererSoftware, KisSurfaceColorSpaceWrapper::scRGBColorSpace, and KisSurfaceColorSpaceWrapper::sRGBColorSpace.

◆ setDebugSynchronous()

void KisOpenGL::setDebugSynchronous ( bool value)
static

Definition at line 412 of file kis_opengl.cpp.

413{
414 g_isDebugSynchronous = value;
415}
float value(const T *src, size_t ch)

References value().

◆ setDefaultSurfaceConfig()

void KisOpenGL::setDefaultSurfaceConfig ( const RendererConfig & config)
static

Definition at line 1113 of file kis_opengl.cpp.

1114{
1115 KIS_SAFE_ASSERT_RECOVER_NOOP(!g_sanityDefaultFormatIsSet);
1116
1117 g_sanityDefaultFormatIsSet = true;
1118 QSurfaceFormat::setDefaultFormat(config.format);
1119
1120 if (config.format.renderableType() == QSurfaceFormat::OpenGLES) {
1121 QCoreApplication::setAttribute(Qt::AA_UseOpenGLES, true);
1122#ifdef Q_OS_WIN
1123 if (!qEnvironmentVariableIsSet("QT_ANGLE_PLATFORM")) {
1124 // Force ANGLE to use Direct3D11. D3D9 doesn't support OpenGL ES 3 and WARP
1125 // might get weird crashes atm.
1126 qputenv("QT_ANGLE_PLATFORM", KisOpenGLModeProber::angleRendererToString(config.angleRenderer).toLatin1());
1127 }
1128#endif
1129 } else if (config.format.renderableType() == QSurfaceFormat::OpenGL) {
1130 QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL, true);
1131 }
1132}
static QString angleRendererToString(KisOpenGL::AngleRenderer renderer)

References KisOpenGL::RendererConfig::angleRenderer, KisOpenGLModeProber::angleRendererToString(), KisOpenGL::RendererConfig::format, and KIS_SAFE_ASSERT_RECOVER_NOOP.

◆ setUserPreferredOpenGLRendererConfig()

void KisOpenGL::setUserPreferredOpenGLRendererConfig ( KisOpenGL::OpenGLRenderer renderer)
static

Definition at line 445 of file kis_opengl.cpp.

446{
447 const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
448 QSettings kritarc(configPath + QStringLiteral("/kritadisplayrc"), QSettings::IniFormat);
449 kritarc.setValue("OpenGLRenderer", KisOpenGL::convertOpenGLRendererToConfig(renderer));
450}
static QString convertOpenGLRendererToConfig(OpenGLRenderer renderer)

References convertOpenGLRendererToConfig().

◆ shouldUseTextureBuffers()

bool KisOpenGL::shouldUseTextureBuffers ( bool userPreference)
static

Definition at line 382 of file kis_opengl.cpp.

383{
384 initialize();
385 return !g_forceDisableTextureBuffers && userPreference;
386}

References initialize().

◆ supportsBufferMapping()

bool KisOpenGL::supportsBufferMapping ( )
static

Definition at line 370 of file kis_opengl.cpp.

371{
372 initialize();
373 return openGLCheckResult && openGLCheckResult->supportsBufferMapping();
374}

References initialize().

◆ supportsFenceSync()

bool KisOpenGL::supportsFenceSync ( )
static

supportsFilter

Returns
True if OpenGL provides fence sync methods.

Definition at line 364 of file kis_opengl.cpp.

365{
366 initialize();
367 return openGLCheckResult && openGLCheckResult->supportsFenceSync();
368}

References initialize().

◆ supportsLoD()

bool KisOpenGL::supportsLoD ( )
static

Definition at line 340 of file kis_opengl.cpp.

341{
342 initialize();
343 return openGLCheckResult && openGLCheckResult->supportsLoD();
344}

References initialize().

◆ supportsVAO()

bool KisOpenGL::supportsVAO ( )
static

Definition at line 352 of file kis_opengl.cpp.

353{
354 initialize();
355 return openGLCheckResult && openGLCheckResult->supportsVAO();
356}

References initialize().

◆ testingInitializeDefaultSurfaceFormat()

void KisOpenGL::testingInitializeDefaultSurfaceFormat ( )
static

Definition at line 407 of file kis_opengl.cpp.

408{
410}
static RendererConfig selectSurfaceConfig(KisOpenGL::OpenGLRenderer preferredRenderer, KisConfig::RootSurfaceFormat preferredRootSurfaceFormat, KisConfig::CanvasSurfaceBitDepthMode preferredCanvasSurfaceBitMode, bool enableDebug)
static void setDefaultSurfaceConfig(const RendererConfig &config)

References KisConfig::BT709_G22, KisConfig::DepthAuto, RendererAuto, selectSurfaceConfig(), and setDefaultSurfaceConfig().

◆ useFBOForToolOutlineRendering()

bool KisOpenGL::useFBOForToolOutlineRendering ( )
static

supportsRenderToFBO

Returns
True if OpenGL can render to FBO, used currently for rendering cursor with image overlay fx.

Definition at line 395 of file kis_opengl.cpp.

396{
397 initialize();
398 return openGLCheckResult && openGLCheckResult->supportsFBO();
399}

References initialize().

◆ useTextureBufferInvalidation()

bool KisOpenGL::useTextureBufferInvalidation ( )
static

Definition at line 388 of file kis_opengl.cpp.

389{
390 initialize();
391 return g_useBufferInvalidation &&
392 openGLCheckResult && openGLCheckResult->supportsBufferInvalidation();
393}

References initialize().


The documentation for this class was generated from the following files: