File indexing completed on 2024-05-26 04:30:21
0001 /* 0002 * SPDX-FileCopyrightText: 2007 Adrian Page <adrian@pagenet.plus.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #ifndef KIS_OPENGL_H_ 0007 #define KIS_OPENGL_H_ 0008 0009 /** @file */ 0010 0011 #include <QtGlobal> 0012 #include <QFlags> 0013 0014 #include <QSurfaceFormat> 0015 #include "kis_config.h" 0016 0017 #include "kritaui_export.h" 0018 0019 class QOpenGLContext; 0020 class QString; 0021 class QStringList; 0022 class QSurfaceFormat; 0023 0024 /** 0025 * This class manages a shared OpenGL context and provides utility 0026 * functions for checking capabilities and error reporting. 0027 */ 0028 class KRITAUI_EXPORT KisOpenGL 0029 { 0030 public: 0031 enum FilterMode { 0032 NearestFilterMode, // nearest 0033 BilinearFilterMode, // linear, no mipmap 0034 TrilinearFilterMode, // LINEAR_MIPMAP_LINEAR 0035 HighQualityFiltering // Mipmaps + custom shader 0036 }; 0037 0038 enum OpenGLRenderer { 0039 RendererNone = 0x00, 0040 RendererAuto = 0x01, 0041 RendererDesktopGL = 0x02, 0042 RendererOpenGLES = 0x04, 0043 RendererSoftware = 0x08 0044 }; 0045 Q_DECLARE_FLAGS(OpenGLRenderers, OpenGLRenderer) 0046 0047 enum AngleRenderer { 0048 AngleRendererDefault = 0x0000, 0049 AngleRendererD3d11 = 0x0002, 0050 AngleRendererD3d9 = 0x0004, 0051 AngleRendererD3d11Warp = 0x0008, // "Windows Advanced Rasterization Platform" 0052 }; 0053 0054 struct RendererConfig { 0055 QSurfaceFormat format; 0056 AngleRenderer angleRenderer = AngleRendererDefault; 0057 0058 OpenGLRenderer rendererId() const; 0059 }; 0060 0061 public: 0062 static RendererConfig selectSurfaceConfig(KisOpenGL::OpenGLRenderer preferredRenderer, 0063 KisConfig::RootSurfaceFormat preferredRootSurfaceFormat, 0064 bool enableDebug); 0065 0066 static void setDefaultSurfaceConfig(const RendererConfig &config); 0067 0068 static OpenGLRenderer getCurrentOpenGLRenderer(); 0069 static OpenGLRenderer getQtPreferredOpenGLRenderer(); 0070 static OpenGLRenderers getSupportedOpenGLRenderers(); 0071 static OpenGLRenderer getUserPreferredOpenGLRendererConfig(); 0072 static void setUserPreferredOpenGLRendererConfig(OpenGLRenderer renderer); 0073 static QString convertOpenGLRendererToConfig(OpenGLRenderer renderer); 0074 static OpenGLRenderer convertConfigToOpenGLRenderer(QString renderer); 0075 0076 /// Request OpenGL version 3.2 0077 static void initialize(); 0078 0079 /// Initialize shared OpenGL context 0080 static void initializeContext(QOpenGLContext *ctx); 0081 0082 static const QString &getDebugText(); 0083 0084 static QStringList getOpenGLWarnings(); 0085 0086 static QString currentDriver(); 0087 static bool supportsLoD(); 0088 static bool hasOpenGL3(); 0089 static bool hasOpenGLES(); 0090 static bool supportsVAO(); 0091 0092 /// Check for OpenGL 0093 static bool hasOpenGL(); 0094 0095 /** 0096 * @brief supportsFilter 0097 * @return True if OpenGL provides fence sync methods. 0098 */ 0099 static bool supportsFenceSync(); 0100 0101 static bool supportsBufferMapping(); 0102 0103 static bool forceDisableTextureBuffers(); 0104 static bool shouldUseTextureBuffers(bool userPreference); 0105 0106 static bool useTextureBufferInvalidation(); 0107 0108 /** 0109 * @brief supportsRenderToFBO 0110 * @return True if OpenGL can render to FBO, used 0111 * currently for rendering cursor with image overlay 0112 * fx. 0113 */ 0114 static bool useFBOForToolOutlineRendering(); 0115 0116 /** 0117 * Returns true if we have a driver that has bugged support to sync objects (a fence) 0118 * and false otherwise. 0119 */ 0120 static bool needsFenceWorkaround(); 0121 0122 static void testingInitializeDefaultSurfaceFormat(); 0123 static void setDebugSynchronous(bool value); 0124 0125 static void glInvalidateBufferData(uint buffer); 0126 0127 private: 0128 static void fakeInitWindowsOpenGL(KisOpenGL::OpenGLRenderers supportedRenderers, KisOpenGL::OpenGLRenderer preferredByQt); 0129 0130 KisOpenGL(); 0131 0132 0133 }; 0134 0135 #ifdef Q_OS_WIN 0136 Q_DECLARE_OPERATORS_FOR_FLAGS(KisOpenGL::OpenGLRenderers); 0137 #endif 0138 0139 #endif // KIS_OPENGL_H_