721 lines
44 KiB
C++
721 lines
44 KiB
C++
/*
|
|
* SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* Licensed under the Apache License v2.0 with LLVM Exceptions.
|
|
* See https://nvidia.github.io/NVTX/LICENSE.txt for license information.
|
|
*/
|
|
|
|
#define NVTX_NO_IMPL
|
|
#include "nvtx3/nvToolsExt.h"
|
|
|
|
#include "Same.h"
|
|
#include "PrettyPrintersNvtxC.h"
|
|
|
|
#include <functional>
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <memory>
|
|
#include <map>
|
|
#include <string>
|
|
|
|
constexpr auto NVTX_TOOL_ATTACHED_UNUSED_RANGE_ID = static_cast<nvtxRangeId_t>(-1LL);
|
|
constexpr int NVTX_TOOL_ATTACHED_UNUSED_PUSH_POP_ID = -1;
|
|
const auto NVTX_TOOL_ATTACHED_UNUSED_DOMAIN_HANDLE = reinterpret_cast<nvtxDomainHandle_t>(-1LL);
|
|
const auto NVTX_TOOL_ATTACHED_UNUSED_STRING_HANDLE = reinterpret_cast<nvtxStringHandle_t>(-1LL);
|
|
const auto NVTX_TOOL_ATTACHED_UNUSED_RESOURCE_HANDLE = reinterpret_cast<nvtxResourceHandle_t>(-1LL);
|
|
|
|
struct ArgsLoad { int success; };
|
|
|
|
struct ArgsMarkEx { const nvtxEventAttributes_t* eventAttrib; };
|
|
struct ArgsMarkA { const char* str ; };
|
|
struct ArgsMarkW { const wchar_t* str ; };
|
|
struct ArgsRangeStartEx { const nvtxEventAttributes_t* eventAttrib; };
|
|
struct ArgsRangeStartA { const char* str ; };
|
|
struct ArgsRangeStartW { const wchar_t* str ; };
|
|
struct ArgsRangeEnd { nvtxRangeId_t id ; };
|
|
struct ArgsRangePushEx { const nvtxEventAttributes_t* eventAttrib; };
|
|
struct ArgsRangePushA { const char* str ; };
|
|
struct ArgsRangePushW { const wchar_t* str ; };
|
|
struct ArgsRangePop { };
|
|
struct ArgsNameCategoryA { uint32_t id; const char* str ; };
|
|
struct ArgsNameCategoryW { uint32_t id; const wchar_t* str ; };
|
|
struct ArgsNameOsThreadA { uint32_t id; const char* str ; };
|
|
struct ArgsNameOsThreadW { uint32_t id; const wchar_t* str ; };
|
|
|
|
struct ArgsDomainMarkEx { nvtxDomainHandle_t domain; const nvtxEventAttributes_t* eventAttrib; };
|
|
struct ArgsDomainRangeStartEx { nvtxDomainHandle_t domain; const nvtxEventAttributes_t* eventAttrib; };
|
|
struct ArgsDomainRangeEnd { nvtxDomainHandle_t domain; nvtxRangeId_t id ; };
|
|
struct ArgsDomainRangePushEx { nvtxDomainHandle_t domain; const nvtxEventAttributes_t* eventAttrib; };
|
|
struct ArgsDomainRangePop { nvtxDomainHandle_t domain ; };
|
|
struct ArgsDomainResourceCreate { nvtxDomainHandle_t domain; nvtxResourceAttributes_t* attr ; };
|
|
struct ArgsDomainResourceDestroy { nvtxResourceHandle_t attr ; };
|
|
struct ArgsDomainNameCategoryA { nvtxDomainHandle_t domain; uint32_t id; const char* str ; };
|
|
struct ArgsDomainNameCategoryW { nvtxDomainHandle_t domain; uint32_t id; const wchar_t* str ; };
|
|
struct ArgsDomainRegisterStringA { nvtxDomainHandle_t domain; const char* str ; };
|
|
struct ArgsDomainRegisterStringW { nvtxDomainHandle_t domain; const wchar_t* str ; };
|
|
struct ArgsDomainCreateA { const char* name ; };
|
|
struct ArgsDomainCreateW { const wchar_t* name ; };
|
|
struct ArgsDomainDestroy { nvtxDomainHandle_t domain ; };
|
|
struct ArgsInitialize { const void* reserved ; };
|
|
|
|
struct CallId
|
|
{
|
|
NvtxCallbackModule mod;
|
|
int32_t cb;
|
|
};
|
|
DEFINE_SAME_2(CallId, mod, cb)
|
|
|
|
// Helper to write CALLID(CORE, MarkEx) as shorthand for CallId{NVTX_CB_MODULE_CORE, NVTX_CBID_CORE_MarkEx}
|
|
#define CALLID(m,c) CallId{NVTX_CB_MODULE_##m, static_cast<int32_t>(NVTX_CBID_##m##_##c)}
|
|
|
|
#define CALLID_LOAD() CallId{NVTX_CB_MODULE_INVALID, static_cast<int32_t>(0x7ac0be11)}
|
|
|
|
inline const char* CallName(CallId const& id)
|
|
{
|
|
if (id == CALLID_LOAD()) return "InitializeInjectionNvtx2";
|
|
switch (id.mod)
|
|
{
|
|
case NVTX_CB_MODULE_CORE:
|
|
switch (id.cb)
|
|
{
|
|
case NVTX_CBID_CORE_MarkEx : return "MarkEx";
|
|
case NVTX_CBID_CORE_MarkA : return "MarkA";
|
|
case NVTX_CBID_CORE_MarkW : return "MarkW";
|
|
case NVTX_CBID_CORE_RangeStartEx : return "RangeStartEx";
|
|
case NVTX_CBID_CORE_RangeStartA : return "RangeStartA";
|
|
case NVTX_CBID_CORE_RangeStartW : return "RangeStartW";
|
|
case NVTX_CBID_CORE_RangeEnd : return "RangeEnd";
|
|
case NVTX_CBID_CORE_RangePushEx : return "RangePushEx";
|
|
case NVTX_CBID_CORE_RangePushA : return "RangePushA";
|
|
case NVTX_CBID_CORE_RangePushW : return "RangePushW";
|
|
case NVTX_CBID_CORE_RangePop : return "RangePop";
|
|
case NVTX_CBID_CORE_NameCategoryA: return "NameCategoryA";
|
|
case NVTX_CBID_CORE_NameCategoryW: return "NameCategoryW";
|
|
case NVTX_CBID_CORE_NameOsThreadA: return "NameOsThreadA";
|
|
case NVTX_CBID_CORE_NameOsThreadW: return "NameOsThreadW";
|
|
default: return "<Unknown CORE call>";
|
|
}
|
|
case NVTX_CB_MODULE_CORE2:
|
|
switch (id.cb)
|
|
{
|
|
case NVTX_CBID_CORE2_DomainMarkEx : return "DomainMarkEx";
|
|
case NVTX_CBID_CORE2_DomainRangeStartEx : return "DomainRangeStartEx";
|
|
case NVTX_CBID_CORE2_DomainRangeEnd : return "DomainRangeEnd";
|
|
case NVTX_CBID_CORE2_DomainRangePushEx : return "DomainRangePushEx";
|
|
case NVTX_CBID_CORE2_DomainRangePop : return "DomainRangePop";
|
|
case NVTX_CBID_CORE2_DomainResourceCreate : return "DomainResourceCreate";
|
|
case NVTX_CBID_CORE2_DomainResourceDestroy: return "DomainResourceDestroy";
|
|
case NVTX_CBID_CORE2_DomainNameCategoryA : return "DomainNameCategoryA";
|
|
case NVTX_CBID_CORE2_DomainNameCategoryW : return "DomainNameCategoryW";
|
|
case NVTX_CBID_CORE2_DomainRegisterStringA: return "DomainRegisterStringA";
|
|
case NVTX_CBID_CORE2_DomainRegisterStringW: return "DomainRegisterStringW";
|
|
case NVTX_CBID_CORE2_DomainCreateA : return "DomainCreateA";
|
|
case NVTX_CBID_CORE2_DomainCreateW : return "DomainCreateW";
|
|
case NVTX_CBID_CORE2_DomainDestroy : return "DomainDestroy";
|
|
case NVTX_CBID_CORE2_Initialize : return "Initialize";
|
|
default: return "<Unknown CORE2 call>";
|
|
}
|
|
case NVTX_CB_MODULE_SYNC:
|
|
return "<Unknown SYNC call>";
|
|
case NVTX_CB_MODULE_CUDA:
|
|
return "<Unknown CUDA call>";
|
|
case NVTX_CB_MODULE_CUDART:
|
|
return "<Unknown CUDART call>";
|
|
case NVTX_CB_MODULE_OPENCL:
|
|
return "<Unknown OPENCL call>";
|
|
case NVTX_CB_MODULE_INVALID:
|
|
case NVTX_CB_MODULE_SIZE:
|
|
case NVTX_CB_MODULE_FORCE_INT:
|
|
default: return "<Unknown CB_MODULE>";
|
|
}
|
|
}
|
|
|
|
inline std::ostream& operator<<(std::ostream& os, CallId const& id)
|
|
{
|
|
return os << CallName(id);
|
|
}
|
|
|
|
union Args
|
|
{
|
|
ArgsLoad Load;
|
|
|
|
ArgsMarkEx MarkEx ;
|
|
ArgsMarkA MarkA ;
|
|
ArgsMarkW MarkW ;
|
|
ArgsRangeStartEx RangeStartEx ;
|
|
ArgsRangeStartA RangeStartA ;
|
|
ArgsRangeStartW RangeStartW ;
|
|
ArgsRangeEnd RangeEnd ;
|
|
ArgsRangePushEx RangePushEx ;
|
|
ArgsRangePushA RangePushA ;
|
|
ArgsRangePushW RangePushW ;
|
|
ArgsRangePop RangePop ;
|
|
ArgsNameCategoryA NameCategoryA;
|
|
ArgsNameCategoryW NameCategoryW;
|
|
ArgsNameOsThreadA NameOsThreadA;
|
|
ArgsNameOsThreadW NameOsThreadW;
|
|
|
|
ArgsDomainMarkEx DomainMarkEx ;
|
|
ArgsDomainRangeStartEx DomainRangeStartEx ;
|
|
ArgsDomainRangeEnd DomainRangeEnd ;
|
|
ArgsDomainRangePushEx DomainRangePushEx ;
|
|
ArgsDomainRangePop DomainRangePop ;
|
|
ArgsDomainResourceCreate DomainResourceCreate ;
|
|
ArgsDomainResourceDestroy DomainResourceDestroy;
|
|
ArgsDomainNameCategoryA DomainNameCategoryA ;
|
|
ArgsDomainNameCategoryW DomainNameCategoryW ;
|
|
ArgsDomainRegisterStringA DomainRegisterStringA;
|
|
ArgsDomainRegisterStringW DomainRegisterStringW;
|
|
ArgsDomainCreateA DomainCreateA ;
|
|
ArgsDomainCreateW DomainCreateW ;
|
|
ArgsDomainDestroy DomainDestroy ;
|
|
ArgsInitialize Initialize ;
|
|
};
|
|
|
|
// Free functions to emulate copy constructors and destructors for the NVTX C API types using pointers
|
|
inline void CopyCstring(const char*& lhs, const char* rhs)
|
|
{
|
|
size_t len = strlen(rhs) + 1;
|
|
auto* tmp = new char[len];
|
|
std::copy(rhs, rhs + len, tmp);
|
|
lhs = tmp;
|
|
}
|
|
inline void CopyCstring(const char*& s) { CopyCstring(s, s); }
|
|
inline void DestroyCstring(const char* s) { delete[] s; }
|
|
|
|
inline void CopyCstring(const wchar_t*& lhs, const wchar_t* rhs)
|
|
{
|
|
size_t len = wcslen(rhs) + 1;
|
|
auto* tmp = new wchar_t[len];
|
|
std::copy(rhs, rhs + len, tmp);
|
|
lhs = tmp;
|
|
}
|
|
inline void CopyCstring(const wchar_t*& s) { CopyCstring(s, s); }
|
|
inline void DestroyCstring(const wchar_t* s) { delete[] s; }
|
|
|
|
inline void CopyEventAttributes(const nvtxEventAttributes_t*& lhs, const nvtxEventAttributes_t* rhs)
|
|
{
|
|
auto* tmp = new nvtxEventAttributes_t;
|
|
memcpy(tmp, rhs, sizeof(*tmp));
|
|
switch (tmp->messageType)
|
|
{
|
|
case NVTX_MESSAGE_TYPE_ASCII: CopyCstring(tmp->message.ascii); break;
|
|
case NVTX_MESSAGE_TYPE_UNICODE: CopyCstring(tmp->message.unicode); break;
|
|
default: break;
|
|
}
|
|
lhs = tmp;
|
|
}
|
|
inline void CopyEventAttributes(const nvtxEventAttributes_t*& a) { CopyEventAttributes(a, a); }
|
|
inline void DestroyEventAttributes(const nvtxEventAttributes_t* a)
|
|
{
|
|
switch (a->messageType)
|
|
{
|
|
case NVTX_MESSAGE_TYPE_ASCII: DestroyCstring(a->message.ascii); break;
|
|
case NVTX_MESSAGE_TYPE_UNICODE: DestroyCstring(a->message.unicode); break;
|
|
default: break;
|
|
}
|
|
delete a;
|
|
}
|
|
|
|
inline void CopyResourceAttributes(nvtxResourceAttributes_t*& lhs, const nvtxResourceAttributes_t* rhs)
|
|
{
|
|
auto* tmp = new nvtxResourceAttributes_t;
|
|
memcpy(tmp, rhs, sizeof(*tmp));
|
|
switch (tmp->messageType)
|
|
{
|
|
case NVTX_MESSAGE_TYPE_ASCII: CopyCstring(tmp->message.ascii); break;
|
|
case NVTX_MESSAGE_TYPE_UNICODE: CopyCstring(tmp->message.unicode); break;
|
|
default: break;
|
|
}
|
|
lhs = tmp;
|
|
}
|
|
inline void CopyResourceAttributes(nvtxResourceAttributes_t*& a) { CopyResourceAttributes(a, a); }
|
|
inline void DestroyResourceAttributes(nvtxResourceAttributes_t* a)
|
|
{
|
|
switch (a->messageType)
|
|
{
|
|
case NVTX_MESSAGE_TYPE_ASCII: DestroyCstring(a->message.ascii); break;
|
|
case NVTX_MESSAGE_TYPE_UNICODE: DestroyCstring(a->message.unicode); break;
|
|
default: break;
|
|
}
|
|
delete a;
|
|
}
|
|
|
|
template <typename ArgsT> inline void DeepCopyAssign(ArgsT& lhs, ArgsT const& rhs) { lhs = rhs; }
|
|
|
|
template <> inline void DeepCopyAssign(ArgsMarkEx & lhs, ArgsMarkEx const& rhs) { lhs = rhs; CopyEventAttributes(lhs.eventAttrib); }
|
|
template <> inline void DeepCopyAssign(ArgsMarkA & lhs, ArgsMarkA const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsMarkW & lhs, ArgsMarkW const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsRangeStartEx & lhs, ArgsRangeStartEx const& rhs) { lhs = rhs; CopyEventAttributes(lhs.eventAttrib); }
|
|
template <> inline void DeepCopyAssign(ArgsRangeStartA & lhs, ArgsRangeStartA const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsRangeStartW & lhs, ArgsRangeStartW const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsRangeEnd & lhs, ArgsRangeEnd const& rhs) { lhs = rhs; }
|
|
template <> inline void DeepCopyAssign(ArgsRangePushEx & lhs, ArgsRangePushEx const& rhs) { lhs = rhs; CopyEventAttributes(lhs.eventAttrib); }
|
|
template <> inline void DeepCopyAssign(ArgsRangePushA & lhs, ArgsRangePushA const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsRangePushW & lhs, ArgsRangePushW const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsRangePop & lhs, ArgsRangePop const& rhs) { lhs = rhs; }
|
|
template <> inline void DeepCopyAssign(ArgsNameCategoryA& lhs, ArgsNameCategoryA const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsNameCategoryW& lhs, ArgsNameCategoryW const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsNameOsThreadA& lhs, ArgsNameOsThreadA const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsNameOsThreadW& lhs, ArgsNameOsThreadW const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
|
|
template <> inline void DeepCopyAssign(ArgsDomainMarkEx & lhs, ArgsDomainMarkEx const& rhs) { lhs = rhs; CopyEventAttributes(lhs.eventAttrib); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainRangeStartEx & lhs, ArgsDomainRangeStartEx const& rhs) { lhs = rhs; CopyEventAttributes(lhs.eventAttrib); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainRangeEnd & lhs, ArgsDomainRangeEnd const& rhs) { lhs = rhs; }
|
|
template <> inline void DeepCopyAssign(ArgsDomainRangePushEx & lhs, ArgsDomainRangePushEx const& rhs) { lhs = rhs; CopyEventAttributes(lhs.eventAttrib); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainRangePop & lhs, ArgsDomainRangePop const& rhs) { lhs = rhs; }
|
|
template <> inline void DeepCopyAssign(ArgsDomainResourceCreate & lhs, ArgsDomainResourceCreate const& rhs) { lhs = rhs; CopyResourceAttributes(lhs.attr); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainResourceDestroy& lhs, ArgsDomainResourceDestroy const& rhs) { lhs = rhs; }
|
|
template <> inline void DeepCopyAssign(ArgsDomainNameCategoryA & lhs, ArgsDomainNameCategoryA const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainNameCategoryW & lhs, ArgsDomainNameCategoryW const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainRegisterStringA& lhs, ArgsDomainRegisterStringA const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainRegisterStringW& lhs, ArgsDomainRegisterStringW const& rhs) { lhs = rhs; CopyCstring(lhs.str); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainCreateA & lhs, ArgsDomainCreateA const& rhs) { lhs = rhs; CopyCstring(lhs.name); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainCreateW & lhs, ArgsDomainCreateW const& rhs) { lhs = rhs; CopyCstring(lhs.name); }
|
|
template <> inline void DeepCopyAssign(ArgsDomainDestroy & lhs, ArgsDomainDestroy const& rhs) { lhs = rhs; }
|
|
template <> inline void DeepCopyAssign(ArgsInitialize & lhs, ArgsInitialize const& rhs) { lhs = rhs; }
|
|
|
|
template <typename ArgsT> inline void DeepCopyDestroy(ArgsT&) {}
|
|
|
|
template <> inline void DeepCopyDestroy(ArgsMarkEx & args) { DestroyEventAttributes(args.eventAttrib); }
|
|
template <> inline void DeepCopyDestroy(ArgsMarkA & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsMarkW & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsRangeStartEx & args) { DestroyEventAttributes(args.eventAttrib); }
|
|
template <> inline void DeepCopyDestroy(ArgsRangeStartA & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsRangeStartW & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsRangeEnd & /*args*/) { }
|
|
template <> inline void DeepCopyDestroy(ArgsRangePushEx & args) { DestroyEventAttributes(args.eventAttrib); }
|
|
template <> inline void DeepCopyDestroy(ArgsRangePushA & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsRangePushW & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsRangePop & /*args*/) { }
|
|
template <> inline void DeepCopyDestroy(ArgsNameCategoryA& args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsNameCategoryW& args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsNameOsThreadA& args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsNameOsThreadW& args) { DestroyCstring(args.str); }
|
|
|
|
template <> inline void DeepCopyDestroy(ArgsDomainMarkEx & args) { DestroyEventAttributes(args.eventAttrib); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainRangeStartEx & args) { DestroyEventAttributes(args.eventAttrib); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainRangeEnd & /*args*/) { }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainRangePushEx & args) { DestroyEventAttributes(args.eventAttrib); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainRangePop & /*args*/) { }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainResourceCreate & args) { DestroyResourceAttributes(args.attr); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainResourceDestroy& /*args*/) { }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainNameCategoryA & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainNameCategoryW & args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainRegisterStringA& args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainRegisterStringW& args) { DestroyCstring(args.str); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainCreateA & args) { DestroyCstring(args.name); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainCreateW & args) { DestroyCstring(args.name); }
|
|
template <> inline void DeepCopyDestroy(ArgsDomainDestroy & /*args*/) { }
|
|
template <> inline void DeepCopyDestroy(ArgsInitialize & /*args*/) { }
|
|
|
|
struct CallData
|
|
{
|
|
CallId id{NVTX_CB_MODULE_INVALID, 0};
|
|
Args args;
|
|
|
|
~CallData()
|
|
{
|
|
switch (id.mod)
|
|
{
|
|
case NVTX_CB_MODULE_CORE:
|
|
switch (id.cb)
|
|
{
|
|
case NVTX_CBID_CORE_MarkEx : DeepCopyDestroy(args.MarkEx ); break;
|
|
case NVTX_CBID_CORE_MarkA : DeepCopyDestroy(args.MarkA ); break;
|
|
case NVTX_CBID_CORE_MarkW : DeepCopyDestroy(args.MarkW ); break;
|
|
case NVTX_CBID_CORE_RangeStartEx : DeepCopyDestroy(args.RangeStartEx ); break;
|
|
case NVTX_CBID_CORE_RangeStartA : DeepCopyDestroy(args.RangeStartA ); break;
|
|
case NVTX_CBID_CORE_RangeStartW : DeepCopyDestroy(args.RangeStartW ); break;
|
|
case NVTX_CBID_CORE_RangeEnd : DeepCopyDestroy(args.RangeEnd ); break;
|
|
case NVTX_CBID_CORE_RangePushEx : DeepCopyDestroy(args.RangePushEx ); break;
|
|
case NVTX_CBID_CORE_RangePushA : DeepCopyDestroy(args.RangePushA ); break;
|
|
case NVTX_CBID_CORE_RangePushW : DeepCopyDestroy(args.RangePushW ); break;
|
|
case NVTX_CBID_CORE_RangePop : DeepCopyDestroy(args.RangePop ); break;
|
|
case NVTX_CBID_CORE_NameCategoryA: DeepCopyDestroy(args.NameCategoryA); break;
|
|
case NVTX_CBID_CORE_NameCategoryW: DeepCopyDestroy(args.NameCategoryW); break;
|
|
case NVTX_CBID_CORE_NameOsThreadA: DeepCopyDestroy(args.NameOsThreadA); break;
|
|
case NVTX_CBID_CORE_NameOsThreadW: DeepCopyDestroy(args.NameOsThreadW); break;
|
|
default: break;
|
|
}
|
|
break;
|
|
case NVTX_CB_MODULE_CORE2:
|
|
switch (id.cb)
|
|
{
|
|
case NVTX_CBID_CORE2_DomainMarkEx : DeepCopyDestroy(args.DomainMarkEx ); break;
|
|
case NVTX_CBID_CORE2_DomainRangeStartEx : DeepCopyDestroy(args.DomainRangeStartEx ); break;
|
|
case NVTX_CBID_CORE2_DomainRangeEnd : DeepCopyDestroy(args.DomainRangeEnd ); break;
|
|
case NVTX_CBID_CORE2_DomainRangePushEx : DeepCopyDestroy(args.DomainRangePushEx ); break;
|
|
case NVTX_CBID_CORE2_DomainRangePop : DeepCopyDestroy(args.DomainRangePop ); break;
|
|
case NVTX_CBID_CORE2_DomainResourceCreate : DeepCopyDestroy(args.DomainResourceCreate ); break;
|
|
case NVTX_CBID_CORE2_DomainResourceDestroy: DeepCopyDestroy(args.DomainResourceDestroy); break;
|
|
case NVTX_CBID_CORE2_DomainNameCategoryA : DeepCopyDestroy(args.DomainNameCategoryA ); break;
|
|
case NVTX_CBID_CORE2_DomainNameCategoryW : DeepCopyDestroy(args.DomainNameCategoryW ); break;
|
|
case NVTX_CBID_CORE2_DomainRegisterStringA: DeepCopyDestroy(args.DomainRegisterStringA); break;
|
|
case NVTX_CBID_CORE2_DomainRegisterStringW: DeepCopyDestroy(args.DomainRegisterStringW); break;
|
|
case NVTX_CBID_CORE2_DomainCreateA : DeepCopyDestroy(args.DomainCreateA ); break;
|
|
case NVTX_CBID_CORE2_DomainCreateW : DeepCopyDestroy(args.DomainCreateW ); break;
|
|
case NVTX_CBID_CORE2_DomainDestroy : DeepCopyDestroy(args.DomainDestroy ); break;
|
|
case NVTX_CBID_CORE2_Initialize : DeepCopyDestroy(args.Initialize ); break;
|
|
default: break;
|
|
}
|
|
break;
|
|
case NVTX_CB_MODULE_SYNC:
|
|
case NVTX_CB_MODULE_CUDA:
|
|
case NVTX_CB_MODULE_CUDART:
|
|
case NVTX_CB_MODULE_OPENCL:
|
|
case NVTX_CB_MODULE_INVALID:
|
|
case NVTX_CB_MODULE_SIZE:
|
|
case NVTX_CB_MODULE_FORCE_INT:
|
|
default: break;
|
|
}
|
|
}
|
|
};
|
|
|
|
inline std::ostream& operator<<(std::ostream& os, CallData const& data)
|
|
{
|
|
if (data.id == CALLID_LOAD())
|
|
{
|
|
return os << CallName(data.id) << " returned " << data.args.Load.success;
|
|
}
|
|
|
|
os << "[" << data.id.mod << "," << std::setw(2) << data.id.cb << "] ";
|
|
os << CallName(data.id) << '(';
|
|
switch (data.id.mod)
|
|
{
|
|
case NVTX_CB_MODULE_CORE:
|
|
switch (data.id.cb)
|
|
{
|
|
case NVTX_CBID_CORE_MarkEx : {auto& a = data.args.MarkEx ; os << *a.eventAttrib; } break;
|
|
case NVTX_CBID_CORE_MarkA : {auto& a = data.args.MarkA ; os << '"' << a.str << '"'; } break;
|
|
case NVTX_CBID_CORE_MarkW : {/*auto& a = data.args.MarkW ;*/ os << "WIDE"; } break;
|
|
case NVTX_CBID_CORE_RangeStartEx : {auto& a = data.args.RangeStartEx ; os << *a.eventAttrib; } break;
|
|
case NVTX_CBID_CORE_RangeStartA : {auto& a = data.args.RangeStartA ; os << '"' << a.str << '"'; } break;
|
|
case NVTX_CBID_CORE_RangeStartW : {/*auto& a = data.args.RangeStartW;*/ os << "WIDE"; } break;
|
|
case NVTX_CBID_CORE_RangeEnd : {auto& a = data.args.RangeEnd ; os << a.id; } break;
|
|
case NVTX_CBID_CORE_RangePushEx : {auto& a = data.args.RangePushEx ; os << *a.eventAttrib; } break;
|
|
case NVTX_CBID_CORE_RangePushA : {auto& a = data.args.RangePushA ; os << '"' << a.str << '"'; } break;
|
|
case NVTX_CBID_CORE_RangePushW : {/*auto& a = data.args.RangePushW ;*/ os << "WIDE"; } break;
|
|
case NVTX_CBID_CORE_RangePop : {/*auto& a = data.args.RangePop ;*/ } break;
|
|
case NVTX_CBID_CORE_NameCategoryA: {auto& a = data.args.NameCategoryA; os << a.id << ", \"" << a.str << '"'; } break;
|
|
case NVTX_CBID_CORE_NameCategoryW: {auto& a = data.args.NameCategoryW; os << a.id << ", " << "WIDE"; } break;
|
|
case NVTX_CBID_CORE_NameOsThreadA: {auto& a = data.args.NameOsThreadA; os << a.id << ", \"" << a.str << '"'; } break;
|
|
case NVTX_CBID_CORE_NameOsThreadW: {auto& a = data.args.NameOsThreadW; os << a.id << ", " << "WIDE"; } break;
|
|
default: break;
|
|
}
|
|
break;
|
|
case NVTX_CB_MODULE_CORE2:
|
|
switch (data.id.cb)
|
|
{
|
|
case NVTX_CBID_CORE2_DomainMarkEx : {auto& a = data.args.DomainMarkEx ; os << a.domain << ", " << *a.eventAttrib; } break;
|
|
case NVTX_CBID_CORE2_DomainRangeStartEx : {auto& a = data.args.DomainRangeStartEx ; os << a.domain << ", " << *a.eventAttrib; } break;
|
|
case NVTX_CBID_CORE2_DomainRangeEnd : {auto& a = data.args.DomainRangeEnd ; os << a.domain << ", " << a.id; } break;
|
|
case NVTX_CBID_CORE2_DomainRangePushEx : {auto& a = data.args.DomainRangePushEx ; os << a.domain << ", " << *a.eventAttrib; } break;
|
|
case NVTX_CBID_CORE2_DomainRangePop : {auto& a = data.args.DomainRangePop ; os << a.domain; } break;
|
|
case NVTX_CBID_CORE2_DomainResourceCreate : {auto& a = data.args.DomainResourceCreate ; os << a.domain << ", " << a.attr; } break; // TODO
|
|
case NVTX_CBID_CORE2_DomainResourceDestroy: {auto& a = data.args.DomainResourceDestroy; os << a.attr; } break;
|
|
case NVTX_CBID_CORE2_DomainNameCategoryA : {auto& a = data.args.DomainNameCategoryA ; os << a.domain << ", " << a.id << ", \"" << a.str << '"';} break;
|
|
case NVTX_CBID_CORE2_DomainNameCategoryW : {auto& a = data.args.DomainNameCategoryW ; os << a.domain << ", " << a.id << ", " << "WIDE"; } break;
|
|
case NVTX_CBID_CORE2_DomainRegisterStringA: {auto& a = data.args.DomainRegisterStringA; os << a.domain << ", \"" << a.str << '"'; } break;
|
|
case NVTX_CBID_CORE2_DomainRegisterStringW: {auto& a = data.args.DomainRegisterStringW; os << a.domain << ", " << "WIDE"; } break;
|
|
case NVTX_CBID_CORE2_DomainCreateA : {auto& a = data.args.DomainCreateA ; os << '"' << a.name << '"'; } break;
|
|
case NVTX_CBID_CORE2_DomainCreateW : {/*auto& a = data.args.DomainCreateW ;*/ os << "WIDE"; } break;
|
|
case NVTX_CBID_CORE2_DomainDestroy : {auto& a = data.args.DomainDestroy ; os << a.domain; } break;
|
|
case NVTX_CBID_CORE2_Initialize : {auto& a = data.args.Initialize ; os << a.reserved; } break;
|
|
default: break;
|
|
}
|
|
break;
|
|
case NVTX_CB_MODULE_SYNC:
|
|
case NVTX_CB_MODULE_CUDA:
|
|
case NVTX_CB_MODULE_CUDART:
|
|
case NVTX_CB_MODULE_OPENCL:
|
|
case NVTX_CB_MODULE_INVALID:
|
|
case NVTX_CB_MODULE_SIZE:
|
|
case NVTX_CB_MODULE_FORCE_INT:
|
|
default: break;
|
|
}
|
|
os << ')';
|
|
return os;
|
|
}
|
|
|
|
using Call = std::shared_ptr<CallData>;
|
|
|
|
// Helper to write CALL(CORE, NameCategoryA, id, str) to construct a Call with arg values
|
|
#define CALL0(m,c) [=]{ Call v(new CallData); v->id = CALLID(m,c); DeepCopyAssign(v->args.c, Args##c{}); return v; }()
|
|
#define CALL(m,c,...) [=]{ Call v(new CallData); v->id = CALLID(m,c); DeepCopyAssign(v->args.c, Args##c{__VA_ARGS__}); return v; }()
|
|
|
|
#define CALL_LOAD(s) [=]{ Call v(new CallData); v->id = CALLID_LOAD(); v->args.Load = ArgsLoad{s}; return v; }()
|
|
|
|
// Helpers to construct unions from NVTX C API types
|
|
inline nvtxMessageValue_t MakeMessage(const char* msg) { nvtxMessageValue_t v; v.ascii = msg; return v; }
|
|
inline nvtxMessageValue_t MakeMessage(const wchar_t* msg) { nvtxMessageValue_t v; v.unicode = msg; return v; }
|
|
inline nvtxMessageValue_t MakeMessage(nvtxStringHandle_t msg) { nvtxMessageValue_t v; v.registered = msg; return v; }
|
|
|
|
inline nvtxEventAttributes_t::payload_t MakePayload(uint64_t v) { nvtxEventAttributes_t::payload_t p; p.ullValue = v; return p; }
|
|
inline nvtxEventAttributes_t::payload_t MakePayload(int64_t v) { nvtxEventAttributes_t::payload_t p; p.llValue = v; return p; }
|
|
inline nvtxEventAttributes_t::payload_t MakePayload(double v) { nvtxEventAttributes_t::payload_t p; p.dValue = v; return p; }
|
|
inline nvtxEventAttributes_t::payload_t MakePayload(uint32_t v) { nvtxEventAttributes_t::payload_t p; p.uiValue = v; return p; }
|
|
inline nvtxEventAttributes_t::payload_t MakePayload(int32_t v) { nvtxEventAttributes_t::payload_t p; p.iValue = v; return p; }
|
|
inline nvtxEventAttributes_t::payload_t MakePayload(float v) { nvtxEventAttributes_t::payload_t p; p.fValue = v; return p; }
|
|
|
|
// Define Same() overloads for NVTX API types
|
|
inline bool Same(nvtxEventAttributes_t const& lhs, nvtxEventAttributes_t const& rhs, SAME_COMMON_ARGS)
|
|
{
|
|
bool same = true
|
|
&& MEMBER_SAME(version)
|
|
&& MEMBER_SAME(size)
|
|
&& MEMBER_SAME(category)
|
|
&& MEMBER_SAME(colorType)
|
|
&& MEMBER_SAME(color)
|
|
&& MEMBER_SAME(payloadType)
|
|
&& (false
|
|
|| lhs.payloadType == NVTX_PAYLOAD_UNKNOWN
|
|
|| (lhs.payloadType == NVTX_PAYLOAD_TYPE_UNSIGNED_INT64 && MEMBER_SAME(payload.ullValue))
|
|
|| (lhs.payloadType == NVTX_PAYLOAD_TYPE_INT64 && MEMBER_SAME(payload.llValue))
|
|
|| (lhs.payloadType == NVTX_PAYLOAD_TYPE_DOUBLE && MEMBER_SAME(payload.dValue))
|
|
|| (lhs.payloadType == NVTX_PAYLOAD_TYPE_UNSIGNED_INT32 && MEMBER_SAME(payload.uiValue))
|
|
|| (lhs.payloadType == NVTX_PAYLOAD_TYPE_INT32 && MEMBER_SAME(payload.iValue))
|
|
|| (lhs.payloadType == NVTX_PAYLOAD_TYPE_FLOAT && MEMBER_SAME(payload.fValue))
|
|
)
|
|
&& MEMBER_SAME(messageType)
|
|
&& (false
|
|
|| lhs.messageType == NVTX_MESSAGE_UNKNOWN
|
|
|| (lhs.messageType == NVTX_MESSAGE_TYPE_ASCII && MEMBER_SAME(message.ascii))
|
|
|| (lhs.messageType == NVTX_MESSAGE_TYPE_UNICODE && MEMBER_SAME(message.unicode))
|
|
|| (lhs.messageType == NVTX_MESSAGE_TYPE_REGISTERED && MEMBER_SAME(message.registered))
|
|
)
|
|
;
|
|
VERBOSE_PRINT()
|
|
<< std::string(depth, ' ') << "Expected: " << rhs << "\n"
|
|
<< std::string(depth, ' ') << "Provided: " << lhs << "\n";
|
|
return same;
|
|
}
|
|
DEFINE_EQ_NE_DEEP(nvtxEventAttributes_t)
|
|
|
|
inline bool Same(nvtxResourceAttributes_t const& lhs, nvtxResourceAttributes_t const& rhs, SAME_COMMON_ARGS)
|
|
{
|
|
bool same = true
|
|
&& MEMBER_SAME(version)
|
|
&& MEMBER_SAME(size)
|
|
&& MEMBER_SAME(identifierType)
|
|
&& (false
|
|
|| lhs.identifierType == NVTX_RESOURCE_TYPE_UNKNOWN
|
|
|| (lhs.identifierType == NVTX_RESOURCE_TYPE_GENERIC_POINTER && PVOID_MEMBER_SAME(identifier.pValue))
|
|
|| (lhs.identifierType == NVTX_RESOURCE_TYPE_GENERIC_HANDLE && MEMBER_SAME(identifier.ullValue))
|
|
|| (lhs.identifierType == NVTX_RESOURCE_TYPE_GENERIC_THREAD_NATIVE && MEMBER_SAME(identifier.ullValue))
|
|
|| (lhs.identifierType == NVTX_RESOURCE_TYPE_GENERIC_THREAD_POSIX && MEMBER_SAME(identifier.ullValue))
|
|
)
|
|
&& MEMBER_SAME(messageType)
|
|
&& (false
|
|
|| lhs.messageType == NVTX_MESSAGE_UNKNOWN
|
|
|| (lhs.messageType == NVTX_MESSAGE_TYPE_ASCII && MEMBER_SAME(message.ascii))
|
|
|| (lhs.messageType == NVTX_MESSAGE_TYPE_UNICODE && MEMBER_SAME(message.unicode))
|
|
|| (lhs.messageType == NVTX_MESSAGE_TYPE_REGISTERED && MEMBER_SAME(message.registered))
|
|
)
|
|
;
|
|
VERBOSE_PRINT();
|
|
return same;
|
|
}
|
|
DEFINE_EQ_NE_DEEP(nvtxResourceAttributes_t)
|
|
|
|
// Define Same() overloads (and operators == and !=) for NVTX arg pack types & Args union
|
|
|
|
#define DEFINE_ARGS_SAME_0(cb) DEFINE_SAME_0(Args##cb)
|
|
#define DEFINE_ARGS_SAME_1(cb, a) DEFINE_SAME_1(Args##cb, a)
|
|
#define DEFINE_ARGS_SAME_2(cb, a, b) DEFINE_SAME_2(Args##cb, a, b)
|
|
#define DEFINE_ARGS_SAME_3(cb, a, b, c) DEFINE_SAME_3(Args##cb, a, b, c)
|
|
|
|
#define DEFINE_ARGS_PVOID_SAME_1(cb, a) DEFINE_PVOID_SAME_1(Args##cb, a)
|
|
|
|
DEFINE_ARGS_SAME_1(Load, success)
|
|
// CORE
|
|
DEFINE_ARGS_SAME_1(MarkEx, eventAttrib)
|
|
DEFINE_ARGS_SAME_1(MarkA, str)
|
|
DEFINE_ARGS_SAME_1(MarkW, str)
|
|
DEFINE_ARGS_SAME_1(RangeStartEx, eventAttrib)
|
|
DEFINE_ARGS_SAME_1(RangeStartA, str)
|
|
DEFINE_ARGS_SAME_1(RangeStartW, str)
|
|
DEFINE_ARGS_SAME_0(RangeEnd)
|
|
DEFINE_ARGS_SAME_1(RangePushEx, eventAttrib)
|
|
DEFINE_ARGS_SAME_1(RangePushA, str)
|
|
DEFINE_ARGS_SAME_1(RangePushW, str)
|
|
DEFINE_ARGS_SAME_0(RangePop)
|
|
DEFINE_ARGS_SAME_2(NameCategoryA, id, str)
|
|
DEFINE_ARGS_SAME_2(NameCategoryW, id, str)
|
|
DEFINE_ARGS_SAME_2(NameOsThreadA, id, str)
|
|
DEFINE_ARGS_SAME_2(NameOsThreadW, id, str)
|
|
// CORE2
|
|
DEFINE_ARGS_SAME_2(DomainMarkEx, domain, eventAttrib)
|
|
DEFINE_ARGS_SAME_2(DomainRangeStartEx, domain, eventAttrib)
|
|
DEFINE_ARGS_SAME_2(DomainRangeEnd, domain, id)
|
|
DEFINE_ARGS_SAME_2(DomainRangePushEx, domain, eventAttrib)
|
|
DEFINE_ARGS_SAME_1(DomainRangePop, domain)
|
|
DEFINE_ARGS_SAME_2(DomainResourceCreate, domain, attr)
|
|
DEFINE_ARGS_SAME_1(DomainResourceDestroy, attr)
|
|
DEFINE_ARGS_SAME_3(DomainNameCategoryA, domain, id, str)
|
|
DEFINE_ARGS_SAME_3(DomainNameCategoryW, domain, id, str)
|
|
DEFINE_ARGS_SAME_2(DomainRegisterStringA, domain, str)
|
|
DEFINE_ARGS_SAME_2(DomainRegisterStringW, domain, str)
|
|
DEFINE_ARGS_SAME_1(DomainCreateA, name)
|
|
DEFINE_ARGS_SAME_1(DomainCreateW, name)
|
|
DEFINE_ARGS_SAME_1(DomainDestroy, domain)
|
|
DEFINE_ARGS_PVOID_SAME_1(Initialize, reserved)
|
|
|
|
inline bool Same(CallData const& lhs, CallData const& rhs, SAME_COMMON_ARGS)
|
|
{
|
|
bool same = true
|
|
&& MEMBER_SAME(id)
|
|
&& (false
|
|
|| UNION_MEMBER_SAME(id, CALLID_LOAD(), args.Load)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, MarkEx), args.MarkEx)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, MarkA), args.MarkA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, MarkW), args.MarkW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangeStartEx), args.RangeStartEx)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangeStartA), args.RangeStartA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangeStartW), args.RangeStartW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangeEnd), args.RangeEnd)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangePushEx), args.RangePushEx)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangePushA), args.RangePushA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangePushW), args.RangePushW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, RangePop), args.RangePop)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, NameCategoryA), args.NameCategoryA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, NameCategoryW), args.NameCategoryW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, NameOsThreadA), args.NameOsThreadA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE, NameOsThreadW), args.NameOsThreadW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainMarkEx), args.DomainMarkEx)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainRangeStartEx), args.DomainRangeStartEx)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainRangeEnd), args.DomainRangeEnd)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainRangePushEx), args.DomainRangePushEx)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainRangePop), args.DomainRangePop)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainResourceCreate), args.DomainResourceCreate)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainResourceDestroy), args.DomainResourceDestroy)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainNameCategoryA), args.DomainNameCategoryA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainNameCategoryW), args.DomainNameCategoryW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainRegisterStringA), args.DomainRegisterStringA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainRegisterStringW), args.DomainRegisterStringW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainCreateA), args.DomainCreateA)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainCreateW), args.DomainCreateW)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, DomainDestroy), args.DomainDestroy)
|
|
|| UNION_MEMBER_SAME(id, CALLID(CORE2, Initialize), args.Initialize)
|
|
)
|
|
;
|
|
|
|
VERBOSE_PRINT();
|
|
return same;
|
|
}
|
|
DEFINE_EQ_NE_DEEP(CallData)
|
|
|
|
inline nvtxDomainHandle_t PostInc(nvtxDomainHandle_t & h) { auto v = h; h = reinterpret_cast<nvtxDomainHandle_t >(reinterpret_cast<intptr_t>(h) + 1); return v; }
|
|
inline nvtxStringHandle_t PostInc(nvtxStringHandle_t & h) { auto v = h; h = reinterpret_cast<nvtxStringHandle_t >(reinterpret_cast<intptr_t>(h) + 1); return v; }
|
|
inline nvtxResourceHandle_t PostInc(nvtxResourceHandle_t& h) { auto v = h; h = reinterpret_cast<nvtxResourceHandle_t>(reinterpret_cast<intptr_t>(h) + 1); return v; }
|
|
inline nvtxRangeId_t PostInc(nvtxRangeId_t & h) { return h++; }
|
|
|
|
struct Callbacks
|
|
{
|
|
std::function<void(Call const&)> Default;
|
|
std::function<void(int)> Load;
|
|
|
|
std::function<void(const nvtxEventAttributes_t*)> MarkEx;
|
|
std::function<void(const char*)> MarkA;
|
|
std::function<void(const wchar_t*)> MarkW;
|
|
std::function<nvtxRangeId_t(const nvtxEventAttributes_t*)> RangeStartEx;
|
|
std::function<nvtxRangeId_t(const char*)> RangeStartA;
|
|
std::function<nvtxRangeId_t(const wchar_t*)> RangeStartW;
|
|
std::function<void(nvtxRangeId_t)> RangeEnd;
|
|
std::function<int(const nvtxEventAttributes_t*)> RangePushEx;
|
|
std::function<int(const char*)> RangePushA;
|
|
std::function<int(const wchar_t*)> RangePushW;
|
|
std::function<int()> RangePop;
|
|
std::function<void(uint32_t, const char*)> NameCategoryA;
|
|
std::function<void(uint32_t, const wchar_t*)> NameCategoryW;
|
|
std::function<void(uint32_t, const char*)> NameOsThreadA;
|
|
std::function<void(uint32_t, const wchar_t*)> NameOsThreadW;
|
|
|
|
std::function<void(nvtxDomainHandle_t, const nvtxEventAttributes_t*)> DomainMarkEx;
|
|
std::function<nvtxRangeId_t(nvtxDomainHandle_t, const nvtxEventAttributes_t*)> DomainRangeStartEx;
|
|
std::function<void(nvtxDomainHandle_t, nvtxRangeId_t)> DomainRangeEnd;
|
|
std::function<int(nvtxDomainHandle_t, const nvtxEventAttributes_t*)> DomainRangePushEx;
|
|
std::function<int(nvtxDomainHandle_t)> DomainRangePop;
|
|
std::function<nvtxResourceHandle_t(nvtxDomainHandle_t, nvtxResourceAttributes_t*)> DomainResourceCreate;
|
|
std::function<void(nvtxResourceHandle_t)> DomainResourceDestroy;
|
|
std::function<void(nvtxDomainHandle_t, uint32_t, const char*)> DomainNameCategoryA;
|
|
std::function<void(nvtxDomainHandle_t, uint32_t, const wchar_t*)> DomainNameCategoryW;
|
|
std::function<nvtxStringHandle_t(nvtxDomainHandle_t, const char*)> DomainRegisterStringA;
|
|
std::function<nvtxStringHandle_t(nvtxDomainHandle_t, const wchar_t*)> DomainRegisterStringW;
|
|
std::function<nvtxDomainHandle_t(const char*)> DomainCreateA;
|
|
std::function<nvtxDomainHandle_t(const wchar_t*)> DomainCreateW;
|
|
std::function<void(nvtxDomainHandle_t)> DomainDestroy;
|
|
std::function<void(const void*)> Initialize;
|
|
|
|
|
|
Callbacks(Callbacks const&) = default;
|
|
Callbacks& operator=(Callbacks const&) = default;
|
|
Callbacks(Callbacks&&) = default;
|
|
Callbacks& operator=(Callbacks&&) = default;
|
|
|
|
nvtxDomainHandle_t nextDomainHandle = reinterpret_cast<nvtxDomainHandle_t>(1);
|
|
struct DomainData
|
|
{
|
|
int pushPopDepth = 0;
|
|
nvtxRangeId_t nextRangeId = static_cast<nvtxRangeId_t>(1);
|
|
nvtxStringHandle_t nextStringHandle = reinterpret_cast<nvtxStringHandle_t>(1);
|
|
nvtxResourceHandle_t nextResourceHandle = reinterpret_cast<nvtxResourceHandle_t>(1);
|
|
};
|
|
std::map<nvtxDomainHandle_t, DomainData> domainData;
|
|
|
|
Callbacks()
|
|
: Default([](Call const&) {})
|
|
, Load ([&](int success) { Default(CALL_LOAD(success)); })
|
|
// CORE
|
|
, MarkEx ([&](const nvtxEventAttributes_t* a) { Default(CALL(CORE, MarkEx , a )); })
|
|
, MarkA ([&](const char* a) { Default(CALL(CORE, MarkA , a )); })
|
|
, MarkW ([&](const wchar_t* a) { Default(CALL(CORE, MarkW , a )); })
|
|
, RangeStartEx ([&](const nvtxEventAttributes_t* a) { Default(CALL(CORE, RangeStartEx , a )); return PostInc(domainData[nullptr].nextRangeId); })
|
|
, RangeStartA ([&](const char* a) { Default(CALL(CORE, RangeStartA , a )); return PostInc(domainData[nullptr].nextRangeId); })
|
|
, RangeStartW ([&](const wchar_t* a) { Default(CALL(CORE, RangeStartW , a )); return PostInc(domainData[nullptr].nextRangeId); })
|
|
, RangeEnd ([&](nvtxRangeId_t a) { Default(CALL(CORE, RangeEnd , a )); })
|
|
, RangePushEx ([&](const nvtxEventAttributes_t* a) { Default(CALL(CORE, RangePushEx , a )); return ++domainData[nullptr].pushPopDepth; })
|
|
, RangePushA ([&](const char* a) { Default(CALL(CORE, RangePushA , a )); return ++domainData[nullptr].pushPopDepth; })
|
|
, RangePushW ([&](const wchar_t* a) { Default(CALL(CORE, RangePushW , a )); return ++domainData[nullptr].pushPopDepth; })
|
|
, RangePop ([&]( ) { Default(CALL0(CORE, RangePop )); return domainData[nullptr].pushPopDepth--; })
|
|
, NameCategoryA([&](uint32_t a, const char* b) { Default(CALL(CORE, NameCategoryA, a, b)); })
|
|
, NameCategoryW([&](uint32_t a, const wchar_t* b) { Default(CALL(CORE, NameCategoryW, a, b)); })
|
|
, NameOsThreadA([&](uint32_t a, const char* b) { Default(CALL(CORE, NameOsThreadA, a, b)); })
|
|
, NameOsThreadW([&](uint32_t a, const wchar_t* b) { Default(CALL(CORE, NameOsThreadW, a, b)); })
|
|
// CORE2
|
|
, DomainMarkEx ([&](nvtxDomainHandle_t a, const nvtxEventAttributes_t* b) { Default(CALL(CORE2, DomainMarkEx , a, b )); })
|
|
, DomainRangeStartEx ([&](nvtxDomainHandle_t a, const nvtxEventAttributes_t* b) { Default(CALL(CORE2, DomainRangeStartEx , a, b )); return PostInc(domainData[a].nextRangeId); })
|
|
, DomainRangeEnd ([&](nvtxDomainHandle_t a, nvtxRangeId_t b) { Default(CALL(CORE2, DomainRangeEnd , a, b )); })
|
|
, DomainRangePushEx ([&](nvtxDomainHandle_t a, const nvtxEventAttributes_t* b) { Default(CALL(CORE2, DomainRangePushEx , a, b )); return ++domainData[a].pushPopDepth; })
|
|
, DomainRangePop ([&](nvtxDomainHandle_t a) { Default(CALL(CORE2, DomainRangePop , a )); return domainData[a].pushPopDepth--; })
|
|
, DomainResourceCreate ([&](nvtxDomainHandle_t a, nvtxResourceAttributes_t* b) { Default(CALL(CORE2, DomainResourceCreate , a, b )); return PostInc(domainData[a].nextResourceHandle); })
|
|
, DomainResourceDestroy([&](nvtxResourceHandle_t a) { Default(CALL(CORE2, DomainResourceDestroy, a )); })
|
|
, DomainNameCategoryA ([&](nvtxDomainHandle_t a, uint32_t b, const char* c) { Default(CALL(CORE2, DomainNameCategoryA , a, b, c)); })
|
|
, DomainNameCategoryW ([&](nvtxDomainHandle_t a, uint32_t b, const wchar_t* c) { Default(CALL(CORE2, DomainNameCategoryW , a, b, c)); })
|
|
, DomainRegisterStringA([&](nvtxDomainHandle_t a, const char* b) { Default(CALL(CORE2, DomainRegisterStringA, a, b )); return PostInc(domainData[a].nextStringHandle); })
|
|
, DomainRegisterStringW([&](nvtxDomainHandle_t a, const wchar_t* b) { Default(CALL(CORE2, DomainRegisterStringW, a, b )); return PostInc(domainData[a].nextStringHandle); })
|
|
, DomainCreateA ([&](const char* a) { Default(CALL(CORE2, DomainCreateA , a )); return PostInc(nextDomainHandle); })
|
|
, DomainCreateW ([&](const wchar_t* a) { Default(CALL(CORE2, DomainCreateW , a )); return PostInc(nextDomainHandle); })
|
|
, DomainDestroy ([&](nvtxDomainHandle_t a) { Default(CALL(CORE2, DomainDestroy , a )); })
|
|
, Initialize ([&](const void* a) { Default(CALL(CORE2, Initialize , a )); })
|
|
{
|
|
}
|
|
};
|
|
|
|
extern Callbacks g_callbacks;
|
|
|
|
|