// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file contains the Logger class.

#ifndef GPU_COMMAND_BUFFER_SERVICE_LOGGER_H_
#define GPU_COMMAND_BUFFER_SERVICE_LOGGER_H_

#include <stdint.h>

#include <string>

#include "base/callback.h"
#include "base/macros.h"
#include "gpu/gpu_gles2_export.h"

namespace gpu {

namespace gles2 {

class DebugMarkerManager;

class GPU_GLES2_EXPORT Logger {
 public:
  static const int kMaxLogMessages = 256;

  using LogMessageCallback = base::RepeatingCallback<void(const std::string&)>;

  Logger(const DebugMarkerManager* debug_marker_manager,
         const LogMessageCallback& callback);
  ~Logger();

  void LogMessage(const char* filename, int line, const std::string& msg);
  const std::string& GetLogPrefix() const;

  // Defaults to true. Set to false for the gpu_unittests as they
  // are explicitly checking errors are generated and so don't need the numerous
  // messages. Otherwise, chromium code that generates these errors likely has a
  // bug.
  void set_log_synthesized_gl_errors(bool enabled) {
    log_synthesized_gl_errors_ = enabled;
  }

 private:
  // Uses the current marker to add information to logs.
  const DebugMarkerManager* debug_marker_manager_;
  const LogMessageCallback log_message_callback_;
  std::string this_in_hex_;

  int log_message_count_;
  bool log_synthesized_gl_errors_;

  DISALLOW_COPY_AND_ASSIGN(Logger);
};

}  // namespace gles2
}  // namespace gpu

#endif  // GPU_COMMAND_BUFFER_SERVICE_LOGGER_H_
