195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com//
295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// found in the LICENSE file.
595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com//
695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com// debug.cpp: Debugging utilities.
895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#include "common/debug.h"
10a9b96d0d3198152e195a97b0a8b0ac31fe436b5ashannon.woods@transgaming.com#include "common/system.h"
1195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#include <d3d9.h>
1295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
1395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comnamespace gl
1495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
1595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
1695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comtypedef void (WINAPI *PerfOutputFunction)(D3DCOLOR, LPCWSTR);
1795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
1895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comstatic void output(bool traceFileDebugOnly, PerfOutputFunction perfFunc, const char *format, va_list vararg)
1995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
2095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#if !defined(ANGLE_DISABLE_PERF)
2195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    if (perfActive())
2295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    {
2395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        char message[32768];
2495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        int len = vsprintf_s(message, format, vararg);
2595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        if (len < 0)
2695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        {
2795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com            return;
2895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        }
2995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
3095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        // There are no ASCII variants of these D3DPERF functions.
3195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        wchar_t wideMessage[32768];
3295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        for (int i = 0; i < len; ++i)
3395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        {
3495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com            wideMessage[i] = message[i];
3595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        }
3695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        wideMessage[len] = 0;
3795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
3895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        perfFunc(0, wideMessage);
3995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    }
4095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#endif
4195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
4295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#if !defined(ANGLE_DISABLE_TRACE)
4395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#if defined(NDEBUG)
4495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    if (traceFileDebugOnly)
4595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    {
4695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        return;
4795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    }
4895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#endif
4995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
5095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    FILE* file = fopen(TRACE_OUTPUT_FILE, "a");
5195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    if (file)
5295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    {
5395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        vfprintf(file, format, vararg);
5495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        fclose(file);
5595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    }
5695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#endif
5795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
5895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
5995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comvoid trace(bool traceFileDebugOnly, const char *format, ...)
6095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
6195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    va_list vararg;
6295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    va_start(vararg, format);
6395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#if defined(ANGLE_DISABLE_PERF)
6495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    output(traceFileDebugOnly, NULL, format, vararg);
6595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#else
6695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    output(traceFileDebugOnly, D3DPERF_SetMarker, format, vararg);
6795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#endif
6895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    va_end(vararg);
6995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
7095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
7195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.combool perfActive()
7295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
7395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#if defined(ANGLE_DISABLE_PERF)
7495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    return false;
7595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#else
7695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    static bool active = D3DPERF_GetStatus() != 0;
7795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    return active;
7895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#endif
7995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
8095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
8195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comScopedPerfEventHelper::ScopedPerfEventHelper(const char* format, ...)
8295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
8395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#if !defined(ANGLE_DISABLE_PERF)
845dc3b8b47659e9632bc35277d4069610ccb0aabfdaniel@transgaming.com#if defined(ANGLE_DISABLE_TRACE)
855dc3b8b47659e9632bc35277d4069610ccb0aabfdaniel@transgaming.com    if (!perfActive())
865dc3b8b47659e9632bc35277d4069610ccb0aabfdaniel@transgaming.com    {
875dc3b8b47659e9632bc35277d4069610ccb0aabfdaniel@transgaming.com        return;
885dc3b8b47659e9632bc35277d4069610ccb0aabfdaniel@transgaming.com    }
895dc3b8b47659e9632bc35277d4069610ccb0aabfdaniel@transgaming.com#endif
9095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    va_list vararg;
9195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    va_start(vararg, format);
9295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    output(true, reinterpret_cast<PerfOutputFunction>(D3DPERF_BeginEvent), format, vararg);
9395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    va_end(vararg);
9495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#endif
9595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
9695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com
9795a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.comScopedPerfEventHelper::~ScopedPerfEventHelper()
9895a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com{
9995a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#if !defined(ANGLE_DISABLE_PERF)
10095a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    if (perfActive())
10195a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    {
10295a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com        D3DPERF_EndEvent();
10395a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com    }
10495a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com#endif
10595a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
10695a758f3aaecea686132ea2a602e1612057c32abdaniel@transgaming.com}
107