1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // debug.h: Debugging utilities. A lot of the logging code is adapted from Chromium's 8*8975f5c5SAndroid Build Coastguard Worker // base/logging.h. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_DEBUG_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define COMMON_DEBUG_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <assert.h> 14*8975f5c5SAndroid Build Coastguard Worker #include <stdio.h> 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Worker #include <iomanip> 17*8975f5c5SAndroid Build Coastguard Worker #include <ios> 18*8975f5c5SAndroid Build Coastguard Worker #include <mutex> 19*8975f5c5SAndroid Build Coastguard Worker #include <sstream> 20*8975f5c5SAndroid Build Coastguard Worker #include <string> 21*8975f5c5SAndroid Build Coastguard Worker 22*8975f5c5SAndroid Build Coastguard Worker #include "common/SimpleMutex.h" 23*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 24*8975f5c5SAndroid Build Coastguard Worker #include "common/entry_points_enum_autogen.h" 25*8975f5c5SAndroid Build Coastguard Worker #include "common/log_utils.h" 26*8975f5c5SAndroid Build Coastguard Worker #include "common/platform.h" 27*8975f5c5SAndroid Build Coastguard Worker 28*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS) 29*8975f5c5SAndroid Build Coastguard Worker # include <sal.h> 30*8975f5c5SAndroid Build Coastguard Worker typedef unsigned long DWORD; 31*8975f5c5SAndroid Build Coastguard Worker typedef _Return_type_success_(return >= 0) long HRESULT; 32*8975f5c5SAndroid Build Coastguard Worker #endif 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker #if !defined(TRACE_OUTPUT_FILE) 35*8975f5c5SAndroid Build Coastguard Worker # define TRACE_OUTPUT_FILE "angle_debug.txt" 36*8975f5c5SAndroid Build Coastguard Worker #endif 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard Worker namespace gl 39*8975f5c5SAndroid Build Coastguard Worker { 40*8975f5c5SAndroid Build Coastguard Worker class Context; 41*8975f5c5SAndroid Build Coastguard Worker 42*8975f5c5SAndroid Build Coastguard Worker // Pairs a begin event with an end event. 43*8975f5c5SAndroid Build Coastguard Worker class [[nodiscard]] ScopedPerfEventHelper : angle::NonCopyable 44*8975f5c5SAndroid Build Coastguard Worker { 45*8975f5c5SAndroid Build Coastguard Worker public: 46*8975f5c5SAndroid Build Coastguard Worker ScopedPerfEventHelper(Context *context, angle::EntryPoint entryPoint); 47*8975f5c5SAndroid Build Coastguard Worker ~ScopedPerfEventHelper(); 48*8975f5c5SAndroid Build Coastguard Worker ANGLE_FORMAT_PRINTF(2, 3) 49*8975f5c5SAndroid Build Coastguard Worker void begin(const char *format, ...); 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Worker private: 52*8975f5c5SAndroid Build Coastguard Worker gl::Context *mContext; 53*8975f5c5SAndroid Build Coastguard Worker const angle::EntryPoint mEntryPoint; 54*8975f5c5SAndroid Build Coastguard Worker const char *mFunctionName; 55*8975f5c5SAndroid Build Coastguard Worker bool mCalledBeginEvent; 56*8975f5c5SAndroid Build Coastguard Worker }; 57*8975f5c5SAndroid Build Coastguard Worker 58*8975f5c5SAndroid Build Coastguard Worker // Wraps the API/Platform-specific debug annotation functions. 59*8975f5c5SAndroid Build Coastguard Worker // Also handles redirecting logging destination. 60*8975f5c5SAndroid Build Coastguard Worker class DebugAnnotator : angle::NonCopyable 61*8975f5c5SAndroid Build Coastguard Worker { 62*8975f5c5SAndroid Build Coastguard Worker public: DebugAnnotator()63*8975f5c5SAndroid Build Coastguard Worker DebugAnnotator() {} ~DebugAnnotator()64*8975f5c5SAndroid Build Coastguard Worker virtual ~DebugAnnotator() {} 65*8975f5c5SAndroid Build Coastguard Worker virtual void beginEvent(gl::Context *context, 66*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint, 67*8975f5c5SAndroid Build Coastguard Worker const char *eventName, 68*8975f5c5SAndroid Build Coastguard Worker const char *eventMessage) = 0; 69*8975f5c5SAndroid Build Coastguard Worker virtual void endEvent(gl::Context *context, 70*8975f5c5SAndroid Build Coastguard Worker const char *eventName, 71*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint) = 0; 72*8975f5c5SAndroid Build Coastguard Worker virtual void setMarker(gl::Context *context, const char *markerName) = 0; 73*8975f5c5SAndroid Build Coastguard Worker virtual bool getStatus(const gl::Context *context) = 0; 74*8975f5c5SAndroid Build Coastguard Worker // Log Message Handler that gets passed every log message, 75*8975f5c5SAndroid Build Coastguard Worker // when debug annotations are initialized, 76*8975f5c5SAndroid Build Coastguard Worker // replacing default handling by LogMessage. 77*8975f5c5SAndroid Build Coastguard Worker virtual void logMessage(const LogMessage &msg) const = 0; 78*8975f5c5SAndroid Build Coastguard Worker }; 79*8975f5c5SAndroid Build Coastguard Worker 80*8975f5c5SAndroid Build Coastguard Worker void InitializeDebugAnnotations(DebugAnnotator *debugAnnotator); 81*8975f5c5SAndroid Build Coastguard Worker void UninitializeDebugAnnotations(); 82*8975f5c5SAndroid Build Coastguard Worker bool DebugAnnotationsActive(const gl::Context *context); 83*8975f5c5SAndroid Build Coastguard Worker bool DebugAnnotationsInitialized(); 84*8975f5c5SAndroid Build Coastguard Worker 85*8975f5c5SAndroid Build Coastguard Worker void InitializeDebugMutexIfNeeded(); 86*8975f5c5SAndroid Build Coastguard Worker 87*8975f5c5SAndroid Build Coastguard Worker angle::SimpleMutex &GetDebugMutex(); 88*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 89*8975f5c5SAndroid Build Coastguard Worker 90*8975f5c5SAndroid Build Coastguard Worker // The state tracked by ANGLE will be validated with the driver state before each call 91*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_DEBUG_TRACE) 92*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_STATE_VALIDATION_ENABLED 93*8975f5c5SAndroid Build Coastguard Worker #endif 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker #if defined(__GNUC__) 96*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_CRASH() __builtin_trap() 97*8975f5c5SAndroid Build Coastguard Worker #else 98*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_CRASH() ((void)(*(volatile char *)0 = 0)), __assume(0) 99*8975f5c5SAndroid Build Coastguard Worker #endif 100*8975f5c5SAndroid Build Coastguard Worker 101*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_UNUSED_VARIABLE(variable) (static_cast<void>(variable)) 102*8975f5c5SAndroid Build Coastguard Worker 103*8975f5c5SAndroid Build Coastguard Worker // Defining ANGLE_ENABLE_STRUCT_PADDING_WARNINGS will enable warnings when members are added to 104*8975f5c5SAndroid Build Coastguard Worker // structs to enforce packing. This is helpful for diagnosing unexpected struct sizes when making 105*8975f5c5SAndroid Build Coastguard Worker // fast cache variables. 106*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) 107*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ 108*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic push") _Pragma("clang diagnostic error \"-Wpadded\"") 109*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("clang diagnostic pop") 110*8975f5c5SAndroid Build Coastguard Worker #elif defined(__GNUC__) 111*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ 112*8975f5c5SAndroid Build Coastguard Worker _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic error \"-Wpadded\"") 113*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("GCC diagnostic pop") 114*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER) 115*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \ 116*8975f5c5SAndroid Build Coastguard Worker __pragma(warning(push)) __pragma(warning(error : 4820)) 117*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS __pragma(warning(pop)) 118*8975f5c5SAndroid Build Coastguard Worker #else 119*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS 120*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS 121*8975f5c5SAndroid Build Coastguard Worker #endif 122*8975f5c5SAndroid Build Coastguard Worker 123*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) 124*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_SUGGEST_OVERRIDE_WARNINGS \ 125*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic push") \ 126*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic ignored \"-Wsuggest-destructor-override\"") \ 127*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic ignored \"-Wsuggest-override\"") 128*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS _Pragma("clang diagnostic pop") 129*8975f5c5SAndroid Build Coastguard Worker #else 130*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_SUGGEST_OVERRIDE_WARNINGS 131*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS 132*8975f5c5SAndroid Build Coastguard Worker #endif 133*8975f5c5SAndroid Build Coastguard Worker 134*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) 135*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_EXTRA_SEMI_WARNING \ 136*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wextra-semi\"") 137*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_EXTRA_SEMI_WARNING _Pragma("clang diagnostic pop") 138*8975f5c5SAndroid Build Coastguard Worker #else 139*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_EXTRA_SEMI_WARNING 140*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_EXTRA_SEMI_WARNING 141*8975f5c5SAndroid Build Coastguard Worker #endif 142*8975f5c5SAndroid Build Coastguard Worker 143*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) 144*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_EXTRA_SEMI_STMT_WARNING \ 145*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wextra-semi-stmt\"") 146*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_EXTRA_SEMI_STMT_WARNING _Pragma("clang diagnostic pop") 147*8975f5c5SAndroid Build Coastguard Worker #else 148*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_EXTRA_SEMI_STMT_WARNING 149*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_EXTRA_SEMI_STMT_WARNING 150*8975f5c5SAndroid Build Coastguard Worker #endif 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) 153*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_SHADOWING_WARNING \ 154*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wshadow-field\"") 155*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_SHADOWING_WARNING _Pragma("clang diagnostic pop") 156*8975f5c5SAndroid Build Coastguard Worker #else 157*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_SHADOWING_WARNING 158*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_SHADOWING_WARNING 159*8975f5c5SAndroid Build Coastguard Worker #endif 160*8975f5c5SAndroid Build Coastguard Worker 161*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) 162*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_DESTRUCTOR_OVERRIDE_WARNING \ 163*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic push") \ 164*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic ignored \"-Winconsistent-missing-destructor-override\"") 165*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_DESTRUCTOR_OVERRIDE_WARNING _Pragma("clang diagnostic pop") 166*8975f5c5SAndroid Build Coastguard Worker #else 167*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_DESTRUCTOR_OVERRIDE_WARNING 168*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_DESTRUCTOR_OVERRIDE_WARNING 169*8975f5c5SAndroid Build Coastguard Worker #endif 170*8975f5c5SAndroid Build Coastguard Worker 171*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) 172*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_UNUSED_FUNCTION_WARNING \ 173*8975f5c5SAndroid Build Coastguard Worker _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wunused-function\"") 174*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_UNUSED_FUNCTION_WARNING _Pragma("clang diagnostic pop") 175*8975f5c5SAndroid Build Coastguard Worker #else 176*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_DISABLE_UNUSED_FUNCTION_WARNING 177*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_REENABLE_UNUSED_FUNCTION_WARNING 178*8975f5c5SAndroid Build Coastguard Worker #endif 179*8975f5c5SAndroid Build Coastguard Worker 180*8975f5c5SAndroid Build Coastguard Worker #endif // COMMON_DEBUG_H_ 181