rhi: d3d12: Implement debug markers

As usual this is only doing anything when launched with
QSG_RHI_PROFILE=1. Otherwise the debugMark* functions are
no-ops.

Uses the old PIX API (pix.h) since that is what is available in the
Windows SDK. This works well with RenderDoc. The strings show up
in PIX captures as well although that will warn that the pix.h stuff
is deprecated. Unfortunately using the PIX3 API involves headers and
libraries not part of the Windows SDK so we do not want to open that
can of worms now.

Problem is, pix.h may not be present in some SDKs as shown in the CI.
So use __has_include and lose the whole feature if the header is not
present at build time.

Change-Id: I8606d151f75a492071bf0c8d98b16026ff94d45c
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
Laszlo Agocs 2023-04-03 16:14:45 +02:00
parent 14feb6792e
commit 5f3c3044a5

View File

@ -14,6 +14,11 @@
#include "cs_mipmap_p.h"
#if __has_include(<pix.h>)
#include <pix.h>
#define QRHI_D3D12_HAS_OLD_PIX
#endif
QT_BEGIN_NAMESPACE
/*
@ -514,7 +519,11 @@ bool QRhiD3D12::isFeatureSupported(QRhi::Feature feature) const
case QRhi::MultisampleRenderBuffer:
return true;
case QRhi::DebugMarkers:
return false; // ###
#ifdef QRHI_D3D12_HAS_OLD_PIX
return true;
#else
return false;
#endif
case QRhi::Timestamps:
return false; // ###
case QRhi::Instancing:
@ -1261,19 +1270,43 @@ void QRhiD3D12::drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount,
void QRhiD3D12::debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name)
{
Q_UNUSED(cb);
if (!debugMarkers)
return;
QD3D12CommandBuffer *cbD = QRHI_RES(QD3D12CommandBuffer, cb);
#ifdef QRHI_D3D12_HAS_OLD_PIX
PIXBeginEvent(cbD->cmdList, PIX_COLOR_DEFAULT, reinterpret_cast<LPCWSTR>(QString::fromLatin1(name).utf16()));
#else
Q_UNUSED(cbD);
Q_UNUSED(name);
#endif
}
void QRhiD3D12::debugMarkEnd(QRhiCommandBuffer *cb)
{
Q_UNUSED(cb);
if (!debugMarkers)
return;
QD3D12CommandBuffer *cbD = QRHI_RES(QD3D12CommandBuffer, cb);
#ifdef QRHI_D3D12_HAS_OLD_PIX
PIXEndEvent(cbD->cmdList);
#else
Q_UNUSED(cbD);
#endif
}
void QRhiD3D12::debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg)
{
Q_UNUSED(cb);
if (!debugMarkers)
return;
QD3D12CommandBuffer *cbD = QRHI_RES(QD3D12CommandBuffer, cb);
#ifdef QRHI_D3D12_HAS_OLD_PIX
PIXSetMarker(cbD->cmdList, PIX_COLOR_DEFAULT, reinterpret_cast<LPCWSTR>(QString::fromLatin1(msg).utf16()));
#else
Q_UNUSED(cbD);
Q_UNUSED(msg);
#endif
}
const QRhiNativeHandles *QRhiD3D12::nativeHandles(QRhiCommandBuffer *cb)