diff --git a/indra/llcommon/llprofiler.h b/indra/llcommon/llprofiler.h
index c0f5868db366e610e1eab214dbdaff003d4e2e11..ac202090622d7af7f8c1c11a73a8c6aa8ad7257f 100644
--- a/indra/llcommon/llprofiler.h
+++ b/indra/llcommon/llprofiler.h
@@ -153,12 +153,16 @@ extern thread_local bool gProfilerEnabled;
 // disable memory tracking (incompatible with GPU tracing
 #define LL_PROFILE_ALLOC(ptr, size)             (void)(ptr); (void)(size);
 #define LL_PROFILE_FREE(ptr)                    (void)(ptr);
+
+#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label)
 #else
 #define LL_PROFILE_GPU_ZONE(name)        (void)name;
 #define LL_PROFILE_GPU_ZONEC(name,color) (void)name;(void)color;
 #define LL_PROFILER_GPU_COLLECT
 #define LL_PROFILER_GPU_CONTEXT
 
+#define LL_LABEL_OBJECT_GL(type, name, length, label)
+
 #if LL_PROFILER_CONFIG > 1
 #define LL_PROFILE_ALLOC(ptr, size)             TracyAlloc(ptr, size)
 #define LL_PROFILE_FREE(ptr)                    TracyFree(ptr)
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 55713eea803dde29d31c4bc830baf0e4a6d71c9f..27de7070ff298ea1b322ca7d8d19854e819857d8 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -504,6 +504,10 @@ BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes,
         unbind();
     }
 
+#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+    setLabel(mName.c_str());
+#endif
+
     return success;
 }
 
@@ -1786,3 +1790,10 @@ void LLShaderUniforms::apply(LLGLSLShader* shader)
         shader->uniform3fv(uniform.mUniform, 1, uniform.mValue.mV);
     }
 }
+
+#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+void LLGLSLShader::setLabel(const char* label) {
+    LL_LABEL_OBJECT_GL(GL_PROGRAM, mProgramObject, strlen(label), label);
+}
+
+#endif
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index c26ee014cbcc17e9ba7db27e09f54a3bad916606..fd69f43f873b83346a5014b30dc13adaa6be6118 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -294,6 +294,10 @@ class LLGLSLShader
     // this pointer should be set to whichever shader represents this shader's rigged variant
     LLGLSLShader* mRiggedVariant = nullptr;
 
+	#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+    void setLabel(const char* label);
+	#endif
+
 private:
 	void unloadInternal();
 };
@@ -305,5 +309,10 @@ extern LLGLSLShader			gSolidColorProgram;
 //Alpha mask shader (declared here so llappearance can access properly)
 extern LLGLSLShader			gAlphaMaskProgram;
 
+#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+#define LL_SET_SHADER_LABEL(shader) shader.setLabel(#shader)
+#else
+#define LL_SET_SHADER_LABEL(shader, label)
+#endif
 
 #endif
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 981175d845db887ee5e654bf4f4ad20bb5a3f38e..33dcd6c563b6914e0573ec1b417e6336c26bd848 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -175,7 +175,7 @@ U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed)
 	{
 		//make a new buffer
 		name = genBuffer();
-		
+
 		glBindBuffer(mType, name);
 
 		if (!for_seed && i < LL_VBO_POOL_SEED_COUNT)
@@ -574,6 +574,12 @@ void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_of
 	}
 }
 
+#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+void LLVertexBuffer::setLabel(const char* label) {
+	LL_LABEL_OBJECT_GL(GL_BUFFER, mGLBuffer, strlen(label), label);
+}
+#endif
+
 void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
 {
 	validateRange(start, end, count, indices_offset);
@@ -1068,6 +1074,7 @@ bool LLVertexBuffer::createGLBuffer(U32 size)
 	{
 		static int gl_buffer_idx = 0;
 		mGLBuffer = ++gl_buffer_idx;
+
 		mMappedData = (U8*)ll_aligned_malloc_16(size);
 		mSize = size;
 	}
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index a7907f9caece4de27ca1e85910382db64ca94f77..d6f681e4cad421f5ed889ce84a1f646885b529d2 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -300,6 +300,9 @@ class LLVertexBuffer : public LLRefCount
 	//for debugging, validate data in given range is valid
 	void validateRange(U32 start, U32 end, U32 count, U32 offset) const;
 
+	#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+	void setLabel(const char* label);
+	#endif
 	
 
 protected:	
@@ -370,5 +373,11 @@ class LLVertexBuffer : public LLRefCount
 	static U32 sSetCount;
 };
 
