From f4048233ef56cfe3412688f7bd5dfa3bcac391ff Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Mon, 12 Jan 2026 22:29:30 -0400 Subject: [PATCH] [engines, maxwell] Added GetDirtyFlagsForMethod --- src/video_core/dirty_flags.h | 68 +++++++++++++++++++++++++++ src/video_core/engines/maxwell_3d.cpp | 5 +- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/video_core/dirty_flags.h b/src/video_core/dirty_flags.h index 736082d837..1f9aa48806 100644 --- a/src/video_core/dirty_flags.h +++ b/src/video_core/dirty_flags.h @@ -1,3 +1,6 @@ +// SDPX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -45,6 +48,71 @@ enum : u8 { LastCommonEntry, }; +constexpr std::pair GetDirtyFlagsForMethod(u32 method) { + const u32 OFF_VERTEX_STREAMS = 0x2C0; + const u32 OFF_VERTEX_STREAM_LIMITS = 0x2F8; + const u32 OFF_INDEX_BUFFER = 0x460; + const u32 OFF_TEX_HEADER = 0x800; + const u32 OFF_TEX_SAMPLER = 0xA00; + const u32 OFF_RT = 0xE00; + const u32 OFF_SURFACE_CLIP = 0xE38; + const u32 OFF_RT_CONTROL = 0xE40; + const u32 OFF_ZETA_ENABLE = 0xE4C; + const u32 OFF_ZETA_SIZE_WIDTH = 0xE50; + const u32 OFF_ZETA_SIZE_HEIGHT = 0xE54; + const u32 OFF_ZETA = 0xE60; + const u32 OFF_PIPELINES = 0x1D00; + + if (method >= OFF_VERTEX_STREAMS && method < OFF_VERTEX_STREAMS + 96) { + const u32 buffer_idx = (method - OFF_VERTEX_STREAMS) / 3; + return {static_cast(VertexBuffer0 + buffer_idx), VertexBuffers}; + } + + if (method >= OFF_VERTEX_STREAM_LIMITS && method < OFF_VERTEX_STREAM_LIMITS + 32) { + const u32 buffer_idx = method - OFF_VERTEX_STREAM_LIMITS; + return {static_cast(VertexBuffer0 + buffer_idx), VertexBuffers}; + } + + if (method == OFF_INDEX_BUFFER || (method > OFF_INDEX_BUFFER && method < OFF_INDEX_BUFFER + 3)) { + return {IndexBuffer, IndexBuffer}; + } + + if (method >= OFF_TEX_HEADER && method < OFF_TEX_HEADER + 256) { + return {Descriptors, Descriptors}; + } + + if (method >= OFF_TEX_SAMPLER && method < OFF_TEX_SAMPLER + 256) { + return {Descriptors, Descriptors}; + } + + if (method >= OFF_RT && method < OFF_RT + 32) { + const u32 rt_idx = (method - OFF_RT) / 4; + return {static_cast(ColorBuffer0 + rt_idx), RenderTargets}; + } + + if (method == OFF_SURFACE_CLIP || (method > OFF_SURFACE_CLIP && method < OFF_SURFACE_CLIP + 4)) { + return {RenderTargets, RenderTargets}; + } + + if (method == OFF_RT_CONTROL) { + return {RenderTargets, RenderTargetControl}; + } + + if (method == OFF_ZETA_ENABLE || method == OFF_ZETA_SIZE_WIDTH || method == OFF_ZETA_SIZE_HEIGHT) { + return {ZetaBuffer, RenderTargets}; + } + + if (method >= OFF_ZETA && method < OFF_ZETA + 8) { + return {ZetaBuffer, RenderTargets}; + } + + if (method >= OFF_PIPELINES && method < OFF_PIPELINES + 1024) { + return {Shaders, Shaders}; + } + + return {NullEntry, NullEntry}; +} + template void FillBlock(Tegra::Engines::Maxwell3D::DirtyState::Table& table, std::size_t begin, std::size_t num, Integer dirty_index) { diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 14117b644b..509823d0db 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -324,10 +324,7 @@ void Maxwell3D::ProcessDirtyRegisters(u32 method, u32 argument) { } regs.reg_array[method] = argument; - const auto& table0 = dirty.tables[0]; - const auto& table1 = dirty.tables[1]; - const u8 flag0 = table0[method]; - const u8 flag1 = table1[method]; + const auto [flag0, flag1] = GetDirtyFlagsForMethod(method); dirty.flags[flag0] = true; if (flag1 != flag0) { dirty.flags[flag1] = true;