1 //
2 // Copyright 2020 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 // DebugAnnotatorVk.cpp: Vulkan helpers for adding trace annotations.
7 //
8 
9 #include "libANGLE/renderer/vulkan/DebugAnnotatorVk.h"
10 
11 #include "common/entry_points_enum_autogen.h"
12 #include "libANGLE/Context.h"
13 #include "libANGLE/renderer/vulkan/ContextVk.h"
14 
15 namespace rx
16 {
17 
DebugAnnotatorVk()18 DebugAnnotatorVk::DebugAnnotatorVk() {}
19 
~DebugAnnotatorVk()20 DebugAnnotatorVk::~DebugAnnotatorVk() {}
21 
beginEvent(gl::Context * context,angle::EntryPoint entryPoint,const char * eventName,const char * eventMessage)22 void DebugAnnotatorVk::beginEvent(gl::Context *context,
23                                   angle::EntryPoint entryPoint,
24                                   const char *eventName,
25                                   const char *eventMessage)
26 {
27     angle::LoggingAnnotator::beginEvent(context, entryPoint, eventName, eventMessage);
28     if (vkCmdBeginDebugUtilsLabelEXT && context)
29     {
30         ContextVk *contextVk = vk::GetImpl(static_cast<gl::Context *>(context));
31         contextVk->logEvent(eventMessage);
32     }
33 }
34 
endEvent(gl::Context * context,const char * eventName,angle::EntryPoint entryPoint)35 void DebugAnnotatorVk::endEvent(gl::Context *context,
36                                 const char *eventName,
37                                 angle::EntryPoint entryPoint)
38 {
39     angle::LoggingAnnotator::endEvent(context, eventName, entryPoint);
40     if (vkCmdBeginDebugUtilsLabelEXT && context)
41     {
42         ContextVk *contextVk = vk::GetImpl(static_cast<gl::Context *>(context));
43         if (isDrawEntryPoint(entryPoint))
44         {
45             contextVk->endEventLog(entryPoint, PipelineType::Graphics);
46         }
47         else if (isDispatchEntryPoint(entryPoint))
48         {
49             contextVk->endEventLog(entryPoint, PipelineType::Compute);
50         }
51         else if (isClearOrQueryEntryPoint(entryPoint))
52         {
53             contextVk->endEventLogForClearOrQuery();
54         }
55     }
56 }
57 
getStatus()58 bool DebugAnnotatorVk::getStatus()
59 {
60     return true;
61 }
62 
isDrawEntryPoint(angle::EntryPoint entryPoint) const63 bool DebugAnnotatorVk::isDrawEntryPoint(angle::EntryPoint entryPoint) const
64 {
65     switch (entryPoint)
66     {
67         case angle::EntryPoint::GLDrawArrays:
68         case angle::EntryPoint::GLDrawArraysIndirect:
69         case angle::EntryPoint::GLDrawArraysInstanced:
70         case angle::EntryPoint::GLDrawArraysInstancedANGLE:
71         case angle::EntryPoint::GLDrawArraysInstancedBaseInstance:
72         case angle::EntryPoint::GLDrawArraysInstancedBaseInstanceANGLE:
73         case angle::EntryPoint::GLDrawArraysInstancedEXT:
74         case angle::EntryPoint::GLDrawElements:
75         case angle::EntryPoint::GLDrawElementsBaseVertex:
76         case angle::EntryPoint::GLDrawElementsBaseVertexEXT:
77         case angle::EntryPoint::GLDrawElementsBaseVertexOES:
78         case angle::EntryPoint::GLDrawElementsIndirect:
79         case angle::EntryPoint::GLDrawElementsInstanced:
80         case angle::EntryPoint::GLDrawElementsInstancedANGLE:
81         case angle::EntryPoint::GLDrawElementsInstancedBaseInstance:
82         case angle::EntryPoint::GLDrawElementsInstancedBaseVertex:
83         case angle::EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstance:
84         case angle::EntryPoint::GLDrawElementsInstancedBaseVertexBaseInstanceANGLE:
85         case angle::EntryPoint::GLDrawElementsInstancedBaseVertexEXT:
86         case angle::EntryPoint::GLDrawElementsInstancedBaseVertexOES:
87         case angle::EntryPoint::GLDrawElementsInstancedEXT:
88         case angle::EntryPoint::GLDrawPixels:
89         case angle::EntryPoint::GLDrawRangeElements:
90         case angle::EntryPoint::GLDrawRangeElementsBaseVertex:
91         case angle::EntryPoint::GLDrawRangeElementsBaseVertexEXT:
92         case angle::EntryPoint::GLDrawRangeElementsBaseVertexOES:
93         case angle::EntryPoint::GLDrawTexfOES:
94         case angle::EntryPoint::GLDrawTexfvOES:
95         case angle::EntryPoint::GLDrawTexiOES:
96         case angle::EntryPoint::GLDrawTexivOES:
97         case angle::EntryPoint::GLDrawTexsOES:
98         case angle::EntryPoint::GLDrawTexsvOES:
99         case angle::EntryPoint::GLDrawTexxOES:
100         case angle::EntryPoint::GLDrawTexxvOES:
101         case angle::EntryPoint::GLDrawTransformFeedback:
102         case angle::EntryPoint::GLDrawTransformFeedbackInstanced:
103         case angle::EntryPoint::GLDrawTransformFeedbackStream:
104         case angle::EntryPoint::GLDrawTransformFeedbackStreamInstanced:
105             return true;
106         default:
107             return false;
108     }
109 }
110 
isDispatchEntryPoint(angle::EntryPoint entryPoint) const111 bool DebugAnnotatorVk::isDispatchEntryPoint(angle::EntryPoint entryPoint) const
112 {
113     switch (entryPoint)
114     {
115         case angle::EntryPoint::GLDispatchCompute:
116         case angle::EntryPoint::GLDispatchComputeIndirect:
117             return true;
118         default:
119             return false;
120     }
121 }
122 
isClearOrQueryEntryPoint(angle::EntryPoint entryPoint) const123 bool DebugAnnotatorVk::isClearOrQueryEntryPoint(angle::EntryPoint entryPoint) const
124 {
125     switch (entryPoint)
126     {
127         case angle::EntryPoint::GLClear:
128         case angle::EntryPoint::GLClearBufferfi:
129         case angle::EntryPoint::GLClearBufferfv:
130         case angle::EntryPoint::GLClearBufferiv:
131         case angle::EntryPoint::GLClearBufferuiv:
132         case angle::EntryPoint::GLBeginQuery:
133         case angle::EntryPoint::GLBeginQueryEXT:
134         case angle::EntryPoint::GLBeginQueryIndexed:
135         case angle::EntryPoint::GLEndQuery:
136         case angle::EntryPoint::GLEndQueryEXT:
137         case angle::EntryPoint::GLEndQueryIndexed:
138             return true;
139         default:
140             return false;
141     }
142 }
143 
144 }  // namespace rx
145