Skip to content

Commit f329c07

Browse files
committed
[ftrace] include tracing of skia, angle and libwebrtc
1 parent 102c3e0 commit f329c07

9 files changed

Lines changed: 351 additions & 4 deletions

File tree

Source/ThirdParty/ANGLE/CMakeLists.txt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ set(ANGLE_SOURCES
9090
src/libANGLE/capture/serialize_mock.cpp
9191
)
9292

93+
if (USE_LINUX_FTRACE)
94+
list(APPEND ANGLE_DEFINITIONS
95+
ANGLE_ENABLE_DEBUG_TRACE=1
96+
)
97+
endif()
98+
9399
if (WIN32)
94100
# FIXME: DX11 support will not compile if this preprocessor definition is set
95101
# DirectX Documentation is setting that version to 0x700 but there is no
@@ -120,8 +126,8 @@ set(zlib_wrapper_sources
120126
)
121127

122128
set(angle_gl_enum_utils
123-
"src/libANGLE/gl_enum_utils.cpp"
124-
"src/libANGLE/gl_enum_utils_autogen.cpp"
129+
"src/common/gl_enum_utils.cpp"
130+
"src/common/gl_enum_utils_autogen.cpp"
125131
)
126132

127133
WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()
@@ -140,6 +146,7 @@ if (USE_ANGLE_EGL OR ENABLE_WEBGL)
140146
${libangle_image_util_headers}
141147
${xxhash_sources}
142148
${zlib_wrapper_sources}
149+
${angle_gl_enum_utils}
143150
)
144151
target_include_directories(ANGLE PRIVATE ${ANGLE_PRIVATE_INCLUDE_DIRECTORIES})
145152
target_compile_definitions(ANGLE PRIVATE

Source/ThirdParty/ANGLE/include/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ if (ENABLE_WEBGL)
4747
)
4848
endif ()
4949

