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