2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #include "ServiceBroker.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"
26 #define X(VAL) std::make_pair(VAL, #VAL)
27 std::map
<GLenum
, const char*> glErrors
=
29 // please keep attributes in accordance to:
30 // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetError.xhtml
34 X(GL_INVALID_OPERATION
),
35 X(GL_INVALID_FRAMEBUFFER_OPERATION
),
38 X(GL_STACK_UNDERFLOW
),
43 std::map
<GLenum
, const char*> glErrorSource
= {
44 #if defined(HAS_GLES) && defined(TARGET_LINUX)
45 X(GL_DEBUG_SOURCE_API_KHR
),
46 X(GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR
),
47 X(GL_DEBUG_SOURCE_SHADER_COMPILER_KHR
),
48 X(GL_DEBUG_SOURCE_THIRD_PARTY_KHR
),
49 X(GL_DEBUG_SOURCE_APPLICATION_KHR
),
50 X(GL_DEBUG_SOURCE_OTHER_KHR
),
54 std::map
<GLenum
, const char*> glErrorType
= {
55 #if defined(HAS_GLES) && defined(TARGET_LINUX)
56 X(GL_DEBUG_TYPE_ERROR_KHR
),
57 X(GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR
),
58 X(GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR
),
59 X(GL_DEBUG_TYPE_PORTABILITY_KHR
),
60 X(GL_DEBUG_TYPE_PERFORMANCE_KHR
),
61 X(GL_DEBUG_TYPE_OTHER_KHR
),
62 X(GL_DEBUG_TYPE_MARKER_KHR
),
66 std::map
<GLenum
, const char*> glErrorSeverity
= {
67 #if defined(HAS_GLES) && defined(TARGET_LINUX)
68 X(GL_DEBUG_SEVERITY_HIGH_KHR
),
69 X(GL_DEBUG_SEVERITY_MEDIUM_KHR
),
70 X(GL_DEBUG_SEVERITY_LOW_KHR
),
71 X(GL_DEBUG_SEVERITY_NOTIFICATION_KHR
),
78 void KODI::UTILS::GL::GlErrorCallback(GLenum source
, GLenum type
, GLuint id
, GLenum severity
, GLsizei length
, const GLchar
* message
, const void* userParam
)
80 std::string sourceStr
;
82 std::string severityStr
;
84 auto glSource
= glErrorSource
.find(source
);
85 if (glSource
!= glErrorSource
.end())
87 sourceStr
= glSource
->second
;
90 auto glType
= glErrorType
.find(type
);
91 if (glType
!= glErrorType
.end())
93 typeStr
= glType
->second
;
96 auto glSeverity
= glErrorSeverity
.find(severity
);
97 if (glSeverity
!= glErrorSeverity
.end())
99 severityStr
= glSeverity
->second
;
102 CLog::Log(LOGDEBUG
, "OpenGL(ES) Debugging:\nSource: {}\nType: {}\nSeverity: {}\nID: {}\nMessage: {}", sourceStr
, typeStr
, severityStr
, id
, message
);
105 static void PrintMatrix(const GLfloat
* matrix
, const std::string
& matrixName
)
107 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}",
109 matrix
[0], matrix
[1], matrix
[2], matrix
[3],
110 matrix
[4], matrix
[5], matrix
[6], matrix
[7],
111 matrix
[8], matrix
[9], matrix
[10], matrix
[11],
112 matrix
[12], matrix
[13], matrix
[14], matrix
[15]);
115 void _VerifyGLState(const char* szfile
, const char* szfunction
, int lineno
)
117 GLenum err
= glGetError();
118 if (err
== GL_NO_ERROR
)
123 auto error
= glErrors
.find(err
);
124 if (error
!= glErrors
.end())
126 CLog::Log(LOGERROR
, "GL(ES) ERROR: {}", error
->second
);
129 if (szfile
&& szfunction
)
131 CLog::Log(LOGERROR
, "In file: {} function: {} line: {}", szfile
, szfunction
, lineno
);
135 glGetBooleanv(GL_SCISSOR_TEST
, &scissors
);
136 CLog::Log(LOGDEBUG
, "Scissor test enabled: {}", scissors
== GL_TRUE
? "True" : "False");
139 glGetFloatv(GL_SCISSOR_BOX
, matrix
);
140 CLog::Log(LOGDEBUG
, "Scissor box: {}, {}, {}, {}", matrix
[0], matrix
[1], matrix
[2], matrix
[3]);
142 glGetFloatv(GL_VIEWPORT
, matrix
);
143 CLog::Log(LOGDEBUG
, "Viewport: {}, {}, {}, {}", matrix
[0], matrix
[1], matrix
[2], matrix
[3]);
145 PrintMatrix(glMatrixProject
.Get(), "Projection Matrix");
146 PrintMatrix(glMatrixModview
.Get(), "Modelview Matrix");
149 void LogGraphicsInfo()
151 #if defined(HAS_GL) || defined(HAS_GLES)
154 s
= reinterpret_cast<const char*>(glGetString(GL_VENDOR
));
156 CLog::Log(LOGINFO
, "GL_VENDOR = {}", s
);
158 CLog::Log(LOGINFO
, "GL_VENDOR = NULL");
160 s
= reinterpret_cast<const char*>(glGetString(GL_RENDERER
));
162 CLog::Log(LOGINFO
, "GL_RENDERER = {}", s
);
164 CLog::Log(LOGINFO
, "GL_RENDERER = NULL");
166 s
= reinterpret_cast<const char*>(glGetString(GL_VERSION
));
168 CLog::Log(LOGINFO
, "GL_VERSION = {}", s
);
170 CLog::Log(LOGINFO
, "GL_VERSION = NULL");
172 s
= reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION
));
174 CLog::Log(LOGINFO
, "GL_SHADING_LANGUAGE_VERSION = {}", s
);
176 CLog::Log(LOGINFO
, "GL_SHADING_LANGUAGE_VERSION = NULL");
178 //GL_NVX_gpu_memory_info extension
179 #define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
180 #define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
181 #define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
182 #define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
183 #define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
185 if (CServiceBroker::GetRenderSystem()->IsExtSupported("GL_NVX_gpu_memory_info"))
189 glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
, &mem
);
190 CLog::Log(LOGINFO
, "GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = {}", mem
);
192 //this seems to be the amount of ram on the videocard
193 glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
, &mem
);
194 CLog::Log(LOGINFO
, "GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX = {}", mem
);
197 std::string extensions
;
199 unsigned int renderVersionMajor
, renderVersionMinor
;
200 CServiceBroker::GetRenderSystem()->GetRenderVersion(renderVersionMajor
, renderVersionMinor
);
201 if (renderVersionMajor
> 3 ||
202 (renderVersionMajor
== 3 && renderVersionMinor
>= 2))
205 glGetIntegerv(GL_NUM_EXTENSIONS
, &n
);
209 for (i
= 0; i
< n
; i
++)
211 extensions
+= (const char*)glGetStringi(GL_EXTENSIONS
, i
);
219 extensions
+= (const char*) glGetString(GL_EXTENSIONS
);
222 if (!extensions
.empty())
223 CLog::Log(LOGINFO
, "GL_EXTENSIONS = {}", extensions
);
225 CLog::Log(LOGINFO
, "GL_EXTENSIONS = NULL");
229 CLog::Log(LOGINFO
, "Please define LogGraphicsInfo for your chosen graphics library");
233 int KODI::UTILS::GL::glFormatElementByteCount(GLenum format
)
253 case GL_LUMINANCE_ALPHA
:
259 CLog::Log(LOGERROR
, "glFormatElementByteCount - Unknown format {}", format
);
264 uint8_t KODI::UTILS::GL::GetChannelFromARGB(const KODI::UTILS::GL::ColorChannel colorChannel
,
267 switch (colorChannel
)
269 case KODI::UTILS::GL::ColorChannel::A
:
270 return (argb
>> 24) & 0xFF;
271 case KODI::UTILS::GL::ColorChannel::R
:
272 return (argb
>> 16) & 0xFF;
273 case KODI::UTILS::GL::ColorChannel::G
:
274 return (argb
>> 8) & 0xFF;
275 case KODI::UTILS::GL::ColorChannel::B
:
276 return (argb
>> 0) & 0xFF;
278 throw std::runtime_error("KODI::UTILS::GL::GetChannelFromARGB: ColorChannel not handled");