mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 08:59:03 -06:00 
			
		
		
		
	maxwell_3d: Change write dirty flags to a bitset
This commit is contained in:
		@@ -1273,9 +1273,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    /// Notify a memory write has happened.
 | 
			
		||||
    void OnMemoryWrite() {
 | 
			
		||||
        for (const u8 store : dirty.on_write_stores) {
 | 
			
		||||
            dirty.flags[store] = true;
 | 
			
		||||
        }
 | 
			
		||||
        dirty.flags |= dirty.on_write_stores;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enum class MMEDrawMode : u32 {
 | 
			
		||||
@@ -1295,8 +1293,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        std::bitset<std::numeric_limits<u8>::max()> flags;
 | 
			
		||||
        std::bitset<std::numeric_limits<u8>::max()> on_write_stores;
 | 
			
		||||
        std::array<std::array<u8, Regs::NUM_REGS>, 3> tables{};
 | 
			
		||||
        std::array<u8, 32> on_write_stores{};
 | 
			
		||||
    } dirty;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 
 | 
			
		||||
@@ -110,23 +110,23 @@ StateTracker::StateTracker(Core::System& system) : system{system} {}
 | 
			
		||||
 | 
			
		||||
void StateTracker::Initialize() {
 | 
			
		||||
    auto& dirty = system.GPU().Maxwell3D().dirty;
 | 
			
		||||
    std::size_t entry_index = 0;
 | 
			
		||||
    const auto AddEntry = [&dirty, &entry_index](std::size_t dirty_register) {
 | 
			
		||||
        dirty.on_write_stores[entry_index++] = static_cast<u8>(dirty_register);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    AddEntry(RenderTargets);
 | 
			
		||||
    for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) {
 | 
			
		||||
        AddEntry(ColorBuffer0 + i);
 | 
			
		||||
    }
 | 
			
		||||
    AddEntry(ZetaBuffer);
 | 
			
		||||
 | 
			
		||||
    auto& tables = dirty.tables;
 | 
			
		||||
    SetupDirtyRenderTargets(tables);
 | 
			
		||||
    SetupDirtyColorMasks(tables);
 | 
			
		||||
    SetupDirtyViewports(tables);
 | 
			
		||||
    SetupDirtyScissors(tables);
 | 
			
		||||
    SetupDirtyVertexFormat(tables);
 | 
			
		||||
 | 
			
		||||
    auto& store = dirty.on_write_stores;
 | 
			
		||||
    store[RenderTargets] = true;
 | 
			
		||||
    store[ZetaBuffer] = true;
 | 
			
		||||
    for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) {
 | 
			
		||||
        store[ColorBuffer0 + i] = true;
 | 
			
		||||
    }
 | 
			
		||||
    store[VertexBuffers] = true;
 | 
			
		||||
    for (std::size_t i = 0; i < Regs::NumVertexArrays; ++i) {
 | 
			
		||||
        store[VertexBuffer0 + i] = true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace OpenGL
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <limits>
 | 
			
		||||
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "video_core/dirty_flags.h"
 | 
			
		||||
#include "video_core/engines/maxwell_3d.h"
 | 
			
		||||
@@ -58,7 +60,7 @@ enum : u8 {
 | 
			
		||||
 | 
			
		||||
    Last
 | 
			
		||||
};
 | 
			
		||||
static_assert(Last <= 0xff);
 | 
			
		||||
static_assert(Last <= std::numeric_limits<u8>::max());
 | 
			
		||||
 | 
			
		||||
} // namespace Dirty
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user