Path: blob/main_old/util/frame_capture_test_utils.h
1693 views
//1// Copyright 2020 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// frame_capture_test_utils:6// Helper functions for capture and replay of traces.7//89#ifndef UTIL_FRAME_CAPTURE_TEST_UTILS_H_10#define UTIL_FRAME_CAPTURE_TEST_UTILS_H_1112#include <iostream>13#include <memory>14#include <sstream>15#include <type_traits>16#include <vector>1718#include "common/angleutils.h"19#include "common/system_utils.h"2021#define USE_SYSTEM_ZLIB22#include "compression_utils_portable.h"2324#define ANGLE_MACRO_STRINGIZE_AUX(a) #a25#define ANGLE_MACRO_STRINGIZE(a) ANGLE_MACRO_STRINGIZE_AUX(a)26#define ANGLE_MACRO_CONCAT_AUX(a, b) a##b27#define ANGLE_MACRO_CONCAT(a, b) ANGLE_MACRO_CONCAT_AUX(a, b)2829namespace angle30{3132inline uint8_t *DecompressBinaryData(const std::vector<uint8_t> &compressedData)33{34uint32_t uncompressedSize =35zlib_internal::GetGzipUncompressedSize(compressedData.data(), compressedData.size());3637std::unique_ptr<uint8_t[]> uncompressedData(new uint8_t[uncompressedSize]);38uLong destLen = uncompressedSize;39int zResult =40zlib_internal::GzipUncompressHelper(uncompressedData.get(), &destLen, compressedData.data(),41static_cast<uLong>(compressedData.size()));4243if (zResult != Z_OK)44{45std::cerr << "Failure to decompressed binary data: " << zResult << "\n";46return nullptr;47}4849return uncompressedData.release();50}5152using DecompressCallback = uint8_t *(*)(const std::vector<uint8_t> &);53using ValidateSerializedStateCallback = void (*)(const char *, const char *, uint32_t);5455using SetBinaryDataDecompressCallbackFunc = void (*)(DecompressCallback);56using SetBinaryDataDirFunc = void (*)(const char *);57using SetupReplayFunc = void (*)();58using ReplayFrameFunc = void (*)(uint32_t);59using ResetReplayFunc = void (*)();60using FinishReplayFunc = void (*)();61using GetSerializedContextStateFunc = const char *(*)(uint32_t);62using SetValidateSerializedStateCallbackFunc = void (*)(ValidateSerializedStateCallback);6364class TraceLibrary65{66public:67TraceLibrary(const char *traceNameIn)68{69std::stringstream traceNameStr;70#if !defined(ANGLE_PLATFORM_WINDOWS)71traceNameStr << "lib";72#endif // !defined(ANGLE_PLATFORM_WINDOWS)73traceNameStr << traceNameIn;74#if defined(ANGLE_PLATFORM_ANDROID) && defined(COMPONENT_BUILD)75// Added to shared library names in Android component builds in76// https://chromium.googlesource.com/chromium/src/+/9bacc8c4868cc802f69e1e858eea6757217a508f/build/toolchain/toolchain.gni#5677traceNameStr << ".cr";78#endif // defined(ANGLE_PLATFORM_ANDROID) && defined(COMPONENT_BUILD)79std::string traceName = traceNameStr.str();80mTraceLibrary.reset(OpenSharedLibrary(traceName.c_str(), SearchType::ModuleDir));81}8283bool valid() const { return mTraceLibrary != nullptr; }8485void setBinaryDataDir(const char *dataDir)86{87callFunc<SetBinaryDataDirFunc>("SetBinaryDataDir", dataDir);88}8990void setBinaryDataDecompressCallback(DecompressCallback callback)91{92callFunc<SetBinaryDataDecompressCallbackFunc>("SetBinaryDataDecompressCallback", callback);93}9495void replayFrame(uint32_t frameIndex) { callFunc<ReplayFrameFunc>("ReplayFrame", frameIndex); }9697void setupReplay() { callFunc<SetupReplayFunc>("SetupReplay"); }9899void resetReplay() { callFunc<ResetReplayFunc>("ResetReplay"); }100101void finishReplay() { callFunc<FinishReplayFunc>("FinishReplay"); }102103const char *getSerializedContextState(uint32_t frameIndex)104{105return callFunc<GetSerializedContextStateFunc>("GetSerializedContextState", frameIndex);106}107108void setValidateSerializedStateCallback(ValidateSerializedStateCallback callback)109{110return callFunc<SetValidateSerializedStateCallbackFunc>(111"SetValidateSerializedStateCallback", callback);112}113114private:115template <typename FuncT, typename... ArgsT>116typename std::result_of<FuncT(ArgsT...)>::type callFunc(const char *funcName, ArgsT... args)117{118void *untypedFunc = mTraceLibrary->getSymbol(funcName);119if (!untypedFunc)120{121fprintf(stderr, "Error loading function: %s\n", funcName);122ASSERT(untypedFunc);123}124auto typedFunc = reinterpret_cast<FuncT>(untypedFunc);125return typedFunc(args...);126}127128std::unique_ptr<Library> mTraceLibrary;129};130131} // namespace angle132133#endif // UTIL_FRAME_CAPTURE_TEST_UTILS_H_134135136