maxwell_3d: Change write dirty flags to a bitset

This commit is contained in:
ReinUsesLisp 2019-12-29 01:05:02 -03:00
parent 69ad6279e4
commit 9b08698a0c
3 changed files with 16 additions and 16 deletions

View file

@ -1273,9 +1273,7 @@ public:
/// Notify a memory write has happened. /// Notify a memory write has happened.
void OnMemoryWrite() { void OnMemoryWrite() {
for (const u8 store : dirty.on_write_stores) { dirty.flags |= dirty.on_write_stores;
dirty.flags[store] = true;
}
} }
enum class MMEDrawMode : u32 { enum class MMEDrawMode : u32 {
@ -1295,8 +1293,8 @@ public:
struct { struct {
std::bitset<std::numeric_limits<u8>::max()> flags; 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<std::array<u8, Regs::NUM_REGS>, 3> tables{};
std::array<u8, 32> on_write_stores{};
} dirty; } dirty;
private: private:

View file

@ -110,23 +110,23 @@ StateTracker::StateTracker(Core::System& system) : system{system} {}
void StateTracker::Initialize() { void StateTracker::Initialize() {
auto& dirty = system.GPU().Maxwell3D().dirty; 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; auto& tables = dirty.tables;
SetupDirtyRenderTargets(tables); SetupDirtyRenderTargets(tables);
SetupDirtyColorMasks(tables); SetupDirtyColorMasks(tables);
SetupDirtyViewports(tables); SetupDirtyViewports(tables);
SetupDirtyScissors(tables); SetupDirtyScissors(tables);
SetupDirtyVertexFormat(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 } // namespace OpenGL

View file

@ -4,6 +4,8 @@
#pragma once #pragma once
#include <limits>
#include "common/common_types.h" #include "common/common_types.h"
#include "video_core/dirty_flags.h" #include "video_core/dirty_flags.h"
#include "video_core/engines/maxwell_3d.h" #include "video_core/engines/maxwell_3d.h"
@ -58,7 +60,7 @@ enum : u8 {
Last Last
}; };
static_assert(Last <= 0xff); static_assert(Last <= std::numeric_limits<u8>::max());
} // namespace Dirty } // namespace Dirty