Moved logging functionality of out of the GLES2 Command Decoder into a separate Logger class (in an attempt to start simplifying the Decoder).

Testing: Building/running GPU tests works.


Review URL: https://chromiumcodereview.appspot.com/13600009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@193461 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 8aea573..760b580 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -42,6 +42,7 @@
 #include "gpu/command_buffer/service/gpu_switches.h"
 #include "gpu/command_buffer/service/gpu_tracer.h"
 #include "gpu/command_buffer/service/image_manager.h"
+#include "gpu/command_buffer/service/logger.h"
 #include "gpu/command_buffer/service/mailbox_manager.h"
 #include "gpu/command_buffer/service/memory_tracking.h"
 #include "gpu/command_buffer/service/program_manager.h"
@@ -534,8 +535,7 @@
 GLES2Decoder::GLES2Decoder()
     : initialized_(false),
       debug_(false),
-      log_commands_(false),
-      log_synthesized_gl_errors_(true) {
+      log_commands_(false) {
 }
 
 GLES2Decoder::~GLES2Decoder() {
@@ -638,7 +638,8 @@
   virtual void SetResizeCallback(
       const base::Callback<void(gfx::Size)>& callback) OVERRIDE;
 
-  virtual void SetMsgCallback(const MsgCallback& callback) OVERRIDE;
+  virtual Logger* GetLogger() OVERRIDE;
+
   virtual void SetShaderCacheCallback(
       const ShaderCacheCallback& callback) OVERRIDE;
   virtual void SetWaitSyncPointCallback(
@@ -960,7 +961,7 @@
   void LogClientServiceMapping(
       const char* function_name, GLuint client_id, GLuint service_id) {
     if (service_logging_) {
-      DLOG(INFO) << "[" << GetLogPrefix() << "] " << function_name
+      DLOG(INFO) << "[" << logger_.GetLogPrefix() << "] " << function_name
                  << ": client_id = " << client_id
                  << ", service_id = " << service_id;
     }
@@ -1603,11 +1604,9 @@
     GLsizei width, GLsizei height, GLenum format,
     Texture* texture);
 
-  void LogMessage(const char* filename, int line, const std::string& msg);
   void RenderWarning(const char* filename, int line, const std::string& msg);
   void PerformanceWarning(
       const char* filename, int line, const std::string& msg);
-  const std::string& GetLogPrefix() const;
 
   const FeatureInfo::FeatureFlags& features() const {
     return feature_info_->feature_flags();
@@ -1649,6 +1648,9 @@
   // The ContextGroup for this decoder uses to track resources.
   scoped_refptr<ContextGroup> group_;
 
+  DebugMarkerManager debug_marker_manager_;
+  Logger logger_;
+
   // All the state for this context.
   ContextState state_;
 
@@ -1729,7 +1731,6 @@
 
   base::Callback<void(gfx::Size)> resize_callback_;
 
-  MsgCallback msg_callback_;
   WaitSyncPointCallback wait_sync_point_callback_;
 
   ShaderCacheCallback shader_cache_callback_;
@@ -1750,14 +1751,9 @@
   // The last error message set.
   std::string last_error_;
 
-  int log_message_count_;
-
   // The current decoder error.
   error::Error current_decoder_error_;
 
-  DebugMarkerManager debug_marker_manager_;
-  std::string this_in_hex_;
-
   bool use_shader_translator_;
   scoped_refptr<ShaderTranslator> vertex_translator_;
   scoped_refptr<ShaderTranslator> fragment_translator_;
@@ -2204,6 +2200,7 @@
 GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
     : GLES2Decoder(),
       group_(group),
+      logger_(&debug_marker_manager_),
       state_(group_->feature_info()),
       error_bits_(0),
       unpack_flip_y_(false),
@@ -2227,7 +2224,6 @@
       back_buffer_has_stencil_(false),
       backbuffer_needs_clear_bits_(0),
       teximage2d_faster_than_texsubimage2d_(true),
-      log_message_count_(0),
       current_decoder_error_(error::kNoError),
       use_shader_translator_(true),
       validators_(group_->feature_info()->validators()),
@@ -2246,9 +2242,6 @@
       texture_upload_count_(0) {
   DCHECK(group);
 
-  GLES2DecoderImpl* this_temp = this;
-  this_in_hex_ = HexEncode(&this_temp, sizeof(this_temp));
-
   attrib_0_value_.v[0] = 0.0f;
   attrib_0_value_.v[1] = 0.0f;
   attrib_0_value_.v[2] = 0.0f;
@@ -3127,8 +3120,8 @@
   resize_callback_ = callback;
 }
 
-void GLES2DecoderImpl::SetMsgCallback(const MsgCallback& callback) {
-  msg_callback_ = callback;
+Logger* GLES2DecoderImpl::GetLogger() {
+  return &logger_;
 }
 
 void GLES2DecoderImpl::SetShaderCacheCallback(
@@ -3575,7 +3568,7 @@
   if (log_commands()) {
     // TODO(notme): Change this to a LOG/VLOG that works in release. Tried
     // LOG(INFO), tried VLOG(1), no luck.
-    LOG(ERROR) << "[" << GetLogPrefix() << "]" << "cmd: "
+    LOG(ERROR) << "[" << logger_.GetLogPrefix() << "]" << "cmd: "
                << GetCommandName(command);
   }
   unsigned int command_index = command - kStartPoint - 1;
@@ -3600,7 +3593,7 @@
       if (debug()) {
         GLenum error;
         while ((error = glGetError()) != GL_NO_ERROR) {
-          LOG(ERROR) << "[" << GetLogPrefix() << "] "
+          LOG(ERROR) << "[" << logger_.GetLogPrefix() << "] "
                      << "GL ERROR: " << GLES2Util::GetStringEnum(error) << " : "
                      << GetCommandName(command);
           LOCAL_SET_GL_ERROR(error, "DoCommand", "GL error from driver");
@@ -5733,8 +5726,8 @@
     unsigned error, const char* function_name, const char* msg) {
   if (msg) {
     last_error_ = msg;
-    LogMessage(filename, line,
-               GetLogPrefix() + ": " + std::string("GL ERROR :") +
+    logger_.LogMessage(filename, line,
+               logger_.GetLogPrefix() + ": " + std::string("GL ERROR :") +
                GLES2Util::GetStringEnum(error) + " : " +
                function_name + ": " + msg);
   }
@@ -5771,44 +5764,15 @@
   }
 }
 
-const std::string& GLES2DecoderImpl::GetLogPrefix() const {
-  const std::string& prefix(debug_marker_manager_.GetMarker());
-  return prefix.empty() ? this_in_hex_ : prefix;
-}
-
-void GLES2DecoderImpl::LogMessage(
-    const char* filename, int line, const std::string& msg) {
-  if (log_message_count_ < kMaxLogMessages ||
-      CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kDisableGLErrorLimit)) {
-    ++log_message_count_;
-    // LOG this unless logging is turned off as any chromium code that
-    // generates these errors probably has a bug.
-    if (log_synthesized_gl_errors()) {
-      ::logging::LogMessage(
-          filename, line, ::logging::LOG_ERROR).stream() << msg;
-    }
-    if (!msg_callback_.is_null()) {
-      msg_callback_.Run(0, msg);
-    }
-  } else {
-    if (log_message_count_ == kMaxLogMessages) {
-      ++log_message_count_;
-      LOG(ERROR)
-          << "Too many GL errors, not reporting any more for this context."
-          << " use --disable-gl-error-limit to see all errors.";
-    }
-  }
-}
-
 void GLES2DecoderImpl::RenderWarning(
     const char* filename, int line, const std::string& msg) {
-  LogMessage(filename, line, std::string("RENDER WARNING: ") + msg);
+  logger_.LogMessage(filename, line, std::string("RENDER WARNING: ") + msg);
 }
 
 void GLES2DecoderImpl::PerformanceWarning(
     const char* filename, int line, const std::string& msg) {
-  LogMessage(filename, line, std::string("PERFORMANCE WARNING: ") + msg);
+  logger_.LogMessage(filename, line, std::string("PERFORMANCE WARNING: ")
+                     + msg);
 }
 
 void GLES2DecoderImpl::ForceCompileShaderIfPending(Shader* shader) {
@@ -5843,8 +5807,8 @@
   while ((error = glGetError()) != GL_NO_ERROR) {
     if (error != GL_OUT_OF_MEMORY) {
       // GL_OUT_OF_MEMORY can legally happen on lost device.
-      LogMessage(filename, line,
-                 GetLogPrefix() + ": " + std::string("GL ERROR :") +
+      logger_.LogMessage(filename, line,
+                 logger_.GetLogPrefix() + ": " + std::string("GL ERROR :") +
                  GLES2Util::GetStringEnum(error) + " : " +
                  function_name + ": was unhandled");
       NOTREACHED() << "GL error " << error << " was unhandled.";
@@ -10035,7 +9999,7 @@
 void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target,
                                                 const GLbyte* mailbox) {
   TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoProduceTextureCHROMIUM",
-      "context", GetLogPrefix(),
+      "context", logger_.GetLogPrefix(),
       "mailbox[0]", static_cast<unsigned char>(mailbox[0]));
 
   Texture* texture = GetTextureInfoForTarget(target);
@@ -10074,7 +10038,7 @@
 void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target,
                                                 const GLbyte* mailbox) {
   TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoConsumeTextureCHROMIUM",
-      "context", GetLogPrefix(),
+      "context", logger_.GetLogPrefix(),
       "mailbox[0]", static_cast<unsigned char>(mailbox[0]));
 
   Texture* texture = GetTextureInfoForTarget(target);