Hash :
d64c54e3
Author :
Date :
2022-09-26T21:25:18
D3D11: Make DebugAnnotator11 thread safe. Bug: chromium:1366778 Change-Id: I50662895be8ec40de4ded8c4f84bde59ae40e98b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3917936 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Quyen Le <lehoangquyen@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// DebugAnnotator11.cpp: D3D11 helpers for adding trace annotations.
//
#include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h"
#include "libANGLE/renderer/d3d/d3d11/Context11.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
#include <versionhelpers.h>
#include "common/system_utils.h"
namespace rx
{
// DebugAnnotator11 implementation
DebugAnnotator11::DebugAnnotator11() {}
DebugAnnotator11::~DebugAnnotator11() {}
void DebugAnnotator11::beginEvent(gl::Context *context,
angle::EntryPoint entryPoint,
const char *eventName,
const char *eventMessage)
{
angle::LoggingAnnotator::beginEvent(context, entryPoint, eventName, eventMessage);
if (!context)
{
return;
}
Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
renderer11->getDebugAnnotatorContext()->beginEvent(entryPoint, eventName, eventMessage);
}
void DebugAnnotator11::endEvent(gl::Context *context,
const char *eventName,
angle::EntryPoint entryPoint)
{
angle::LoggingAnnotator::endEvent(context, eventName, entryPoint);
if (!context)
{
return;
}
Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
renderer11->getDebugAnnotatorContext()->endEvent(eventName, entryPoint);
}
void DebugAnnotator11::setMarker(gl::Context *context, const char *markerName)
{
angle::LoggingAnnotator::setMarker(context, markerName);
if (!context)
{
return;
}
Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
renderer11->getDebugAnnotatorContext()->setMarker(markerName);
}
bool DebugAnnotator11::getStatus(const gl::Context *context)
{
if (!context)
{
return false;
}
Renderer11 *renderer11 = GetImplAs<Context11>(context)->getRenderer();
return renderer11->getDebugAnnotatorContext()->getStatus();
}
// DebugAnnotatorContext11 implemenetation
DebugAnnotatorContext11::DebugAnnotatorContext11() = default;
DebugAnnotatorContext11::~DebugAnnotatorContext11() = default;
void DebugAnnotatorContext11::beginEvent(angle::EntryPoint entryPoint,
const char *eventName,
const char *eventMessage)
{
if (loggingEnabledForThisThread())
{
std::mbstate_t state = std::mbstate_t();
std::mbsrtowcs(mWCharMessage, &eventMessage, kMaxMessageLength, &state);
mUserDefinedAnnotation->BeginEvent(mWCharMessage);
}
}
void DebugAnnotatorContext11::endEvent(const char *eventName, angle::EntryPoint entryPoint)
{
if (loggingEnabledForThisThread())
{
mUserDefinedAnnotation->EndEvent();
}
}
void DebugAnnotatorContext11::setMarker(const char *markerName)
{
if (loggingEnabledForThisThread())
{
std::mbstate_t state = std::mbstate_t();
std::mbsrtowcs(mWCharMessage, &markerName, kMaxMessageLength, &state);
mUserDefinedAnnotation->SetMarker(mWCharMessage);
}
}
bool DebugAnnotatorContext11::getStatus() const
{
if (loggingEnabledForThisThread())
{
return !!(mUserDefinedAnnotation->GetStatus());
}
return false;
}
bool DebugAnnotatorContext11::loggingEnabledForThisThread() const
{
return mUserDefinedAnnotation != nullptr &&
angle::GetCurrentThreadUniqueId() == mAnnotationThread;
}
void DebugAnnotatorContext11::initialize(ID3D11DeviceContext *context)
{
#if !defined(ANGLE_ENABLE_WINDOWS_UWP)
// ID3DUserDefinedAnnotation.GetStatus only works on Windows10 or greater.
// Returning true unconditionally from DebugAnnotatorContext11::getStatus() means
// writing out all compiled shaders to temporary files even if debugging
// tools are not attached. See rx::ShaderD3D::prepareSourceAndReturnOptions.
// If you want debug annotations, you must use Windows 10.
if (IsWindows10OrGreater())
#endif
{
mAnnotationThread = angle::GetCurrentThreadUniqueId();
mUserDefinedAnnotation.Attach(
d3d11::DynamicCastComObject<ID3DUserDefinedAnnotation>(context));
}
}
void DebugAnnotatorContext11::release()
{
mUserDefinedAnnotation.Reset();
}
} // namespace rx