summaryrefslogtreecommitdiffstats
path: root/xbmc/utils/GLUtils.cpp
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2020-10-19 00:52:24 +0200
committermanuel <manuel@mausz.at>2020-10-19 00:52:24 +0200
commitbe933ef2241d79558f91796cc5b3a161f72ebf9c (patch)
treefe3ab2f130e20c99001f2d7a81d610c78c96a3f4 /xbmc/utils/GLUtils.cpp
parent5f8335c1e49ce108ef3481863833c98efa00411b (diff)
downloadkodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.tar.gz
kodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.tar.bz2
kodi-pvr-build-be933ef2241d79558f91796cc5b3a161f72ebf9c.zip
sync with upstream
Diffstat (limited to 'xbmc/utils/GLUtils.cpp')
-rw-r--r--xbmc/utils/GLUtils.cpp267
1 files changed, 267 insertions, 0 deletions
diff --git a/xbmc/utils/GLUtils.cpp b/xbmc/utils/GLUtils.cpp
new file mode 100644
index 0000000..be94eb5
--- /dev/null
+++ b/xbmc/utils/GLUtils.cpp
@@ -0,0 +1,267 @@
1/*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#include "GLUtils.h"
10
11#include "ServiceBroker.h"
12#include "log.h"
13#include "rendering/MatrixGL.h"
14#include "rendering/RenderSystem.h"
15#include "settings/AdvancedSettings.h"
16#include "settings/SettingsComponent.h"
17#include "utils/StringUtils.h"
18
19#include <map>
20#include <utility>
21
22namespace
23{
24
25#define X(VAL) std::make_pair(VAL, #VAL)
26std::map<GLenum, const char*> glErrors =
27{
28 // please keep attributes in accordance to:
29 // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetError.xhtml
30 X(GL_NO_ERROR),
31 X(GL_INVALID_ENUM),
32 X(GL_INVALID_VALUE),
33 X(GL_INVALID_OPERATION),
34 X(GL_INVALID_FRAMEBUFFER_OPERATION),
35 X(GL_OUT_OF_MEMORY),
36#if defined(HAS_GL)
37 X(GL_STACK_UNDERFLOW),
38 X(GL_STACK_OVERFLOW),
39#endif
40};
41
42std::map<GLenum, const char*> glErrorSource =
43{
44//! @todo remove TARGET_RASPBERRY_PI when Raspberry Pi updates their GL headers
45#if defined(HAS_GLES) && defined(TARGET_LINUX) && !defined(TARGET_RASPBERRY_PI)
46 X(GL_DEBUG_SOURCE_API_KHR),
47 X(GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR),
48 X(GL_DEBUG_SOURCE_SHADER_COMPILER_KHR),
49 X(GL_DEBUG_SOURCE_THIRD_PARTY_KHR),
50 X(GL_DEBUG_SOURCE_APPLICATION_KHR),
51 X(GL_DEBUG_SOURCE_OTHER_KHR),
52#endif
53};
54
55std::map<GLenum, const char*> glErrorType =
56{
57//! @todo remove TARGET_RASPBERRY_PI when Raspberry Pi updates their GL headers
58#if defined(HAS_GLES) && defined(TARGET_LINUX) && !defined(TARGET_RASPBERRY_PI)
59 X(GL_DEBUG_TYPE_ERROR_KHR),
60 X(GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR),
61 X(GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR),
62 X(GL_DEBUG_TYPE_PORTABILITY_KHR),
63 X(GL_DEBUG_TYPE_PERFORMANCE_KHR),
64 X(GL_DEBUG_TYPE_OTHER_KHR),
65 X(GL_DEBUG_TYPE_MARKER_KHR),
66#endif
67};
68
69std::map<GLenum, const char*> glErrorSeverity =
70{
71//! @todo remove TARGET_RASPBERRY_PI when Raspberry Pi updates their GL headers
72#if defined(HAS_GLES) && defined(TARGET_LINUX) && !defined(TARGET_RASPBERRY_PI)
73 X(GL_DEBUG_SEVERITY_HIGH_KHR),
74 X(GL_DEBUG_SEVERITY_MEDIUM_KHR),
75 X(GL_DEBUG_SEVERITY_LOW_KHR),
76 X(GL_DEBUG_SEVERITY_NOTIFICATION_KHR),
77#endif
78};
79#undef X
80
81} // namespace
82
83void KODI::UTILS::GL::GlErrorCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
84{
85 std::string sourceStr;
86 std::string typeStr;
87 std::string severityStr;
88
89 auto glSource = glErrorSource.find(source);
90 if (glSource != glErrorSource.end())
91 {
92 sourceStr = glSource->second;
93 }
94
95 auto glType = glErrorType.find(type);
96 if (glType != glErrorType.end())
97 {
98 typeStr = glType->second;
99 }
100
101 auto glSeverity = glErrorSeverity.find(severity);
102 if (glSeverity != glErrorSeverity.end())
103 {
104 severityStr = glSeverity->second;
105 }
106
107 CLog::Log(LOGDEBUG, "OpenGL(ES) Debugging:\nSource: {}\nType: {}\nSeverity: {}\nID: {}\nMessage: {}", sourceStr, typeStr, severityStr, id, message);
108}
109
110static void PrintMatrix(const GLfloat* matrix, std::string matrixName)
111{
112 CLog::Log(LOGDEBUG, "{}:\n{:> 10.3f} {:> 10.3f} {:> 10.3f} {:> 10.3f}\n{:> 10.3f} {:> 10.3f} {:> 10.3f} {:> 10.3f}\n{:> 10.3f} {:> 10.3f} {:> 10.3f} {:> 10.3f}\n{:> 10.3f} {:> 10.3f} {:> 10.3f} {:> 10.3f}",
113 matrixName,
114 matrix[0], matrix[1], matrix[2], matrix[3],
115 matrix[4], matrix[5], matrix[6], matrix[7],
116 matrix[8], matrix[9], matrix[10], matrix[11],
117 matrix[12], matrix[13], matrix[14], matrix[15]);
118}
119
120void _VerifyGLState(const char* szfile, const char* szfunction, int lineno)
121{
122 GLenum err = glGetError();
123 if (err == GL_NO_ERROR)
124 {
125 return;
126 }
127
128 auto error = glErrors.find(err);
129 if (error != glErrors.end())
130 {
131 CLog::Log(LOGERROR, "GL(ES) ERROR: {}", error->second);
132 }
133
134 if (szfile && szfunction)
135 {
136 CLog::Log(LOGERROR, "In file: {} function: {} line: {}", szfile, szfunction, lineno);
137 }
138
139 GLboolean scissors;
140 glGetBooleanv(GL_SCISSOR_TEST, &scissors);
141 CLog::Log(LOGDEBUG, "Scissor test enabled: {}", scissors == GL_TRUE ? "True" : "False");
142
143 GLfloat matrix[16];
144 glGetFloatv(GL_SCISSOR_BOX, matrix);
145 CLog::Log(LOGDEBUG, "Scissor box: {}, {}, {}, {}", matrix[0], matrix[1], matrix[2], matrix[3]);
146
147 glGetFloatv(GL_VIEWPORT, matrix);
148 CLog::Log(LOGDEBUG, "Viewport: {}, {}, {}, {}", matrix[0], matrix[1], matrix[2], matrix[3]);
149
150 PrintMatrix(glMatrixProject.Get(), "Projection Matrix");
151 PrintMatrix(glMatrixModview.Get(), "Modelview Matrix");
152}
153
154void LogGraphicsInfo()
155{
156#if defined(HAS_GL) || defined(HAS_GLES)
157 const GLubyte *s;
158
159 s = glGetString(GL_VENDOR);
160 if (s)
161 CLog::Log(LOGINFO, "GL_VENDOR = %s", s);
162 else
163 CLog::Log(LOGINFO, "GL_VENDOR = NULL");
164
165 s = glGetString(GL_RENDERER);
166 if (s)
167 CLog::Log(LOGINFO, "GL_RENDERER = %s", s);
168 else
169 CLog::Log(LOGINFO, "GL_RENDERER = NULL");
170
171 s = glGetString(GL_VERSION);
172 if (s)
173 CLog::Log(LOGINFO, "GL_VERSION = %s", s);
174 else
175 CLog::Log(LOGINFO, "GL_VERSION = NULL");
176
177 s = glGetString(GL_SHADING_LANGUAGE_VERSION);
178 if (s)
179 CLog::Log(LOGINFO, "GL_SHADING_LANGUAGE_VERSION = %s", s);
180 else
181 CLog::Log(LOGINFO, "GL_SHADING_LANGUAGE_VERSION = NULL");
182
183 //GL_NVX_gpu_memory_info extension
184#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
185#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
186#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
187#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
188#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
189
190 if (CServiceBroker::GetRenderSystem()->IsExtSupported("GL_NVX_gpu_memory_info"))
191 {
192 GLint mem = 0;
193
194 glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, &mem);
195 CLog::Log(LOGINFO, "GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = %i", mem);
196
197 //this seems to be the amount of ram on the videocard
198 glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &mem);
199 CLog::Log(LOGINFO, "GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX = %i", mem);
200 }
201
202 std::string extensions;
203#if defined(HAS_GL)
204 unsigned int renderVersionMajor, renderVersionMinor;
205 CServiceBroker::GetRenderSystem()->GetRenderVersion(renderVersionMajor, renderVersionMinor);
206 if (renderVersionMajor > 3 ||
207 (renderVersionMajor == 3 && renderVersionMinor >= 2))
208 {
209 GLint n;
210 glGetIntegerv(GL_NUM_EXTENSIONS, &n);
211 if (n > 0)
212 {
213 GLint i;
214 for (i = 0; i < n; i++)
215 {
216 extensions += (const char*)glGetStringi(GL_EXTENSIONS, i);
217 extensions += " ";
218 }
219 }
220 }
221 else
222#endif
223 {
224 extensions += (const char*) glGetString(GL_EXTENSIONS);
225 }
226
227 if (!extensions.empty())
228 CLog::Log(LOGINFO, "GL_EXTENSIONS = %s", extensions.c_str());
229 else
230 CLog::Log(LOGINFO, "GL_EXTENSIONS = NULL");
231
232
233#else /* !HAS_GL */
234 CLog::Log(LOGINFO, "Please define LogGraphicsInfo for your chosen graphics library");
235#endif /* !HAS_GL */
236}
237
238int glFormatElementByteCount(GLenum format)
239{
240 switch (format)
241 {
242#ifdef HAS_GL
243 case GL_BGRA:
244 return 4;
245 case GL_RED:
246 return 1;
247 case GL_GREEN:
248 return 1;
249 case GL_RG:
250 return 2;
251 case GL_BGR:
252 return 3;
253#endif
254 case GL_RGBA:
255 return 4;
256 case GL_RGB:
257 return 3;
258 case GL_LUMINANCE_ALPHA:
259 return 2;
260 case GL_LUMINANCE:
261 case GL_ALPHA:
262 return 1;
263 default:
264 CLog::Log(LOGERROR, "glFormatElementByteCount - Unknown format %u", format);
265 return 1;
266 }
267}