KWin
Loading...
Searching...
No Matches
glutils_funcs.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: 2007 Rivo Laks <rivolaks@hot.ee>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#include "opengl/glplatform.h"
11#include "opengl/glutils.h"
12
13// Resolves given function, using getProcAddress
14// Useful when functionality is defined in an extension with a different name
15#define GL_RESOLVE_WITH_EXT(function, symbolName) \
16 function = (function##_func)resolveFunction(#symbolName);
17
18namespace KWin
19{
20
21static GLenum GetGraphicsResetStatus();
22static void ReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,
23 GLenum type, GLsizei bufSize, GLvoid *data);
24static void GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
25
26// GL_ARB_robustness / GL_EXT_robustness
30
31void glResolveFunctions(const std::function<resolveFuncPtr(const char *)> &resolveFunction)
32{
33 const bool haveArbRobustness = hasGLExtension(QByteArrayLiteral("GL_ARB_robustness"));
34 const bool haveExtRobustness = hasGLExtension(QByteArrayLiteral("GL_EXT_robustness"));
35 bool robustContext = false;
36 if (GLPlatform::instance()->isGLES()) {
37 if (haveExtRobustness) {
38 GLint value = 0;
39 glGetIntegerv(GL_CONTEXT_ROBUST_ACCESS_EXT, &value);
40 robustContext = (value != 0);
41 }
42 } else {
43 if (haveArbRobustness) {
44 if (hasGLVersion(3, 0)) {
45 GLint value = 0;
46 glGetIntegerv(GL_CONTEXT_FLAGS, &value);
47 if (value & GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB) {
48 robustContext = true;
49 }
50 } else {
51 robustContext = true;
52 }
53 }
54 }
55 if (robustContext && haveArbRobustness) {
56 // See https://www.opengl.org/registry/specs/ARB/robustness.txt
57 GL_RESOLVE_WITH_EXT(glGetGraphicsResetStatus, glGetGraphicsResetStatusARB);
58 GL_RESOLVE_WITH_EXT(glReadnPixels, glReadnPixelsARB);
59 GL_RESOLVE_WITH_EXT(glGetnUniformfv, glGetnUniformfvARB);
60 } else if (robustContext && haveExtRobustness) {
61 // See https://www.khronos.org/registry/gles/extensions/EXT/EXT_robustness.txt
62 glGetGraphicsResetStatus = (glGetGraphicsResetStatus_func)resolveFunction("glGetGraphicsResetStatusEXT");
63 glReadnPixels = (glReadnPixels_func)resolveFunction("glReadnPixelsEXT");
64 glGetnUniformfv = (glGetnUniformfv_func)resolveFunction("glGetnUniformfvEXT");
65 } else {
66 glGetGraphicsResetStatus = KWin::GetGraphicsResetStatus;
67 glReadnPixels = KWin::ReadnPixels;
68 glGetnUniformfv = KWin::GetnUniformfv;
69 }
70}
71
72static GLenum GetGraphicsResetStatus()
73{
74 return GL_NO_ERROR;
75}
76
77static void ReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,
78 GLenum type, GLsizei bufSize, GLvoid *data)
79{
80 glReadPixels(x, y, width, height, format, type, data);
81}
82
83static void GetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat *params)
84{
85 glGetUniformfv(program, location, params);
86}
87
88} // namespace
static GLPlatform * instance()
Definition glplatform.h:394
#define GL_RESOLVE_WITH_EXT(function, symbolName)
glReadnPixels_func glReadnPixels
glGetnUniformfv_func glGetnUniformfv
Session::Type type
Definition session.cpp:17
void(* resolveFuncPtr)()
Definition glutils.h:31
bool hasGLVersion(int major, int minor, int release)
Definition glutils.cpp:133
GLenum format
Definition gltexture.cpp:49
GLenum(*)() glGetGraphicsResetStatus_func
void(*)(GLuint program, GLint location, GLsizei bufSize, GLfloat *params) glGetnUniformfv_func
bool hasGLExtension(const QByteArray &extension)
Definition glutils.cpp:138
glGetGraphicsResetStatus_func glGetGraphicsResetStatus
void(*)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data) glReadnPixels_func
void glResolveFunctions(const std::function< resolveFuncPtr(const char *)> &resolveFunction)