From 9f3fc067bf6fd1a26f48213e73f32f1635cbd04d Mon Sep 17 00:00:00 2001
From: David <25727384+ogniK5377@users.noreply.github.com>
Date: Mon, 24 Sep 2018 07:55:41 +1000
Subject: [PATCH] Added glObjectLabels for renderdoc for textures and shader
 programs (#1384)

* Added glObjectLabels for renderdoc for textures and shader programs

* Changed hardcoded "Texture" name to reflect the texture type instead

* Removed string initialize
---
 .../renderer_opengl/gl_rasterizer_cache.cpp   |  3 +++
 .../renderer_opengl/gl_rasterizer_cache.h     | 21 ++++++++++++++++++
 .../renderer_opengl/gl_shader_cache.cpp       |  2 ++
 src/video_core/utils.h                        | 22 +++++++++++++++++++
 4 files changed, 48 insertions(+)

diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index f9d97d928..24a540258 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -501,6 +501,9 @@ CachedSurface::CachedSurface(const SurfaceParams& params)
     glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+    VideoCore::LabelGLObject(GL_TEXTURE, texture.handle, params.addr,
+                             SurfaceParams::SurfaceTargetName(params.target));
 }
 
 static void ConvertS8Z24ToZ24S8(std::vector<u8>& data, u32 width, u32 height) {
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index d7a4bc37f..80c5f324b 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -137,6 +137,27 @@ struct SurfaceParams {
         }
     }
 
+    static std::string SurfaceTargetName(SurfaceTarget target) {
+        switch (target) {
+        case SurfaceTarget::Texture1D:
+            return "Texture1D";
+        case SurfaceTarget::Texture2D:
+            return "Texture2D";
+        case SurfaceTarget::Texture3D:
+            return "Texture3D";
+        case SurfaceTarget::Texture1DArray:
+            return "Texture1DArray";
+        case SurfaceTarget::Texture2DArray:
+            return "Texture2DArray";
+        case SurfaceTarget::TextureCubemap:
+            return "TextureCubemap";
+        default:
+            LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", static_cast<u32>(target));
+            UNREACHABLE();
+            return fmt::format("TextureUnknown({})", static_cast<u32>(target));
+        }
+    }
+
     /**
      * Gets the compression factor for the specified PixelFormat. This applies to just the
      * "compressed width" and "compressed height", not the overall compression factor of a
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 894fe6eae..7cd8f91e4 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -8,6 +8,7 @@
 #include "video_core/engines/maxwell_3d.h"
 #include "video_core/renderer_opengl/gl_shader_cache.h"
 #include "video_core/renderer_opengl/gl_shader_manager.h"
+#include "video_core/utils.h"
 
 namespace OpenGL {
 
@@ -83,6 +84,7 @@ CachedShader::CachedShader(VAddr addr, Maxwell::ShaderProgram program_type)
     shader.Create(program_result.first.c_str(), gl_type);
     program.Create(true, shader.handle);
     SetShaderUniformBlockBindings(program.handle);
+    VideoCore::LabelGLObject(GL_PROGRAM, program.handle, addr);
 }
 
 GLuint CachedShader::GetProgramResourceIndex(const GLShader::ConstBufferEntry& buffer) {
diff --git a/src/video_core/utils.h b/src/video_core/utils.h
index e0a14d48f..681919ae3 100644
--- a/src/video_core/utils.h
+++ b/src/video_core/utils.h
@@ -161,4 +161,26 @@ static inline void MortonCopyPixels128(u32 width, u32 height, u32 bytes_per_pixe
     }
 }
 
+static void LabelGLObject(GLenum identifier, GLuint handle, VAddr addr,
+                          std::string extra_info = "") {
+    if (!GLAD_GL_KHR_debug) {
+        return; // We don't need to throw an error as this is just for debugging
+    }
+    const std::string nice_addr = fmt::format("0x{:016x}", addr);
+    std::string object_label;
+
+    switch (identifier) {
+    case GL_TEXTURE:
+        object_label = extra_info + "@" + nice_addr;
+        break;
+    case GL_PROGRAM:
+        object_label = "ShaderProgram@" + nice_addr;
+        break;
+    default:
+        object_label = fmt::format("Object(0x{:x})@{}", identifier, nice_addr);
+        break;
+    }
+    glObjectLabel(identifier, handle, -1, static_cast<const GLchar*>(object_label.c_str()));
+}
+
 } // namespace VideoCore