Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 94 additions & 2 deletions src/bgfx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,99 @@ namespace bgfx
}
#endif // BGFX_CONFIG_USE_TINYSTL

struct Superluminal
{
struct SuppressTailCallOptimization
{
int64_t SuppressTailCall[3];
};

typedef void (*SuperluminalBeginEventtFn)(const char* _inID, const char* _inData, uint32_t _inColor);
typedef SuppressTailCallOptimization(*SuperluminalEndEventFn)();

static void stubSuperluminalBeginEvent(const char* _inID, const char* _inData, uint32_t _inColor)
{
BX_UNUSED(_inID, _inData, _inColor);
}

static SuppressTailCallOptimization stubSuperluminalEndEvent()
{
return {};
}

bool init()
{
if (!BX_ENABLED(BGFX_CONFIG_PROFILER) )
{
return false;
}

const char* superluminalDllName = "PerformanceAPI.dll";
superluminalDll = bx::dlopen(superluminalDllName);

if (NULL != superluminalDll)
{
void* funcPtrs[11];

typedef int (*PerformanceAPI_GetAPI)(int32_t _version, void** _funcPtrs);

constexpr int32_t version = 0x30000;

PerformanceAPI_GetAPI getApi = bx::dlsym<PerformanceAPI_GetAPI>(superluminalDll, "PerformanceAPI_GetAPI");
if (NULL == getApi)
{
BX_TRACE("Failed to obtain Superluminal's %s GetAPI function!", superluminalDllName);
bx::dlclose(superluminalDll);
return false;
}

if (getApi(version, funcPtrs) )
{
BX_TRACE("Superluminal's PerformanceAPI.dll is loaded!");
beginEvent = (SuperluminalBeginEventtFn)funcPtrs[2];
endEvent = (SuperluminalEndEventFn )funcPtrs[6];
return true;
}

BX_TRACE("Failed to obtain Superluminal's %s GetAPI function!", superluminalDllName);
bx::dlclose(superluminalDll);
}
else
{
BX_TRACE("Failed to load Superluminal's %s!", superluminalDllName);
}

return false;
}

void shutdown()
{
if (NULL != superluminalDll)
{
bx::dlclose(superluminalDll);
superluminalDll = NULL;
beginEvent = stubSuperluminalBeginEvent;
endEvent = stubSuperluminalEndEvent;
}
}

void* superluminalDll = NULL;
SuperluminalBeginEventtFn beginEvent = stubSuperluminalBeginEvent;
SuperluminalEndEventFn endEvent = stubSuperluminalEndEvent;
};

struct CallbackStub : public CallbackI
{
Superluminal m_superluminal;

CallbackStub()
{
m_superluminal.init();
}

virtual ~CallbackStub()
{
m_superluminal.shutdown();
}

virtual void fatal(const char* _filePath, uint16_t _line, Fatal::Enum _code, const char* _str) override
Expand Down Expand Up @@ -108,16 +197,19 @@ namespace bgfx
bx::debugOutput(out);
}

virtual void profilerBegin(const char* /*_name*/, uint32_t /*_abgr*/, const char* /*_filePath*/, uint16_t /*_line*/) override
virtual void profilerBegin(const char* _name, uint32_t _abgr, const char* /*_filePath*/, uint16_t /*_line*/) override
{
m_superluminal.beginEvent(" ", _name, _abgr);
}

virtual void profilerBeginLiteral(const char* /*_name*/, uint32_t /*_abgr*/, const char* /*_filePath*/, uint16_t /*_line*/) override
virtual void profilerBeginLiteral(const char* _name, uint32_t _abgr, const char* /*_filePath*/, uint16_t /*_line*/) override
{
m_superluminal.beginEvent(_name, NULL, _abgr);
}

virtual void profilerEnd() override
{
m_superluminal.endEvent();
}

virtual uint32_t cacheReadSize(uint64_t /*_id*/) override
Expand Down
2 changes: 2 additions & 0 deletions src/bgfx_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ namespace bgfx
;
}

// Palette:
// https://colorkit.co/color-palette-generator/a8e6cf-dcedc1-ffd3b6-76b4bd-bdeaee-8874a3-ff0000-ff8b94/
constexpr uint32_t kColorFrame = toAbgr8(0xa8, 0xe6, 0xcf);
constexpr uint32_t kColorSubmit = toAbgr8(0xdc, 0xed, 0xc1);
constexpr uint32_t kColorView = toAbgr8(0xff, 0xd3, 0xb6);
Expand Down