// Copyright (c) 2012 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.

#include "common/event_tracer.h"

namespace gl
{

GetCategoryEnabledFlagFunc g_getCategoryEnabledFlag;
AddTraceEventFunc g_addTraceEvent;

}  // namespace gl

extern "C" {

void __stdcall SetTraceFunctionPointers(GetCategoryEnabledFlagFunc getCategoryEnabledFlag,
                                        AddTraceEventFunc addTraceEvent)
{
    gl::g_getCategoryEnabledFlag = getCategoryEnabledFlag;
    gl::g_addTraceEvent = addTraceEvent;
}

}  // extern "C"

namespace gl
{

const unsigned char* TraceGetTraceCategoryEnabledFlag(const char* name)
{
    if (g_getCategoryEnabledFlag)
    {
        return g_getCategoryEnabledFlag(name);
    }
    static unsigned char disabled = 0;
    return &disabled;
}

void TraceAddTraceEvent(char phase, const unsigned char* categoryGroupEnabled, const char* name, unsigned long long id,
                        int numArgs, const char** argNames, const unsigned char* argTypes,
                        const unsigned long long* argValues, unsigned char flags)
{
    if (g_addTraceEvent)
    {
        g_addTraceEvent(phase, categoryGroupEnabled, name, id, numArgs, argNames, argTypes, argValues, flags);
    }
}

}  // namespace gl
