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_