Add support for glObjectLabel to aid debugging

This commit is contained in:
sfan5 2024-12-29 19:24:33 +01:00
parent 0a67e6180d
commit ebb7ec3495
9 changed files with 56 additions and 12 deletions

View File

@ -137,6 +137,9 @@ public:
Images.clear(); Images.clear();
} }
if (!name.empty())
Driver->irrGlObjectLabel(GL_TEXTURE, TextureName, name.c_str());
Driver->getCacheHandler()->getTextureCache().set(0, prevTexture); Driver->getCacheHandler()->getTextureCache().set(0, prevTexture);
TEST_GL_ERROR(Driver); TEST_GL_ERROR(Driver);
@ -247,6 +250,9 @@ public:
break; break;
} }
if (!name.empty())
Driver->irrGlObjectLabel(GL_TEXTURE, TextureName, name.c_str());
Driver->getCacheHandler()->getTextureCache().set(0, prevTexture); Driver->getCacheHandler()->getTextureCache().set(0, prevTexture);
if (TEST_GL_ERROR(Driver)) { if (TEST_GL_ERROR(Driver)) {
char msg[256]; char msg[256];

View File

@ -1065,6 +1065,10 @@ public:
void irrGlCompressedTexSubImage2D(GLenum target, GLint level, void irrGlCompressedTexSubImage2D(GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
GLenum format, GLsizei imageSize, const void *data); GLenum format, GLsizei imageSize, const void *data);
inline void irrGlObjectLabel(GLenum identifier, GLuint name, const char *label)
{
// unimplemented
}
// shader programming // shader programming
void extGlGenPrograms(GLsizei n, GLuint *programs); void extGlGenPrograms(GLsizei n, GLuint *programs);

View File

@ -164,13 +164,6 @@ COpenGL3DriverBase::COpenGL3DriverBase(const SIrrlichtCreationParameters &params
ExposedData = ContextManager->getContext(); ExposedData = ContextManager->getContext();
ContextManager->activateContext(ExposedData, false); ContextManager->activateContext(ExposedData, false);
GL.LoadAllProcedures(ContextManager); GL.LoadAllProcedures(ContextManager);
if (EnableErrorTest && GL.IsExtensionPresent("GL_KHR_debug")) {
GL.Enable(GL_DEBUG_OUTPUT);
GL.DebugMessageCallback(debugCb, this);
} else if (EnableErrorTest) {
os::Printer::log("GL debug extension not available");
}
initQuadsIndices();
TEST_GL_ERROR(this); TEST_GL_ERROR(this);
} }
@ -248,6 +241,20 @@ bool COpenGL3DriverBase::genericDriverInit(const core::dimension2d<u32> &screenS
initFeatures(); initFeatures();
printTextureFormats(); printTextureFormats();
if (EnableErrorTest) {
if (KHRDebugSupported) {
GL.Enable(GL_DEBUG_OUTPUT);
GL.DebugMessageCallback(debugCb, this);
} else {
os::Printer::log("GL debug extension not available");
}
} else {
// don't do debug things if they are not wanted (even if supported)
KHRDebugSupported = false;
}
initQuadsIndices();
// reset cache handler // reset cache handler
delete CacheHandler; delete CacheHandler;
CacheHandler = new COpenGL3CacheHandler(this); CacheHandler = new COpenGL3CacheHandler(this);
@ -1615,7 +1622,7 @@ s32 COpenGL3DriverBase::addHighLevelShaderMaterial(
s32 nr = -1; s32 nr = -1;
COpenGL3MaterialRenderer *r = new COpenGL3MaterialRenderer( COpenGL3MaterialRenderer *r = new COpenGL3MaterialRenderer(
this, nr, vertexShaderProgram, this, nr, vertexShaderProgram,
pixelShaderProgram, pixelShaderProgram, shaderName,
callback, baseMaterial, userData); callback, baseMaterial, userData);
r->drop(); r->drop();

View File

@ -161,10 +161,23 @@ public:
GL.BlendEquation(mode); GL.BlendEquation(mode);
} }
inline void irrGlObjectLabel(GLenum identifier, GLuint name, const char *label)
{
if (KHRDebugSupported) {
u32 len = strlen(label);
// Since our texture strings can get quite long we also truncate
// to a hardcoded limit of 82
len = std::min(len, std::min(MaxLabelLength, 82U));
GL.ObjectLabel(identifier, name, len, label);
}
}
bool LODBiasSupported = false; bool LODBiasSupported = false;
bool AnisotropicFilterSupported = false; bool AnisotropicFilterSupported = false;
bool BlendMinMaxSupported = false; bool BlendMinMaxSupported = false;
bool TextureMultisampleSupported = false; bool TextureMultisampleSupported = false;
bool KHRDebugSupported = false;
u32 MaxLabelLength = 0;
}; };
} }

View File

