Implement GL_KHR_debug.

BUG=angleproject:520

Change-Id: I9ced3e7ab1515feddf2ec103c26b2610a45b1784
Reviewed-on: https://chromium-review.googlesource.com/319830
Tryjob-Request: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index f538ce4..f885ad1 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -24,6 +24,7 @@
 
 #include "libANGLE/angletypes.h"
 #include "libANGLE/Constants.h"
+#include "libANGLE/Debug.h"
 #include "libANGLE/Error.h"
 #include "libANGLE/RefCountObject.h"
 
@@ -143,7 +144,7 @@
     unsigned int index;
 };
 
-class Program : angle::NonCopyable
+class Program final : angle::NonCopyable, public LabeledObject
 {
   public:
     class Data final : angle::NonCopyable
@@ -152,6 +153,8 @@
         Data();
         ~Data();
 
+        const std::string &getLabel();
+
         const Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
         const Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
         const std::vector<std::string> &getTransformFeedbackVaryingNames() const
@@ -191,6 +194,8 @@
       private:
         friend class Program;
 
+        std::string mLabel;
+
         Shader *mAttachedFragmentShader;
         Shader *mAttachedVertexShader;
 
@@ -224,6 +229,9 @@
 
     GLuint id() const { return mHandle; }
 
+    void setLabel(const std::string &label) override;
+    const std::string &getLabel() const override;
+
     rx::ProgramImpl *getImplementation() { return mProgram; }
     const rx::ProgramImpl *getImplementation() const { return mProgram; }