+#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+#define LL_LABEL_VERTEX_BUFFER(buf, name) buf->setLabel(name)
+#else
+#define LL_LABEL_VERTEX_BUFFER(buf, name)
+#endif
+
 
 #endif // LL_LLVERTEXBUFFER_H
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 0fcb2b2e58588fbba57c915d0e6fcf8877d027d3..2b7ace7ae546e69bf35d8c508d20b0abdb80b2a4 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -201,6 +201,142 @@ class LLRenderPass : public LLDrawPool
 		NUM_RENDER_TYPES,
 	};
 
+	#ifdef LL_PROFILER_ENABLE_TRACY_OPENGL
+    static inline const char* lookupPassName(U32 pass)
+    {
+        switch (pass)
+        {
+            case PASS_SIMPLE:
+                return "PASS_SIMPLE";
+            case PASS_SIMPLE_RIGGED:
+                return "PASS_SIMPLE_RIGGED";
+            case PASS_GRASS:
+                return "PASS_GRASS";
+            case PASS_FULLBRIGHT:
+                return "PASS_FULLBRIGHT";
+            case PASS_FULLBRIGHT_RIGGED:
+                return "PASS_FULLBRIGHT_RIGGED";
+            case PASS_INVISIBLE:
+                return "PASS_INVISIBLE";
+            case PASS_INVISIBLE_RIGGED:
+                return "PASS_INVISIBLE_RIGGED";
+            case PASS_INVISI_SHINY:
+                return "PASS_INVISI_SHINY";
+            case PASS_INVISI_SHINY_RIGGED:
+                return "PASS_INVISI_SHINY_RIGGED";
+            case PASS_FULLBRIGHT_SHINY:
+                return "PASS_FULLBRIGHT_SHINY";
+            case PASS_FULLBRIGHT_SHINY_RIGGED:
+                return "PASS_FULLBRIGHT_SHINY_RIGGED";
+            case PASS_SHINY:
+                return "PASS_SHINY";
+            case PASS_SHINY_RIGGED:
+                return "PASS_SHINY_RIGGED";
+            case PASS_BUMP:
+                return "PASS_BUMP";
+            case PASS_BUMP_RIGGED:
+                return "PASS_BUMP_RIGGED";
+            case PASS_POST_BUMP:
+                return "PASS_POST_BUMP";
+            case PASS_POST_BUMP_RIGGED:
+                return "PASS_POST_BUMP_RIGGED";
+            case PASS_MATERIAL:
+                return "PASS_MATERIAL";
+            case PASS_MATERIAL_RIGGED:
+                return "PASS_MATERIAL_RIGGED";
+            case PASS_MATERIAL_ALPHA:
+                return "PASS_MATERIAL_ALPHA";
+            case PASS_MATERIAL_ALPHA_RIGGED:
+                return "PASS_MATERIAL_ALPHA_RIGGED";
+            case PASS_MATERIAL_ALPHA_MASK:
+                return "PASS_MATERIAL_ALPHA_MASK";
+            case PASS_MATERIAL_ALPHA_MASK_RIGGED:
+                return "PASS_MATERIAL_ALPHA_MASK_RIGGED";
+            case PASS_MATERIAL_ALPHA_EMISSIVE:
+                return "PASS_MATERIAL_ALPHA_EMISSIVE";
+            case PASS_MATERIAL_ALPHA_EMISSIVE_RIGGED:
+                return "PASS_MATERIAL_ALPHA_EMISSIVE_RIGGED";
+            case PASS_SPECMAP:
+                return "PASS_SPECMAP";
+            case PASS_SPECMAP_RIGGED:
+                return "PASS_SPECMAP_RIGGED";
+            case PASS_SPECMAP_BLEND:
+                return "PASS_SPECMAP_BLEND";
+            case PASS_SPECMAP_BLEND_RIGGED:
+                return "PASS_SPECMAP_BLEND_RIGGED";
+            case PASS_SPECMAP_MASK:
+                return "PASS_SPECMAP_MASK";
+            case PASS_SPECMAP_MASK_RIGGED:
+                return "PASS_SPECMAP_MASK_RIGGED";
+            case PASS_SPECMAP_EMISSIVE:
+                return "PASS_SPECMAP_EMISSIVE";
+            case PASS_SPECMAP_EMISSIVE_RIGGED:
+                return "PASS_SPECMAP_EMISSIVE_RIGGED";
+            case PASS_NORMMAP:
+                return "PASS_NORMAMAP";
+            case PASS_NORMMAP_RIGGED:
+                return "PASS_NORMMAP_RIGGED";
+            case PASS_NORMMAP_BLEND:
+                return "PASS_NORMMAP_BLEND";
+            case PASS_NORMMAP_BLEND_RIGGED:
+                return "PASS_NORMMAP_BLEND_RIGGED";
+            case PASS_NORMMAP_MASK:
+                return "PASS_NORMMAP_MASK";
+            case PASS_NORMMAP_MASK_RIGGED:
+                return "PASS_NORMMAP_MASK_RIGGED";
+            case PASS_NORMMAP_EMISSIVE:
+                return "PASS_NORMMAP_EMISSIVE";
+            case PASS_NORMMAP_EMISSIVE_RIGGED:
+                return "PASS_NORMMAP_EMISSIVE_RIGGED";
+            case PASS_NORMSPEC:
+                return "PASS_NORMSPEC";
+            case PASS_NORMSPEC_RIGGED:
+                return "PASS_NORMSPEC_RIGGED";
+            case PASS_NORMSPEC_BLEND:
+                return "PASS_NORMSPEC_BLEND";
+            case PASS_NORMSPEC_BLEND_RIGGED:
+                return "PASS_NORMSPEC_BLEND_RIGGED";
+            case PASS_NORMSPEC_MASK:
+                return "PASS_NORMSPEC_MASK";
+            case PASS_NORMSPEC_MASK_RIGGED:
+                return "PASS_NORMSPEC_MASK_RIGGED";
+            case PASS_NORMSPEC_EMISSIVE:
+                return "PASS_NORMSPEC_EMISSIVE";
+            case PASS_NORMSPEC_EMISSIVE_RIGGED:
+                return "PASS_NORMSPEC_EMISSIVE_RIGGED";
+            case PASS_GLOW:
+                return "PASS_GLOW";
+            case PASS_GLOW_RIGGED:
+                return "PASS_GLOW_RIGGED";
+            case PASS_ALPHA:
+                return "PASS_ALPHA";
+            case PASS_ALPHA_RIGGED:
+                return "PASS_ALPHA_RIGGED";
+            case PASS_ALPHA_MASK:
+                return "PASS_ALPHA_MASK";
+            case PASS_ALPHA_MASK_RIGGED:
+                return "PASS_ALPHA_MASK_RIGGED";
+            case PASS_FULLBRIGHT_ALPHA_MASK:
+                return "PASS_FULLBRIGHT_ALPHA_MASK";
+            case PASS_FULLBRIGHT_ALPHA_MASK_RIGGED:
+                return "PASS_FULLBRIGHT_ALPHA_MASK_RIGGED";
+            case PASS_ALPHA_INVISIBLE:
+                return "PASS_ALPHA_INVISIBLE";
+            case PASS_ALPHA_INVISIBLE_RIGGED:
+                return "PASS_ALPHA_INVISIBLE_RIGGED";
+            case PASS_PBR_OPAQUE:
+                return "PASS_PBR_OPAQUE";
+            case PASS_PBR_OPAQUE_RIGGED:
+                return "PASS_PBR_OPAQUE_RIGGED";
+
+            default:
+                return "Unknown pass";
+        }
+	}
+	#else
+    static inline const char* lookupPass(U32 pass) { return ""; }
+	#endif
+
 	LLRenderPass(const U32 type);
 	virtual ~LLRenderPass();
 	/*virtual*/ LLViewerTexture* getDebugTexture() { return NULL; }
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index d18997b780910c0d5e32297dc1db712ff03c68c7..d312bb75d15a357eb35b4b528035cc3e70054d33 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5319,6 +5319,8 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 		return;
 	}
 
+	LL_LABEL_VERTEX_BUFFER(facep->getVertexBuffer(), LLRenderPass::lookupPassName(type));
+
     U32 passType = type;
 
     bool rigged = facep->isState(LLFace::RIGGED);