//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// LoggingAnnotator.cpp: DebugAnnotator implementing logging
//

#include "libANGLE/LoggingAnnotator.h"

#include "libANGLE/trace.h"
#include "platform/PlatformMethods.h"

namespace angle
{

bool LoggingAnnotator::getStatus(const gl::Context *context)
{
    return false;
}

void LoggingAnnotator::beginEvent(gl::Context *context,
                                  EntryPoint entryPoint,
                                  const char *eventName,
                                  const char *eventMessage)
{
    ANGLE_TRACE_EVENT_BEGIN("gpu.angle", perfetto::DynamicString(eventName));
}

void LoggingAnnotator::endEvent(gl::Context *context, const char *eventName, EntryPoint entryPoint)
{
    ANGLE_TRACE_EVENT_END("gpu.angle");
}

void LoggingAnnotator::setMarker(gl::Context *context, const char *markerName)
{
    ANGLE_TRACE_EVENT_INSTANT("gpu.angle", perfetto::DynamicString(markerName));
}

void LoggingAnnotator::logMessage(const gl::LogMessage &msg) const
{
    auto *plat = ANGLEPlatformCurrent();
    if (plat != nullptr)
    {
        switch (msg.getSeverity())
        {
            case gl::LOG_FATAL:
            case gl::LOG_ERR:
                plat->logError(plat, msg.getMessage().c_str());
                break;
            case gl::LOG_WARN:
                plat->logWarning(plat, msg.getMessage().c_str());
                break;
            case gl::LOG_INFO:
                plat->logInfo(plat, msg.getMessage().c_str());
                break;
            default:
                UNREACHABLE();
        }
    }
    gl::Trace(msg.getSeverity(), msg.getMessage().c_str());
}

}  // namespace angle
