tor-browser

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

DebugAnnotator11.cpp (4557B)


      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 // DebugAnnotator11.cpp: D3D11 helpers for adding trace annotations.
      7 //
      8 
      9 #include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h"
     10 
     11 #include "libANGLE/renderer/d3d/d3d11/Context11.h"
     12 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
     13 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
     14 
     15 #include <versionhelpers.h>
     16 
     17 #include "common/system_utils.h"
     18 
     19 namespace rx
     20 {
     21 
     22 // DebugAnnotator11 implementation
     23 DebugAnnotator11::DebugAnnotator11() {}
     24 
     25 DebugAnnotator11::~DebugAnnotator11() {}
     26 
     27 void DebugAnnotator11::beginEvent(gl::Context *context,
     28                                  angle::EntryPoint entryPoint,
     29                                  const char *eventName,
     30                                  const char *eventMessage)
     31 {
     32    angle::LoggingAnnotator::beginEvent(context, entryPoint, eventName, eventMessage);
     33    if (!context)
     34    {
     35        return;
     36    }
     37    Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
     38    renderer11->getDebugAnnotatorContext()->beginEvent(entryPoint, eventName, eventMessage);
     39 }
     40 
     41 void DebugAnnotator11::endEvent(gl::Context *context,
     42                                const char *eventName,
     43                                angle::EntryPoint entryPoint)
     44 {
     45    angle::LoggingAnnotator::endEvent(context, eventName, entryPoint);
     46    if (!context)
     47    {
     48        return;
     49    }
     50    Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
     51    renderer11->getDebugAnnotatorContext()->endEvent(eventName, entryPoint);
     52 }
     53 
     54 void DebugAnnotator11::setMarker(gl::Context *context, const char *markerName)
     55 {
     56    angle::LoggingAnnotator::setMarker(context, markerName);
     57    if (!context)
     58    {
     59        return;
     60    }
     61    Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
     62    renderer11->getDebugAnnotatorContext()->setMarker(markerName);
     63 }
     64 
     65 bool DebugAnnotator11::getStatus(const gl::Context *context)
     66 {
     67    if (!context)
     68    {
     69        return false;
     70    }
     71    Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
     72    return renderer11->getDebugAnnotatorContext()->getStatus();
     73 }
     74 
     75 // DebugAnnotatorContext11 implemenetation
     76 DebugAnnotatorContext11::DebugAnnotatorContext11() = default;
     77 
     78 DebugAnnotatorContext11::~DebugAnnotatorContext11() = default;
     79 
     80 void DebugAnnotatorContext11::beginEvent(angle::EntryPoint entryPoint,
     81                                         const char *eventName,
     82                                         const char *eventMessage)
     83 {
     84    if (loggingEnabledForThisThread())
     85    {
     86        std::mbstate_t state = std::mbstate_t();
     87        std::mbsrtowcs(mWCharMessage, &eventMessage, kMaxMessageLength, &state);
     88        mUserDefinedAnnotation->BeginEvent(mWCharMessage);
     89    }
     90 }
     91 
     92 void DebugAnnotatorContext11::endEvent(const char *eventName, angle::EntryPoint entryPoint)
     93 {
     94    if (loggingEnabledForThisThread())
     95    {
     96        mUserDefinedAnnotation->EndEvent();
     97    }
     98 }
     99 
    100 void DebugAnnotatorContext11::setMarker(const char *markerName)
    101 {
    102    if (loggingEnabledForThisThread())
    103    {
    104        std::mbstate_t state = std::mbstate_t();
    105        std::mbsrtowcs(mWCharMessage, &markerName, kMaxMessageLength, &state);
    106        mUserDefinedAnnotation->SetMarker(mWCharMessage);
    107    }
    108 }
    109 
    110 bool DebugAnnotatorContext11::getStatus() const
    111 {
    112    if (loggingEnabledForThisThread())
    113    {
    114        return !!(mUserDefinedAnnotation->GetStatus());
    115    }
    116 
    117    return false;
    118 }
    119 
    120 bool DebugAnnotatorContext11::loggingEnabledForThisThread() const
    121 {
    122    return mUserDefinedAnnotation != nullptr &&
    123           angle::GetCurrentThreadUniqueId() == mAnnotationThread;
    124 }
    125 
    126 void DebugAnnotatorContext11::initialize(ID3D11DeviceContext *context)
    127 {
    128 #if !defined(ANGLE_ENABLE_WINDOWS_UWP)
    129    // ID3DUserDefinedAnnotation.GetStatus only works on Windows10 or greater.
    130    // Returning true unconditionally from DebugAnnotatorContext11::getStatus() means
    131    // writing out all compiled shaders to temporary files even if debugging
    132    // tools are not attached. See rx::ShaderD3D::prepareSourceAndReturnOptions.
    133    // If you want debug annotations, you must use Windows 10.
    134    if (IsWindows10OrGreater())
    135 #endif
    136    {
    137        mAnnotationThread = angle::GetCurrentThreadUniqueId();
    138        mUserDefinedAnnotation.Attach(
    139            d3d11::DynamicCastComObject<ID3DUserDefinedAnnotation>(context));
    140    }
    141 }
    142 
    143 void DebugAnnotatorContext11::release()
    144 {
    145    mUserDefinedAnnotation.Reset();
    146 }
    147 
    148 }  // namespace rx