|
|
|
@ -32,7 +32,6 @@ enum : u8 {
|
|
|
|
|
DepthWriteEnable,
|
|
|
|
|
DepthCompareOp,
|
|
|
|
|
FrontFace,
|
|
|
|
|
PrimitiveTopology,
|
|
|
|
|
StencilOp,
|
|
|
|
|
StencilTestEnable,
|
|
|
|
|
|
|
|
|
@ -43,6 +42,8 @@ static_assert(Last <= std::numeric_limits<u8>::max());
|
|
|
|
|
} // namespace Dirty
|
|
|
|
|
|
|
|
|
|
class StateTracker {
|
|
|
|
|
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
explicit StateTracker(Core::System& system);
|
|
|
|
|
|
|
|
|
@ -102,10 +103,6 @@ public:
|
|
|
|
|
return Exchange(Dirty::FrontFace, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TouchPrimitiveTopology() {
|
|
|
|
|
return Exchange(Dirty::PrimitiveTopology, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TouchStencilOp() {
|
|
|
|
|
return Exchange(Dirty::StencilOp, false);
|
|
|
|
|
}
|
|
|
|
@ -114,7 +111,15 @@ public:
|
|
|
|
|
return Exchange(Dirty::StencilTestEnable, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ChangePrimitiveTopology(Maxwell::PrimitiveTopology new_topology) {
|
|
|
|
|
const bool has_changed = current_topology != new_topology;
|
|
|
|
|
current_topology = new_topology;
|
|
|
|
|
return has_changed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
static constexpr auto INVALID_TOPOLOGY = static_cast<Maxwell::PrimitiveTopology>(~0u);
|
|
|
|
|
|
|
|
|
|
bool Exchange(std::size_t id, bool new_value) const noexcept {
|
|
|
|
|
auto& flags = system.GPU().Maxwell3D().dirty.flags;
|
|
|
|
|
const bool is_dirty = flags[id];
|
|
|
|
@ -124,6 +129,7 @@ private:
|
|
|
|
|
|
|
|
|
|
Core::System& system;
|
|
|
|
|
Tegra::Engines::Maxwell3D::DirtyState::Flags invalidation_flags;
|
|
|
|
|
Maxwell::PrimitiveTopology current_topology = INVALID_TOPOLOGY;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace Vulkan
|
|
|
|
|