Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ngfx sdk integration #777

Merged
merged 12 commits into from
Dec 31, 2024
18 changes: 12 additions & 6 deletions include/nbl/video/IAPIConnection.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "nbl/video/debug/IDebugCallback.h"

#include "nbl/video/utilities/renderdoc.h"
#include "nbl/video/utilities/ngfx.h"

namespace nbl::video
{
Expand Down Expand Up @@ -61,25 +60,32 @@ class NBL_API2 IAPIConnection : public core::IReferenceCounted

const SFeatures& getEnabledFeatures() const { return m_enabledFeatures; }

enum DebuggerType
enum SDebuggerType
{
EDT_NONE,
EDT_RENDERDOC,
EDT_NGFX
};
const DebuggerType isRunningInGraphicsDebugger() const {
return m_ngfx_api.useNGFX ? EDT_NGFX : // ngfx takes priority?
m_rdoc_api ? EDT_RENDERDOC : EDT_NONE;
}
const SDebuggerType isRunningInGraphicsDebugger() const { return m_debuggerType; }
virtual bool startCapture() = 0;
virtual bool endCapture() = 0;

protected:
IAPIConnection(const SFeatures& enabledFeatures);

std::vector<std::unique_ptr<IPhysicalDevice>> m_physicalDevices;
SDebuggerType m_debuggerType;
renderdoc_api_t* m_rdoc_api;

struct SNGFXIntegration {
bool useNGFX;

bool injectNGFXToProcess();
bool executeNGFXCommand();
};
using ngfx_api_t = SNGFXIntegration;
ngfx_api_t m_ngfx_api;

SFeatures m_enabledFeatures = {};
};

Expand Down
85 changes: 0 additions & 85 deletions include/nbl/video/utilities/ngfx.h

This file was deleted.

3 changes: 2 additions & 1 deletion src/nbl/video/CVulkanConnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ bool CVulkanConnection::startCapture()
if (debugType == EDT_RENDERDOC)
m_rdoc_api->StartFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(m_vkInstance), NULL);
else
executeNGFXCommand();
m_ngfx_api.executeNGFXCommand();
return true;
}

Expand All @@ -360,6 +360,7 @@ bool CVulkanConnection::endCapture()
if (debugType == EDT_RENDERDOC)
m_rdoc_api->EndFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(m_vkInstance), NULL);
// no equivalent end frame capture for ngfx, ends captures on next frame delimiter
// see https://www.reddit.com/r/GraphicsProgramming/comments/w0hl9o/graphics_debugger_record_before_first_frame/
flag.clear();
return true;
}
Expand Down
77 changes: 76 additions & 1 deletion src/nbl/video/IAPIConnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@
#include "nbl/video/utilities/renderdoc.h"
#include "nbl/video/utilities/ngfx.h"

// TODO: temporary hopefully
#include "C:\Program Files\NVIDIA Corporation\Nsight Graphics 2024.1.0\SDKs\NsightGraphicsSDK\0.8.0\include\NGFX_Injection.h"

#if defined(_NBL_POSIX_API_)
#include <dlfcn.h>
#endif

namespace nbl::video
{


std::span<IPhysicalDevice* const> IAPIConnection::getPhysicalDevices() const
{
static_assert(sizeof(std::unique_ptr<IPhysicalDevice>) == sizeof(void*));
Expand Down Expand Up @@ -46,8 +50,79 @@ IAPIConnection::IAPIConnection(const SFeatures& enabledFeatures)
#endif

// probably is platform agnostic, for now
injectNGFXToProcess(m_ngfx_api);
m_ngfx_api.injectNGFXToProcess();

m_debuggerType = m_ngfx_api.useNGFX ? EDT_NGFX : // ngfx takes priority?
m_rdoc_api ? EDT_RENDERDOC : EDT_NONE;
}
}

bool IAPIConnection::SNGFXIntegration::injectNGFXToProcess()
{
uint32_t numInstallations = 0;
auto result = NGFX_Injection_EnumerateInstallations(&numInstallations, nullptr);
if (numInstallations == 0 || NGFX_INJECTION_RESULT_OK != result)
{
useNGFX = false;
return false;
}

std::vector<NGFX_Injection_InstallationInfo> installations(numInstallations);
result = NGFX_Injection_EnumerateInstallations(&numInstallations, installations.data());
if (numInstallations == 0 || NGFX_INJECTION_RESULT_OK != result)
{
useNGFX = false;
return false;
}

// get latest installation
NGFX_Injection_InstallationInfo versionInfo = installations.back();

uint32_t numActivities = 0;
result = NGFX_Injection_EnumerateActivities(&versionInfo, &numActivities, nullptr);
if (numActivities == 0 || NGFX_INJECTION_RESULT_OK != result)
{
useNGFX = false;
return false;
}

std::vector<NGFX_Injection_Activity> activities(numActivities);
result = NGFX_Injection_EnumerateActivities(&versionInfo, &numActivities, activities.data());
if (NGFX_INJECTION_RESULT_OK != result)
{
useNGFX = false;
return false;
}

const NGFX_Injection_Activity* pActivityToInject = nullptr;
for (const NGFX_Injection_Activity& activity : activities)
{
if (activity.type == NGFX_INJECTION_ACTIVITY_FRAME_DEBUGGER) // only want frame debugger
{
pActivityToInject = &activity;
break;
}
}

if (!pActivityToInject) {
useNGFX = false;
return false;
}

result = NGFX_Injection_InjectToProcess(&versionInfo, pActivityToInject);
if (NGFX_INJECTION_RESULT_OK != result)
{
useNGFX = false;
return false;
}

useNGFX = true;
return true;
}

bool IAPIConnection::SNGFXIntegration::executeNGFXCommand()
{
return NGFX_Injection_ExecuteActivityCommand() == NGFX_INJECTION_RESULT_OK;
}

}