50+
if (USE_LINUX_FTRACE)
51+
set(platform_headers ${includes})
52+
list(FILTER platform_headers INCLUDE REGEX "platform/PlatformMethods.h")
53+
54+
WEBKIT_COPY_FILES(ANGLEPlatformHeaders
55+
DESTINATION ${ANGLE_FRAMEWORK_HEADERS_DIR}/ANGLE
56+
FILES ${platform_headers}
57+
)
58+
endif()
59+
5060
# Cocoa expects headers in an ANGLE directory
5161
WEBKIT_COPY_FILES(GLSLANGHeaders
5262
DESTINATION ${ANGLE_FRAMEWORK_HEADERS_DIR}/ANGLE

Source/ThirdParty/skia/CMakeLists.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,12 +850,14 @@ add_library(Skia STATIC
850850
src/sksl/transform/SkSLEliminateDeadLocalVariables.cpp
851851
src/sksl/transform/SkSLEliminateEmptyStatements.cpp
852852
src/sksl/transform/SkSLEliminateUnreachableCode.cpp
853+
src/sksl/transform/SkSLEliminateUnnecessaryBraces.cpp
853854
src/sksl/transform/SkSLFindAndDeclareBuiltinFunctions.cpp
854855
src/sksl/transform/SkSLFindAndDeclareBuiltinStructs.cpp
855856
src/sksl/transform/SkSLFindAndDeclareBuiltinVariables.cpp
856857
src/sksl/transform/SkSLHoistSwitchVarDeclarationsAtTopLevel.cpp
857858
src/sksl/transform/SkSLRenamePrivateSymbols.cpp
858859
src/sksl/transform/SkSLReplaceConstVarsWithLiterals.cpp
860+
src/sksl/transform/SkSLReplaceSplatCastsWithSwizzles.cpp
859861
src/sksl/transform/SkSLRewriteIndexedSwizzle.cpp
860862

861863
src/utils/SkCharToGlyphCache.cpp
@@ -871,6 +873,9 @@ add_library(Skia STATIC
871873
src/utils/SkShaderUtils.cpp
872874
src/utils/SkShadowTessellator.cpp
873875
src/utils/SkShadowUtils.cpp
876+
src/utils/SkJSON.cpp
877+
src/utils/SkParse.cpp
878+
src/utils/SkEventTracer.cpp
874879

875880
src/opts/SkOpts_hsw.cpp
876881
src/opts/SkOpts_skx.cpp
@@ -962,7 +967,6 @@ target_compile_definitions(Skia PUBLIC
962967
SK_DISABLE_LEGACY_IMAGE_READBUFFER
963968
SK_DISABLE_LEGACY_INIT_DECODERS
964969
SK_DISABLE_LEGACY_PNG_WRITEBUFFER
965-
SK_DISABLE_TRACING
966970
SK_DISABLE_WEBGL_INTERFACE
967971

968972
SK_ENABLE_PRECOMPILE
@@ -975,6 +979,12 @@ target_compile_definitions(Skia PUBLIC
975979
SK_RELEASE
976980
)
977981

982+
if (NOT USE_LINUX_FTRACE)
983+
target_compile_definitions(Skia PUBLIC
984+
SK_DISABLE_TRACING
985+
)
986+
endif()
987+
978988
#
979989
# This saves some reference churning and ctor/dtor calls in the
980990
# implementation of the sk_sp<> smart pointer template. It needs to

Source/WTF/wtf/linux/SystemTracingFTrace.h

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424
#include <wtf/Assertions.h>
2525
#include <wtf/SystemTracing.h>
2626
#include <wtf/text/ASCIILiteral.h>
27+
#include <wtf/text/StringBuilder.h>
28+
#include <wtf/HexNumber.h>
29+
#include <wtf/StdLibExtras.h>
2730

31+
#include <algorithm>
2832
#include <cstdio>
2933
#include <cstring>
3034
#include <mutex>
@@ -208,6 +212,117 @@ class SystemTracingFTrace {
208212
}
209213
}
210214

215+
void addMark(const char phase, std::span<const char> name, const char* format, va_list args) WTF_ATTRIBUTE_PRINTF(4, 0) {
216+
// "<phase>|<pid>|<name>[|<args>]"
217+
Vector<char> buffer(1024);
218+
219+
size_t len = 0;
220+
int ret;
221+
222+
ret = snprintf(buffer.data(), buffer.size(), "%c|%u|%.*s", phase, m_pid, name.size(), name.data());
223+
if (ret < 0) {
224+
return;
225+
}
226+
len += ret;
227+
228+
if (format && format[0] != '\0' && len < buffer.size()) {
229+
buffer[len++] = (phase == 'I' ? ',' : '|'); // add args to the name so it is easier to see data in timeline
230+
ret = vsnprintf(buffer.data() + len, buffer.size() - len, format, args);
231+
if (ret < 0) {
232+
return;
233+
}
234+
len += ret;
235+
}
236+
237+
writeFTraceMarker(buffer.data(), std::min(buffer.size() - 1, len));
238+
}
239+
240+
void addMark(const char phase, std::span<const char> name, const char *format, ...) WTF_ATTRIBUTE_PRINTF(4, 5) {
241+
va_list args;
242+
va_start(args, format);
243+
addMark(phase, WTFMove(name), format, args);
244+
va_end(args);
245+
}
246+
247+
void addMark(const char phase, std::span<const char> name) {
248+
addMark(phase, WTFMove(name), "");
249+
}
250+
251+
void addTraceEvent(char phase,
252+
const unsigned char* categoryEnabled,
253+
const char* name,
254+
unsigned long long id,
255+
int numArgs,
256+
const char** argNames,
257+
const unsigned char* argTypes,
258+
const unsigned long long* argValues,
259+
unsigned char flags) {
260+
UNUSED_PARAM(id);
261+
UNUSED_PARAM(flags);
262+
263+
// "<phase>|<pid>|<name>[|<argNames0>=<argValues0>,<argNames1>=<argValues1>...]"
264+
StringBuilder builder;
265+
266+
builder.append(phase, '|', String::number(m_pid), '|');
267+
builder.append(StringView::fromLatin1(reinterpret_cast<const char*>(categoryEnabled)), ':', StringView::fromLatin1(name));
268+
269+
for (int i = 0; i < numArgs; ++i) {
270+
union TraceArgValueUnion {
271+
bool as_bool;
272+
unsigned long long as_uint;
273+
long long as_int;
274+
double as_double;
275+
const void* as_pointer;
276+
const char* as_string;
277+
} arg;
278+
279+
enum TraceArgValueType : int8_t {
280+
Bool = 1,
281+
Uint = 2,
282+
Int = 3,
283+
Double = 4,
284+
Pointer = 5,
285+
String = 6,
286+
CopyString = 7
287+
};
288+
289+
const auto argName = StringView::fromLatin1(argNames[i]);
290+
arg.as_uint = argValues[i];
291+
if (i == 0)
292+
builder.append('|');
293+
else
294+
builder.append(',');
295+
builder.append(argName, '=');
296+
297+
switch(argTypes[i]) {
298+
case TraceArgValueType::String:
299+
case TraceArgValueType::CopyString:
300+
builder.append(StringView::fromLatin1(arg.as_string));
301+
break;
302+
case TraceArgValueType::Bool:
303+
builder.append(arg.as_bool ? "true"_s : "false"_s);
304+
break;
305+
case TraceArgValueType::Uint:
306+
builder.append(String::number(arg.as_uint));
307+
break;
308+
case TraceArgValueType::Int:
309+
builder.append(String::number(arg.as_int));
310+
break;
311+
case TraceArgValueType::Double:
312+
builder.append(String::number(arg.as_double));
313+
break;
314+
case TraceArgValueType::Pointer:
315+
builder.append("0x"_s, hex(reinterpret_cast<uintptr_t>(arg.as_pointer)));
316+
break;
317+
default:
318+
break;
319+
}
320+
}
321+
322+
const auto buffer = spanReinterpretCast<const char>(builder.span<uint8_t>());
323+
writeFTraceMarker(buffer.data(), buffer.size());
324+
}
325+
211326
static bool isEnabled() {
212327
return !(instance().m_traceMarkerFd < 0);
213328
}

Source/WebCore/platform/Skia.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ list(APPEND WebCore_PRIVATE_FRAMEWORK_HEADERS
1616
platform/graphics/skia/SkiaAcceleratedBufferPool.h
1717
platform/graphics/skia/SkiaHarfBuzzFont.h
1818
platform/graphics/skia/SkiaHarfBuzzFontCache.h
19+
platform/graphics/skia/SkiaEventTracer.h
1920
)
2021

2122
list(APPEND WebCore_LIBRARIES

Source/WebCore/platform/graphics/angle/PlatformDisplayANGLE.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,51 @@
2525
#include "GLContext.h"
2626
#include "Logging.h"
2727

28+
#if USE(LINUX_FTRACE)
29+
#include <wtf/SystemTracing.h>
30+
#include <wtf/MonotonicTime.h>
31+
#include <wtf/text/MakeString.h>
32+
ALLOW_UNUSED_PARAMETERS_BEGIN
33+
#include <ANGLE/platform/PlatformMethods.h>
34+
ALLOW_UNUSED_PARAMETERS_END
35+
#endif
36+
2837
namespace WebCore {
2938

39+
#if USE(LINUX_FTRACE)
40+
static const unsigned char* ANGLE_getTraceCategoryEnabledFlag(angle::PlatformMethods* platform,
41+
const char* categoryGroup) {
42+
UNUSED_PARAM(platform);
43+
return reinterpret_cast<const unsigned char*>(categoryGroup);
44+
}
45+
46+
static angle::TraceEventHandle ANGLE_addTraceEvent(angle::PlatformMethods* platform,
47+
char phase,
48+
const unsigned char* categoryGroupEnabled,
49+
const char* name,
50+
unsigned long long id,
51+
double timestamp,
52+
int numArgs,
53+
const char** argNames,
54+
const unsigned char* argTypes,
55+
const unsigned long long* argValues,
56+
unsigned char flags) {
57+
UNUSED_PARAM(platform);
58+
UNUSED_PARAM(timestamp);
59+
60+
SystemTracingFTrace::instance().addTraceEvent(
61+
phase, categoryGroupEnabled, name, id,
62+
numArgs, argNames, argTypes, argValues, flags);
63+
64+
return static_cast<angle::TraceEventHandle>(0);
65+
}
66+
67+
static double ANGLE_monotonicallyIncreasingTime(angle::PlatformMethods* platform) {
68+
UNUSED_PARAM(platform);
69+
return MonotonicTime::now().secondsSinceEpoch().value();
70+
}
71+
#endif
72+
3073
EGLDisplay PlatformDisplay::angleEGLDisplay() const
3174
{
3275
#if PLATFORM(WIN)
@@ -55,6 +98,22 @@ EGLDisplay PlatformDisplay::angleEGLDisplay() const
5598
if (angleDisplay == EGL_NO_DISPLAY)
5699
return EGL_NO_DISPLAY;
57100

101+
#if USE(LINUX_FTRACE)
102+
if (SystemTracingFTrace::isEnabled()) {
103+
angle::GetDisplayPlatformFunc getPlatform = reinterpret_cast<angle::GetDisplayPlatformFunc>(
104+
EGL_GetProcAddress("ANGLEGetDisplayPlatform"));
105+
if (getPlatform) {
106+
angle::PlatformMethods* platformMethods = nullptr;
107+
if (getPlatform(angleDisplay, angle::g_PlatformMethodNames, angle::g_NumPlatformMethods,
108+
nullptr, &platformMethods)) {
109+
platformMethods->addTraceEvent = ANGLE_addTraceEvent;
110+
platformMethods->getTraceCategoryEnabledFlag = ANGLE_getTraceCategoryEnabledFlag;
111+
platformMethods->monotonicallyIncreasingTime = ANGLE_monotonicallyIncreasingTime;
112+
}
113+
};
114+
}
115+
#endif
116+
58117
EGLint majorVersion, minorVersion;
59118
if (EGL_Initialize(angleDisplay, &majorVersion, &minorVersion) == EGL_TRUE) {
60119
LOG(WebGL, "ANGLE initialised Major: %d Minor: %d", majorVersion, minorVersion);

0 commit comments

Comments
 (0)