@ -24,6 +24,7 @@ COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase *driver,
s32 &outMaterialTypeNr, s32 &outMaterialTypeNr,
const c8 *vertexShaderProgram, const c8 *vertexShaderProgram,
const c8 *pixelShaderProgram, const c8 *pixelShaderProgram,
const c8 *debugName,
IShaderConstantSetCallBack *callback, IShaderConstantSetCallBack *callback,
E_MATERIAL_TYPE baseMaterial, E_MATERIAL_TYPE baseMaterial,
s32 userData) : s32 userData) :
@ -45,7 +46,7 @@ COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase *driver,
if (CallBack) if (CallBack)
CallBack->grab(); CallBack->grab();
init(outMaterialTypeNr, vertexShaderProgram, pixelShaderProgram); init(outMaterialTypeNr, vertexShaderProgram, pixelShaderProgram, debugName);
} }
COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase *driver, COpenGL3MaterialRenderer::COpenGL3MaterialRenderer(COpenGL3DriverBase *driver,
@ -98,6 +99,7 @@ GLuint COpenGL3MaterialRenderer::getProgram() const
void COpenGL3MaterialRenderer::init(s32 &outMaterialTypeNr, void COpenGL3MaterialRenderer::init(s32 &outMaterialTypeNr,
const c8 *vertexShaderProgram, const c8 *vertexShaderProgram,
const c8 *pixelShaderProgram, const c8 *pixelShaderProgram,
const c8 *debugName,
bool addMaterial) bool addMaterial)
{ {
outMaterialTypeNr = -1; outMaterialTypeNr = -1;
@ -121,6 +123,9 @@ void COpenGL3MaterialRenderer::init(s32 &outMaterialTypeNr,
if (!linkProgram()) if (!linkProgram())
return; return;
if (debugName)
Driver->irrGlObjectLabel(GL_PROGRAM, Program, debugName);
if (addMaterial) if (addMaterial)
outMaterialTypeNr = Driver->addMaterialRenderer(this); outMaterialTypeNr = Driver->addMaterialRenderer(this);
} }

View File

@ -28,6 +28,7 @@ public:
s32 &outMaterialTypeNr, s32 &outMaterialTypeNr,
const c8 *vertexShaderProgram = 0, const c8 *vertexShaderProgram = 0,
const c8 *pixelShaderProgram = 0, const c8 *pixelShaderProgram = 0,
const c8 *debugName = nullptr,
IShaderConstantSetCallBack *callback = 0, IShaderConstantSetCallBack *callback = 0,
E_MATERIAL_TYPE baseMaterial = EMT_SOLID, E_MATERIAL_TYPE baseMaterial = EMT_SOLID,
s32 userData = 0); s32 userData = 0);
@ -66,7 +67,9 @@ protected:
E_MATERIAL_TYPE baseMaterial = EMT_SOLID, E_MATERIAL_TYPE baseMaterial = EMT_SOLID,
s32 userData = 0); s32 userData = 0);
void init(s32 &outMaterialTypeNr, const c8 *vertexShaderProgram, const c8 *pixelShaderProgram, bool addMaterial = true); void init(s32 &outMaterialTypeNr, const c8 *vertexShaderProgram,
const c8 *pixelShaderProgram, const c8 *debugName = nullptr,
bool addMaterial = true);
bool createShader(GLenum shaderType, const char *shader); bool createShader(GLenum shaderType, const char *shader);
bool linkProgram(); bool linkProgram();

View File

@ -23,8 +23,8 @@ COpenGL3Renderer2D::COpenGL3Renderer2D(const c8 *vertexShaderProgram, const c8 *
WithTexture(withTexture) WithTexture(withTexture)
{ {
int Temp = 0; int Temp = 0;
init(Temp, vertexShaderProgram, pixelShaderProgram,
init(Temp, vertexShaderProgram, pixelShaderProgram, false); withTexture ? "2DTexture" : "2DNoTexture", false);
COpenGL3CacheHandler *cacheHandler = Driver->getCacheHandler(); COpenGL3CacheHandler *cacheHandler = Driver->getCacheHandler();

View File

@ -72,6 +72,9 @@ void COpenGL3Driver::initFeatures()
LODBiasSupported = true; LODBiasSupported = true;
BlendMinMaxSupported = true; BlendMinMaxSupported = true;
TextureMultisampleSupported = true; TextureMultisampleSupported = true;
KHRDebugSupported = isVersionAtLeast(4, 6) || queryExtension("GL_KHR_debug");
if (KHRDebugSupported)
MaxLabelLength = GetInteger(GL.MAX_LABEL_LENGTH);
// COGLESCoreExtensionHandler::Feature // COGLESCoreExtensionHandler::Feature
static_assert(MATERIAL_MAX_TEXTURES <= 16, "Only up to 16 textures are guaranteed"); static_assert(MATERIAL_MAX_TEXTURES <= 16, "Only up to 16 textures are guaranteed");

View File

@ -124,6 +124,9 @@ void COpenGLES2Driver::initFeatures()
AnisotropicFilterSupported = queryExtension("GL_EXT_texture_filter_anisotropic"); AnisotropicFilterSupported = queryExtension("GL_EXT_texture_filter_anisotropic");
BlendMinMaxSupported = (Version.Major >= 3) || FeatureAvailable[IRR_GL_EXT_blend_minmax]; BlendMinMaxSupported = (Version.Major >= 3) || FeatureAvailable[IRR_GL_EXT_blend_minmax];
TextureMultisampleSupported = isVersionAtLeast(3, 1); TextureMultisampleSupported = isVersionAtLeast(3, 1);
KHRDebugSupported = queryExtension("GL_KHR_debug");
if (KHRDebugSupported)
MaxLabelLength = GetInteger(GL.MAX_LABEL_LENGTH);
// COGLESCoreExtensionHandler::Feature // COGLESCoreExtensionHandler::Feature
static_assert(MATERIAL_MAX_TEXTURES <= 8, "Only up to 8 textures are guaranteed"); static_assert(MATERIAL_MAX_TEXTURES <= 8, "Only up to 8 textures are guaranteed");