tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Debug.h (5051B)


      1 //
      2 // Copyright 2015 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 
      7 // Debug.h: Defines debug state used for GL_KHR_debug
      8 
      9 #ifndef LIBANGLE_DEBUG_H_
     10 #define LIBANGLE_DEBUG_H_
     11 
     12 #include "angle_gl.h"
     13 #include "common/PackedEnums.h"
     14 #include "common/angleutils.h"
     15 #include "libANGLE/AttributeMap.h"
     16 #include "libANGLE/Error.h"
     17 
     18 #include <deque>
     19 #include <string>
     20 #include <vector>
     21 
     22 namespace gl
     23 {
     24 class Context;
     25 
     26 class LabeledObject
     27 {
     28  public:
     29    virtual ~LabeledObject() {}
     30    virtual angle::Result setLabel(const Context *context, const std::string &label) = 0;
     31    virtual const std::string &getLabel() const                                      = 0;
     32 };
     33 
     34 class Debug : angle::NonCopyable
     35 {
     36  public:
     37    Debug(bool initialDebugState);
     38    ~Debug();
     39 
     40    void setMaxLoggedMessages(GLuint maxLoggedMessages);
     41 
     42    void setOutputEnabled(bool enabled);
     43    bool isOutputEnabled() const;
     44 
     45    void setOutputSynchronous(bool synchronous);
     46    bool isOutputSynchronous() const;
     47 
     48    void setCallback(GLDEBUGPROCKHR callback, const void *userParam);
     49    GLDEBUGPROCKHR getCallback() const;
     50    const void *getUserParam() const;
     51 
     52    void insertMessage(GLenum source,
     53                       GLenum type,
     54                       GLuint id,
     55                       GLenum severity,
     56                       const std::string &message,
     57                       gl::LogSeverity logSeverity,
     58                       angle::EntryPoint entryPoint) const;
     59    void insertMessage(GLenum source,
     60                       GLenum type,
     61                       GLuint id,
     62                       GLenum severity,
     63                       std::string &&message,
     64                       gl::LogSeverity logSeverity,
     65                       angle::EntryPoint entryPoint) const;
     66 
     67    void setMessageControl(GLenum source,
     68                           GLenum type,
     69                           GLenum severity,
     70                           std::vector<GLuint> &&ids,
     71                           bool enabled);
     72    size_t getMessages(GLuint count,
     73                       GLsizei bufSize,
     74                       GLenum *sources,
     75                       GLenum *types,
     76                       GLuint *ids,
     77                       GLenum *severities,
     78                       GLsizei *lengths,
     79                       GLchar *messageLog);
     80    size_t getNextMessageLength() const;
     81    size_t getMessageCount() const;
     82 
     83    void pushGroup(GLenum source, GLuint id, std::string &&message);
     84    void popGroup();
     85    size_t getGroupStackDepth() const;
     86 
     87    // Helper for ANGLE_PERF_WARNING
     88    void insertPerfWarning(GLenum severity, const char *message, uint32_t *repeatCount) const;
     89 
     90  private:
     91    bool isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const;
     92 
     93    void pushDefaultGroup();
     94 
     95    struct Message
     96    {
     97        GLenum source;
     98        GLenum type;
     99        GLuint id;
    100        GLenum severity;
    101        std::string message;
    102    };
    103 
    104    struct Control
    105    {
    106        Control();
    107        ~Control();
    108        Control(const Control &other);
    109 
    110        GLenum source;
    111        GLenum type;
    112        GLenum severity;
    113        std::vector<GLuint> ids;
    114        bool enabled;
    115    };
    116 
    117    struct Group
    118    {
    119        Group();
    120        ~Group();
    121        Group(const Group &other);
    122 
    123        GLenum source;
    124        GLuint id;
    125        std::string message;
    126 
    127        std::vector<Control> controls;
    128    };
    129 
    130    bool mOutputEnabled;
    131    GLDEBUGPROCKHR mCallbackFunction;
    132    const void *mCallbackUserParam;
    133    mutable std::deque<Message> mMessages;
    134    GLuint mMaxLoggedMessages;
    135    bool mOutputSynchronous;
    136    std::vector<Group> mGroups;
    137 };
    138 }  // namespace gl
    139 
    140 namespace egl
    141 {
    142 class LabeledObject
    143 {
    144  public:
    145    virtual ~LabeledObject() {}
    146    virtual void setLabel(EGLLabelKHR label) = 0;
    147    virtual EGLLabelKHR getLabel() const     = 0;
    148 };
    149 
    150 class Debug : angle::NonCopyable
    151 {
    152  public:
    153    Debug();
    154 
    155    void setCallback(EGLDEBUGPROCKHR callback, const AttributeMap &attribs);
    156    EGLDEBUGPROCKHR getCallback() const;
    157    bool isMessageTypeEnabled(MessageType type) const;
    158 
    159    void insertMessage(EGLenum error,
    160                       const char *command,
    161                       MessageType messageType,
    162                       EGLLabelKHR threadLabel,
    163                       EGLLabelKHR objectLabel,
    164                       const std::string &message) const;
    165 
    166  private:
    167    EGLDEBUGPROCKHR mCallback;
    168    angle::PackedEnumBitSet<MessageType> mEnabledMessageTypes;
    169 };
    170 }  // namespace egl
    171 
    172 // Generate a perf warning.  Only outputs the same message a few times to avoid spamming the logs.
    173 #define ANGLE_PERF_WARNING(debug, severity, message)                 \
    174    do                                                               \
    175    {                                                                \
    176        static uint32_t sRepeatCount = 0;                            \
    177        (debug).insertPerfWarning(severity, message, &sRepeatCount); \
    178    } while (0)
    179 
    180 #endif  // LIBANGLE_DEBUG_H_