summaryrefslogtreecommitdiff
path: root/indra/llrender
diff options
context:
space:
mode:
authorCosmic Linden <cosmic@lindenlab.com>2024-10-02 15:25:11 -0700
committerCosmic Linden <cosmic@lindenlab.com>2024-10-02 17:11:19 -0700
commitdc7b2adbebea2bd332de52d90dbbe651ee94031c (patch)
tree2c5ffa9e5a74d959a6b77e38d639ae0d791c8d9a /indra/llrender
parent9e8cf72a355d5353564c0199990a6b5073f37fca (diff)
secondlife/viewer#2472: Debug tools for labeling textures
Diffstat (limited to 'indra/llrender')
-rw-r--r--indra/llrender/llgltexture.cpp62
-rw-r--r--indra/llrender/llgltexture.h3
2 files changed, 65 insertions, 0 deletions
diff --git a/indra/llrender/llgltexture.cpp b/indra/llrender/llgltexture.cpp
index 4dcca5a726..9a2b2ef524 100644
--- a/indra/llrender/llgltexture.cpp
+++ b/indra/llrender/llgltexture.cpp
@@ -168,6 +168,68 @@ bool LLGLTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw,
return ret ;
}
+void LLGLTexture::getGLObjectLabel(std::string& label, bool& error) const
+{
+ if (!mGLTexturep)
+ {
+ error = true;
+ label.clear();
+ return;
+ }
+ LLGLuint texname = mGLTexturep->getTexName();
+ if (!texname)
+ {
+ error = true;
+ label.clear();
+ return;
+ }
+ static GLsizei max_length = 0;
+ if (max_length == 0) { glGetIntegerv(GL_MAX_LABEL_LENGTH, &max_length); }
+ static char * clabel = new char[max_length+1];
+ GLsizei length;
+ glGetObjectLabel(GL_TEXTURE, texname, max_length+1, &length, clabel);
+ error = false;
+ label.assign(clabel, length);
+}
+
+std::string LLGLTexture::setGLObjectLabel(const std::string& prefix, bool append_texname) const
+{
+ llassert(mGLTexturep);
+ if (mGLTexturep)
+ {
+ LLGLuint texname = mGLTexturep->getTexName();
+ llassert(texname);
+ if (texname)
+ {
+ static GLsizei max_length = 0;
+ if (max_length == 0) { glGetIntegerv(GL_MAX_LABEL_LENGTH, &max_length); }
+
+ if (append_texname)
+ {
+ std::string label_with_texname = prefix + "_" + std::to_string(texname);
+ label_with_texname.resize(std::min(size_t(max_length), label_with_texname.size()));
+ glObjectLabel(GL_TEXTURE, texname, (GLsizei)label_with_texname.size(), label_with_texname.c_str());
+ return label_with_texname;
+ }
+ else
+ {
+ if (prefix.size() <= max_length)
+ {
+ glObjectLabel(GL_TEXTURE, texname, (GLsizei)prefix.size(), prefix.c_str());
+ return prefix;
+ }
+ else
+ {
+ const std::string label(prefix.c_str(), max_length);
+ glObjectLabel(GL_TEXTURE, texname, (GLsizei)label.size(), label.c_str());
+ return label;
+ }
+ }
+ }
+ }
+ return "";
+}
+
void LLGLTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, bool swap_bytes)
{
llassert(mGLTexturep.notNull()) ;
diff --git a/indra/llrender/llgltexture.h b/indra/llrender/llgltexture.h
index 122d2a7f9c..22f2ed5131 100644
--- a/indra/llrender/llgltexture.h
+++ b/indra/llrender/llgltexture.h
@@ -118,6 +118,9 @@ public:
LLGLuint getTexName() const ;
bool createGLTexture() ;
+ void getGLObjectLabel(std::string& label, bool& error) const;
+ std::string setGLObjectLabel(const std::string& prefix, bool append_texname = false) const;
+
// Create a GL Texture from an image raw
// discard_level - mip level, 0 for highest resultion mip
// imageraw - the image to copy from