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