opengl: add debug:gl_debugging (#13183)
add debug:gl_debugging so we can disable gl debugging entirerly, both glGetError and enabling EGL_KHR_debug has its cost, we still have EXT_create_context_robustness and glGetGraphicsResetStatus that should catch context loss, and is generally cheap to call it only checks a flag set. glGetError might cause a implicit flush to get any pending calls sent to the gpu. however to get EGL_KHR_debug back enabled we now require a restart of the compositor after changing debug:gl_debugging
This commit is contained in:
parent
8606bc255b
commit
63eb6b3bda
4 changed files with 24 additions and 9 deletions
|
|
@ -1752,6 +1752,12 @@ inline static const std::vector<SConfigOptionDescription> CONFIG_OPTIONS = {
|
||||||
.type = CONFIG_OPTION_BOOL,
|
.type = CONFIG_OPTION_BOOL,
|
||||||
.data = SConfigOptionDescription::SBoolData{false},
|
.data = SConfigOptionDescription::SBoolData{false},
|
||||||
},
|
},
|
||||||
|
SConfigOptionDescription{
|
||||||
|
.value = "debug:gl_debugging",
|
||||||
|
.description = "enable OpenGL debugging and error checking, they hurt performance.",
|
||||||
|
.type = CONFIG_OPTION_BOOL,
|
||||||
|
.data = SConfigOptionDescription::SBoolData{false},
|
||||||
|
},
|
||||||
SConfigOptionDescription{
|
SConfigOptionDescription{
|
||||||
.value = "debug:disable_logs",
|
.value = "debug:disable_logs",
|
||||||
.description = "disable logging to a file",
|
.description = "disable logging to a file",
|
||||||
|
|
|
||||||
|
|
@ -561,6 +561,7 @@ CConfigManager::CConfigManager() {
|
||||||
registerConfigVar("debug:overlay", Hyprlang::INT{0});
|
registerConfigVar("debug:overlay", Hyprlang::INT{0});
|
||||||
registerConfigVar("debug:damage_blink", Hyprlang::INT{0});
|
registerConfigVar("debug:damage_blink", Hyprlang::INT{0});
|
||||||
registerConfigVar("debug:pass", Hyprlang::INT{0});
|
registerConfigVar("debug:pass", Hyprlang::INT{0});
|
||||||
|
registerConfigVar("debug:gl_debugging", Hyprlang::INT{0});
|
||||||
registerConfigVar("debug:disable_logs", Hyprlang::INT{1});
|
registerConfigVar("debug:disable_logs", Hyprlang::INT{1});
|
||||||
registerConfigVar("debug:disable_time", Hyprlang::INT{1});
|
registerConfigVar("debug:disable_time", Hyprlang::INT{1});
|
||||||
registerConfigVar("debug:enable_stdout_logs", Hyprlang::INT{0});
|
registerConfigVar("debug:enable_stdout_logs", Hyprlang::INT{0});
|
||||||
|
|
|
||||||
|
|
@ -96,10 +96,13 @@
|
||||||
#define GLCALL(__CALL__) \
|
#define GLCALL(__CALL__) \
|
||||||
{ \
|
{ \
|
||||||
__CALL__; \
|
__CALL__; \
|
||||||
auto err = glGetError(); \
|
static const auto GLDEBUG = CConfigValue<Hyprlang::INT>("debug:gl_debugging"); \
|
||||||
if (err != GL_NO_ERROR) { \
|
if (*GLDEBUG) { \
|
||||||
Log::logger->log(Log::ERR, "[GLES] Error in call at {}@{}: 0x{:x}", __LINE__, \
|
auto err = glGetError(); \
|
||||||
([]() constexpr -> std::string { return std::string(__FILE__).substr(std::string(__FILE__).find_last_of('/') + 1); })(), err); \
|
if (err != GL_NO_ERROR) { \
|
||||||
|
Log::logger->log(Log::ERR, "[GLES] Error in call at {}@{}: 0x{:x}", __LINE__, \
|
||||||
|
([]() constexpr -> std::string { return std::string(__FILE__).substr(std::string(__FILE__).find_last_of('/') + 1); })(), err); \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -304,7 +304,8 @@ CHyprOpenGLImpl::CHyprOpenGLImpl() : m_drmFD(g_pCompositor->m_drmRenderNode.fd >
|
||||||
loadGLProc(&m_proc.eglQueryDisplayAttribEXT, "eglQueryDisplayAttribEXT");
|
loadGLProc(&m_proc.eglQueryDisplayAttribEXT, "eglQueryDisplayAttribEXT");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EGLEXTENSIONS.contains("EGL_KHR_debug")) {
|
static const auto GLDEBUG = CConfigValue<Hyprlang::INT>("debug:gl_debugging");
|
||||||
|
if (EGLEXTENSIONS.contains("EGL_KHR_debug") && *GLDEBUG) {
|
||||||
loadGLProc(&m_proc.eglDebugMessageControlKHR, "eglDebugMessageControlKHR");
|
loadGLProc(&m_proc.eglDebugMessageControlKHR, "eglDebugMessageControlKHR");
|
||||||
static const EGLAttrib debugAttrs[] = {
|
static const EGLAttrib debugAttrs[] = {
|
||||||
EGL_DEBUG_MSG_CRITICAL_KHR, EGL_TRUE, EGL_DEBUG_MSG_ERROR_KHR, EGL_TRUE, EGL_DEBUG_MSG_WARN_KHR, EGL_TRUE, EGL_DEBUG_MSG_INFO_KHR, EGL_TRUE, EGL_NONE,
|
EGL_DEBUG_MSG_CRITICAL_KHR, EGL_TRUE, EGL_DEBUG_MSG_ERROR_KHR, EGL_TRUE, EGL_DEBUG_MSG_WARN_KHR, EGL_TRUE, EGL_DEBUG_MSG_INFO_KHR, EGL_TRUE, EGL_NONE,
|
||||||
|
|
@ -838,11 +839,15 @@ void CHyprOpenGLImpl::end() {
|
||||||
if UNLIKELY (m_renderData.pCurrentMonData->offMainFB.isAllocated())
|
if UNLIKELY (m_renderData.pCurrentMonData->offMainFB.isAllocated())
|
||||||
m_renderData.pCurrentMonData->offMainFB.release();
|
m_renderData.pCurrentMonData->offMainFB.release();
|
||||||
|
|
||||||
// check for gl errors
|
static const auto GLDEBUG = CConfigValue<Hyprlang::INT>("debug:gl_debugging");
|
||||||
const GLenum ERR = glGetError();
|
|
||||||
|
|
||||||
if UNLIKELY (ERR == GL_CONTEXT_LOST) /* We don't have infra to recover from this */
|
if (*GLDEBUG) {
|
||||||
RASSERT(false, "glGetError at Opengl::end() returned GL_CONTEXT_LOST. Cannot continue until proper GPU reset handling is implemented.");
|
// check for gl errors
|
||||||
|
const GLenum ERR = glGetError();
|
||||||
|
|
||||||
|
if UNLIKELY (ERR == GL_CONTEXT_LOST) /* We don't have infra to recover from this */
|
||||||
|
RASSERT(false, "glGetError at Opengl::end() returned GL_CONTEXT_LOST. Cannot continue until proper GPU reset handling is implemented.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprOpenGLImpl::setDamage(const CRegion& damage_, std::optional<CRegion> finalDamage) {
|
void CHyprOpenGLImpl::setDamage(const CRegion& damage_, std::optional<CRegion> finalDamage) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue