| // |
| // 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<std::string> strings; |
| std::vector<const char *> pointers; |
| }; |
| using TraceStringMap = std::map<std::string, TraceString>; |
| |
| 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 <typename T> |
| void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<uint32_t>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<int32_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<void *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const int32_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<void **>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<int32_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<uint64_t>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<int64_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const int64_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<int64_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<uint64_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const char *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const void *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<uint32_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const uint32_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<float>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<uint8_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<float *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const float *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<GLsync>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const char *const *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const char **>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<GLDEBUGPROCKHR>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<EGLDEBUGPROCKHR>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const struct AHardwareBuffer *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<EGLSetBlobFuncANDROID>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<EGLGetBlobFuncANDROID>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<int16_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const int16_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<char *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<unsigned char *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const void *const *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<const uint64_t *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| #if defined(ANGLE_PLATFORM_WINDOWS) |
| |
| template <> |
| void PackParameter<EGLNativeDisplayType>(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<EGLNativeWindowType>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<EGLNativePixmapType>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| #endif // defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID) |
| |
| // On Apple platforms, std::is_same<uint64_t, long> is false despite being both 8 bits. |
| #if defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU) |
| template <> |
| void PackParameter<const long *>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| template <> |
| void PackParameter<long *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<long>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings); |
| |
| template <> |
| void PackParameter<unsigned long>(ParamBuffer ¶ms, |
| const Token &token, |
| const TraceStringMap &strings); |
| #endif // defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU) |
| |
| template <typename T> |
| void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings) |
| { |
| static_assert(AssertFalse<T>::value, "No specialization for type."); |
| } |
| |
| template <typename T> |
| struct ParameterPacker; |
| |
| template <typename Ret> |
| struct ParameterPacker<Ret()> |
| { |
| static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) {} |
| }; |
| |
| template <typename Ret, typename Arg> |
| struct ParameterPacker<Ret(Arg)> |
| { |
| static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) |
| { |
| PackParameter<Arg>(params, tokens[0], strings); |
| } |
| }; |
| |
| template <typename Ret, typename Arg, typename... Args> |
| struct ParameterPacker<Ret(Arg, Args...)> |
| { |
| static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) |
| { |
| PackParameter<Arg>(params, tokens[0], strings); |
| ParameterPacker<Ret(Args...)>::Pack(params, &tokens[1], strings); |
| } |
| }; |
| |
| template <typename Ret, typename Arg, typename... Args> |
| struct ParameterPacker<Ret (*)(Arg, Args...)> |
| { |
| static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) |
| { |
| PackParameter<Arg>(params, tokens[0], strings); |
| ParameterPacker<Ret(Args...)>::Pack(params, &tokens[1], strings); |
| } |
| }; |
| |
| template <typename Func> |
| struct RemoveStdCall; |
| |
| template <typename Ret, typename... Args> |
| struct RemoveStdCall<Ret KHRONOS_APIENTRY(Args...)> |
| { |
| using Type = Ret(Args...); |
| }; |
| |
| template <typename Func> |
| struct RemoveStdCall |
| { |
| using Type = Func; |
| }; |
| |
| template <typename Func> |
| ParamBuffer ParseParameters(const Token *paramTokens, const TraceStringMap &strings) |
| { |
| ParamBuffer params; |
| ParameterPacker<typename RemoveStdCall<Func>::Type>::Pack(params, paramTokens, strings); |
| return params; |
| } |
| } // namespace angle |
| |
| extern "C" { |
| ANGLE_REPLAY_EXPORT void SetupReplay(); |
| ANGLE_REPLAY_EXPORT void ReplayFrame(uint32_t frameIndex); |
| ANGLE_REPLAY_EXPORT void ResetReplay(); |
| ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex); |
| } // extern "C" |
| |
| #endif // ANGLE_TRACE_INTERPRETER_H_ |