mirror of https://github.com/AxioDL/metaforce.git
aurora: Add graphics debug group stack
This commit is contained in:
parent
67818aaabc
commit
e409f05b40
|
@ -287,6 +287,11 @@ void CCubeRenderer::RemoveStaticGeometry(const std::vector<CMetroidModelInstance
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DrawUnsortedGeometry(s32 areaIdx, s32 mask, s32 targetMask, bool shadowRender) {
|
void CCubeRenderer::DrawUnsortedGeometry(s32 areaIdx, s32 mask, s32 targetMask, bool shadowRender) {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(
|
||||||
|
fmt::format(FMT_STRING("CCubeRenderer::DrawUnsortedGeometry areaIdx={} mask={} targetMask={} shadowRender={}"),
|
||||||
|
areaIdx, mask, targetMask, shadowRender),
|
||||||
|
zeus::skBlue);
|
||||||
|
|
||||||
SetupRendererStates(true);
|
SetupRendererStates(true);
|
||||||
CModelFlags flags;
|
CModelFlags flags;
|
||||||
CAreaListItem* lastOctreeItem = nullptr;
|
CAreaListItem* lastOctreeItem = nullptr;
|
||||||
|
@ -359,6 +364,11 @@ void CCubeRenderer::DrawUnsortedGeometry(s32 areaIdx, s32 mask, s32 targetMask,
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DrawSortedGeometry(s32 areaIdx, s32 mask, s32 targetMask) {
|
void CCubeRenderer::DrawSortedGeometry(s32 areaIdx, s32 mask, s32 targetMask) {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(
|
||||||
|
fmt::format(FMT_STRING("CCubeRenderer::DrawSortedGeometry areaIdx={} mask={} targetMask={}"), areaIdx, mask,
|
||||||
|
targetMask),
|
||||||
|
zeus::skBlue);
|
||||||
|
|
||||||
SetupRendererStates(true);
|
SetupRendererStates(true);
|
||||||
const CAreaListItem* item = nullptr;
|
const CAreaListItem* item = nullptr;
|
||||||
for (const auto& areaListItem : x1c_areaListItems) {
|
for (const auto& areaListItem : x1c_areaListItems) {
|
||||||
|
@ -387,6 +397,11 @@ void CCubeRenderer::DrawStaticGeometry(s32 areaIdx, s32 mask, s32 targetMask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::DrawAreaGeometry(s32 areaIdx, s32 mask, s32 targetMask) {
|
void CCubeRenderer::DrawAreaGeometry(s32 areaIdx, s32 mask, s32 targetMask) {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(
|
||||||
|
fmt::format(FMT_STRING("CCubeRenderer::DrawAreaGeometry areaIdx={} mask={} targetMask={}"), areaIdx, mask,
|
||||||
|
targetMask),
|
||||||
|
zeus::skBlue);
|
||||||
|
|
||||||
x318_30_inAreaDraw = true;
|
x318_30_inAreaDraw = true;
|
||||||
SetupRendererStates(true);
|
SetupRendererStates(true);
|
||||||
constexpr CModelFlags flags{0, 0, 3, zeus::skWhite};
|
constexpr CModelFlags flags{0, 0, 3, zeus::skWhite};
|
||||||
|
@ -427,6 +442,9 @@ void CCubeRenderer::DrawAreaGeometry(s32 areaIdx, s32 mask, s32 targetMask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCubeRenderer::RenderBucketItems(const CAreaListItem* item) {
|
void CCubeRenderer::RenderBucketItems(const CAreaListItem* item) {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CCubeRenderer::RenderBucketItems areaIdx={}"), item->x18_areaIdx),
|
||||||
|
zeus::skBlue);
|
||||||
|
|
||||||
CCubeModel* lastModel = nullptr;
|
CCubeModel* lastModel = nullptr;
|
||||||
EDrawableType lastDrawableType = EDrawableType::Invalid;
|
EDrawableType lastDrawableType = EDrawableType::Invalid;
|
||||||
for (u16 idx : Buckets::sBucketIndex) {
|
for (u16 idx : Buckets::sBucketIndex) {
|
||||||
|
|
|
@ -406,22 +406,10 @@ public:
|
||||||
// void Draw() const { CGraphics::DrawArray(m_start, m_vec.size() - m_start); }
|
// void Draw() const { CGraphics::DrawArray(m_start, m_vec.size() - m_start); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef BOO_GRAPHICS_DEBUG_GROUPS
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
class GraphicsDebugGroup {
|
#define SCOPED_GRAPHICS_DEBUG_GROUP(name, ...) \
|
||||||
/* Stack only */
|
OPTICK_EVENT_DYNAMIC(name); \
|
||||||
void* operator new(size_t);
|
aurora::gfx::ScopedDebugGroup _GfxDbg_{name}
|
||||||
void operator delete(void*);
|
|
||||||
void* operator new[](size_t);
|
|
||||||
void operator delete[](void*);
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit GraphicsDebugGroup(const char* name, const zeus::CColor& color = zeus::skWhite) {
|
|
||||||
zeus::simd_floats f(color.mSimd);
|
|
||||||
CGraphics::g_BooMainCommandQueue->pushDebugGroup(name, f.array());
|
|
||||||
}
|
|
||||||
~GraphicsDebugGroup() { CGraphics::g_BooMainCommandQueue->popDebugGroup(); }
|
|
||||||
};
|
|
||||||
#define SCOPED_GRAPHICS_DEBUG_GROUP(...) GraphicsDebugGroup _GfxDbg_(__VA_ARGS__);
|
|
||||||
#else
|
#else
|
||||||
#define SCOPED_GRAPHICS_DEBUG_GROUP(name, ...) OPTICK_EVENT_DYNAMIC(name)
|
#define SCOPED_GRAPHICS_DEBUG_GROUP(name, ...) OPTICK_EVENT_DYNAMIC(name)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -868,6 +868,8 @@ void CElementGen::Render() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CElementGen::RenderModels() {
|
void CElementGen::RenderModels() {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CElementGen::RenderModels")), zeus::skYellow);
|
||||||
|
|
||||||
CParticleGlobals::instance()->m_particleAccessParameters = nullptr;
|
CParticleGlobals::instance()->m_particleAccessParameters = nullptr;
|
||||||
if (x26d_26_modelsUseLights) {
|
if (x26d_26_modelsUseLights) {
|
||||||
CGraphics::SetLightState(x274_backupLightActive);
|
CGraphics::SetLightState(x274_backupLightActive);
|
||||||
|
@ -1091,6 +1093,8 @@ void CElementGen::RenderModels() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CElementGen::RenderLines() {
|
void CElementGen::RenderLines() {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CElementGen::RenderLines")), zeus::skYellow);
|
||||||
|
|
||||||
CGenDescription* desc = x1c_genDesc.GetObj();
|
CGenDescription* desc = x1c_genDesc.GetObj();
|
||||||
CGlobalRandom gr(x27c_randState);
|
CGlobalRandom gr(x27c_randState);
|
||||||
|
|
||||||
|
@ -1198,6 +1202,8 @@ void CElementGen::RenderParticles() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CElementGen::RenderParticles")), zeus::skYellow);
|
||||||
|
|
||||||
CRealElement* size = desc->x4c_x38_SIZE.get();
|
CRealElement* size = desc->x4c_x38_SIZE.get();
|
||||||
if (size && size->IsConstant()) {
|
if (size && size->IsConstant()) {
|
||||||
float sizeVal;
|
float sizeVal;
|
||||||
|
@ -1630,6 +1636,8 @@ void CElementGen::RenderParticles() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CElementGen::RenderParticlesIndirectTexture() {
|
void CElementGen::RenderParticlesIndirectTexture() {
|
||||||
|
SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CElementGen::RenderParticlesIndirectTexture")), zeus::skYellow);
|
||||||
|
|
||||||
CGenDescription* desc = x1c_genDesc.GetObj();
|
CGenDescription* desc = x1c_genDesc.GetObj();
|
||||||
|
|
||||||
zeus::CTransform systemViewPointMatrix(CGraphics::g_ViewMatrix);
|
zeus::CTransform systemViewPointMatrix(CGraphics::g_ViewMatrix);
|
||||||
|
|
|
@ -132,6 +132,16 @@ struct Light {
|
||||||
|
|
||||||
[[nodiscard]] bool get_dxt_compression_supported() noexcept;
|
[[nodiscard]] bool get_dxt_compression_supported() noexcept;
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define AURORA_GFX_DEBUG_GROUPS
|
||||||
|
#endif
|
||||||
|
void push_debug_group(zstring_view label) noexcept;
|
||||||
|
void pop_debug_group() noexcept;
|
||||||
|
struct ScopedDebugGroup {
|
||||||
|
inline ScopedDebugGroup(zstring_view label) noexcept { push_debug_group(label); }
|
||||||
|
inline ~ScopedDebugGroup() noexcept { pop_debug_group(); }
|
||||||
|
};
|
||||||
|
|
||||||
// GX state
|
// GX state
|
||||||
void bind_texture(GX::TexMapID id, metaforce::EClampMode clamp, const TextureHandle& tex, float lod) noexcept;
|
void bind_texture(GX::TexMapID id, metaforce::EClampMode clamp, const TextureHandle& tex, float lod) noexcept;
|
||||||
void unbind_texture(GX::TexMapID id) noexcept;
|
void unbind_texture(GX::TexMapID id) noexcept;
|
||||||
|
|
|
@ -19,6 +19,10 @@ static logvisor::Module Log("aurora::gfx");
|
||||||
using gpu::g_device;
|
using gpu::g_device;
|
||||||
using gpu::g_queue;
|
using gpu::g_queue;
|
||||||
|
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
std::vector<std::string> g_debugGroupStack;
|
||||||
|
#endif
|
||||||
|
|
||||||
constexpr uint64_t UniformBufferSize = 5242880; // 5mb
|
constexpr uint64_t UniformBufferSize = 5242880; // 5mb
|
||||||
constexpr uint64_t VertexBufferSize = 5242880; // 5mb
|
constexpr uint64_t VertexBufferSize = 5242880; // 5mb
|
||||||
constexpr uint64_t IndexBufferSize = 2097152; // 2mb
|
constexpr uint64_t IndexBufferSize = 2097152; // 2mb
|
||||||
|
@ -60,6 +64,9 @@ enum class CommandType {
|
||||||
};
|
};
|
||||||
struct Command {
|
struct Command {
|
||||||
CommandType type;
|
CommandType type;
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
std::vector<std::string> debugGroupStack;
|
||||||
|
#endif
|
||||||
union Data {
|
union Data {
|
||||||
struct SetViewportCommand {
|
struct SetViewportCommand {
|
||||||
float left;
|
float left;
|
||||||
|
@ -248,7 +255,15 @@ static PipelineRef find_pipeline(PipelineCreateCommand command, NewPipelineCallb
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void push_draw_command(ShaderDrawCommand data) { g_commands.push_back({CommandType::Draw, {.draw = data}}); }
|
static void push_draw_command(ShaderDrawCommand data) {
|
||||||
|
g_commands.push_back({
|
||||||
|
.type = CommandType::Draw,
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
.debugGroupStack = g_debugGroupStack,
|
||||||
|
#endif
|
||||||
|
.data = {.draw = data},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
bool get_dxt_compression_supported() noexcept { return g_device.HasFeature(wgpu::FeatureName::TextureCompressionBC); }
|
bool get_dxt_compression_supported() noexcept { return g_device.HasFeature(wgpu::FeatureName::TextureCompressionBC); }
|
||||||
|
|
||||||
|
@ -256,7 +271,13 @@ static Command::Data::SetViewportCommand g_cachedViewport;
|
||||||
void set_viewport(float left, float top, float width, float height, float znear, float zfar) noexcept {
|
void set_viewport(float left, float top, float width, float height, float znear, float zfar) noexcept {
|
||||||
Command::Data::SetViewportCommand cmd{left, top, width, height, znear, zfar};
|
Command::Data::SetViewportCommand cmd{left, top, width, height, znear, zfar};
|
||||||
if (cmd != g_cachedViewport) {
|
if (cmd != g_cachedViewport) {
|
||||||
g_commands.push_back({CommandType::SetViewport, {.setViewport = cmd}});
|
g_commands.push_back({
|
||||||
|
.type = CommandType::SetViewport,
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
.debugGroupStack = g_debugGroupStack,
|
||||||
|
#endif
|
||||||
|
.data = {.setViewport = cmd},
|
||||||
|
});
|
||||||
g_cachedViewport = cmd;
|
g_cachedViewport = cmd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,7 +285,13 @@ static Command::Data::SetScissorCommand g_cachedScissor;
|
||||||
void set_scissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) noexcept {
|
void set_scissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) noexcept {
|
||||||
Command::Data::SetScissorCommand cmd{x, y, w, h};
|
Command::Data::SetScissorCommand cmd{x, y, w, h};
|
||||||
if (cmd != g_cachedScissor) {
|
if (cmd != g_cachedScissor) {
|
||||||
g_commands.push_back({CommandType::SetScissor, {.setScissor = cmd}});
|
g_commands.push_back({
|
||||||
|
.type = CommandType::SetScissor,
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
.debugGroupStack = g_debugGroupStack,
|
||||||
|
#endif
|
||||||
|
.data = {.setScissor = cmd},
|
||||||
|
});
|
||||||
g_cachedScissor = cmd;
|
g_cachedScissor = cmd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -504,8 +531,29 @@ void end_frame(const wgpu::CommandEncoder& cmd) {
|
||||||
|
|
||||||
void render(const wgpu::RenderPassEncoder& pass) {
|
void render(const wgpu::RenderPassEncoder& pass) {
|
||||||
g_currentPipeline = UINT64_MAX;
|
g_currentPipeline = UINT64_MAX;
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
std::vector<std::string> lastDebugGroupStack;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (const auto& cmd : g_commands) {
|
for (const auto& cmd : g_commands) {
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
{
|
||||||
|
size_t firstDiff = lastDebugGroupStack.size();
|
||||||
|
for (size_t i = 0; i < lastDebugGroupStack.size(); ++i) {
|
||||||
|
if (i >= cmd.debugGroupStack.size() || cmd.debugGroupStack[i] != lastDebugGroupStack[i]) {
|
||||||
|
firstDiff = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (size_t i = firstDiff; i < lastDebugGroupStack.size(); ++i) {
|
||||||
|
pass.PopDebugGroup();
|
||||||
|
}
|
||||||
|
for (size_t i = firstDiff; i < cmd.debugGroupStack.size(); ++i) {
|
||||||
|
pass.PushDebugGroup(cmd.debugGroupStack[i].c_str());
|
||||||
|
}
|
||||||
|
lastDebugGroupStack = cmd.debugGroupStack;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
switch (cmd.type) {
|
switch (cmd.type) {
|
||||||
case CommandType::SetViewport: {
|
case CommandType::SetViewport: {
|
||||||
const auto& vp = cmd.data.setViewport;
|
const auto& vp = cmd.data.setViewport;
|
||||||
|
@ -541,6 +589,12 @@ void render(const wgpu::RenderPassEncoder& pass) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
for (size_t i = 0; i < lastDebugGroupStack.size(); ++i) {
|
||||||
|
pass.PopDebugGroup();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
g_commands.clear();
|
g_commands.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -659,4 +713,15 @@ uint32_t align_uniform(uint32_t value) {
|
||||||
const auto uniform_alignment = limits.limits.minUniformBufferOffsetAlignment;
|
const auto uniform_alignment = limits.limits.minUniformBufferOffsetAlignment;
|
||||||
return ALIGN(value, uniform_alignment);
|
return ALIGN(value, uniform_alignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void push_debug_group(zstring_view label) noexcept {
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
g_debugGroupStack.emplace_back(label);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
void pop_debug_group() noexcept {
|
||||||
|
#ifdef AURORA_GFX_DEBUG_GROUPS
|
||||||
|
g_debugGroupStack.pop_back();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
} // namespace aurora::gfx
|
} // namespace aurora::gfx
|
||||||
|
|
Loading…
Reference in New Issue