// // Copyright 2022 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. // // trace_interpreter.h: // Parser and interpreter for the C-based replays. // #ifndef ANGLE_TRACE_INTERPRETER_H_ #define ANGLE_TRACE_INTERPRETER_H_ #include "common/frame_capture_utils.h" #include "frame_capture_test_utils.h" #include "traces_export.h" namespace angle { struct TraceString { std::vector strings; std::vector pointers; }; using TraceStringMap = std::map; constexpr size_t kMaxTokenSize = 200; constexpr size_t kMaxParameters = 32; using Token = char[kMaxTokenSize]; CallCapture ParseCallCapture(const Token &nameToken, size_t numParamTokens, const Token *paramTokens, const TraceStringMap &strings); template void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); #if defined(ANGLE_PLATFORM_WINDOWS) template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); #endif // defined(ANGLE_PLATFORM_WINDOWS) #if defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID) template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); #endif // defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID) // On Apple platforms, std::is_same is false despite being both 8 bits. #if defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU) template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); template <> void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); #endif // defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU) template void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings) { static_assert(AssertFalse::value, "No specialization for type."); } template struct ParameterPacker; template struct ParameterPacker { static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) {} }; template struct ParameterPacker { static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) { PackParameter(params, tokens[0], strings); } }; template struct ParameterPacker { static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) { PackParameter(params, tokens[0], strings); ParameterPacker::Pack(params, &tokens[1], strings); } }; template struct ParameterPacker { static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) { PackParameter(params, tokens[0], strings); ParameterPacker::Pack(params, &tokens[1], strings); } }; template struct RemoveStdCall; template struct RemoveStdCall { using Type = Ret(Args...); }; template struct RemoveStdCall { using Type = Func; }; template ParamBuffer ParseParameters(const Token *paramTokens, const TraceStringMap &strings) { ParamBuffer params; ParameterPacker::Type>::Pack(params, paramTokens, strings); return params; } } // namespace angle extern "C" { void SetupReplay(); void ReplayFrame(uint32_t frameIndex); void ResetReplay(); ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex); } // extern "C" #endif // ANGLE_TRACE_INTERPRETER_H_