3
0
Fork 0
forked from suyu/suyu

syncpoint_manager: Reduce number of bounds checks

The only time we need to check bounds is on the first access.
This commit is contained in:
Lioncash 2022-11-28 16:05:59 -05:00
parent 6291eec700
commit d0883027d6

View file

@ -28,13 +28,15 @@ SyncpointManager::SyncpointManager(Tegra::Host1x::Host1x& host1x_) : host1x{host
SyncpointManager::~SyncpointManager() = default; SyncpointManager::~SyncpointManager() = default;
u32 SyncpointManager::ReserveSyncpoint(u32 id, bool client_managed) { u32 SyncpointManager::ReserveSyncpoint(u32 id, bool client_managed) {
if (syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (syncpoint.reserved) {
ASSERT_MSG(false, "Requested syncpoint is in use"); ASSERT_MSG(false, "Requested syncpoint is in use");
return 0; return 0;
} }
syncpoints.at(id).reserved = true; syncpoint.reserved = true;
syncpoints.at(id).interface_managed = client_managed; syncpoint.interface_managed = client_managed;
return id; return id;
} }
@ -56,8 +58,9 @@ u32 SyncpointManager::AllocateSyncpoint(bool client_managed) {
void SyncpointManager::FreeSyncpoint(u32 id) { void SyncpointManager::FreeSyncpoint(u32 id) {
std::lock_guard lock(reservation_lock); std::lock_guard lock(reservation_lock);
ASSERT(syncpoints.at(id).reserved); auto& syncpoint = syncpoints.at(id);
syncpoints.at(id).reserved = false; ASSERT(syncpoint.reserved);
syncpoint.reserved = false;
} }
bool SyncpointManager::IsSyncpointAllocated(u32 id) { bool SyncpointManager::IsSyncpointAllocated(u32 id) {
@ -82,40 +85,51 @@ bool SyncpointManager::HasSyncpointExpired(u32 id, u32 threshold) const {
} }
u32 SyncpointManager::IncrementSyncpointMaxExt(u32 id, u32 amount) { u32 SyncpointManager::IncrementSyncpointMaxExt(u32 id, u32 amount) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return 0; return 0;
} }
return syncpoints.at(id).counter_max += amount; return syncpoint.counter_max += amount;
} }
u32 SyncpointManager::ReadSyncpointMinValue(u32 id) { u32 SyncpointManager::ReadSyncpointMinValue(u32 id) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return 0; return 0;
} }
return syncpoints.at(id).counter_min; return syncpoint.counter_min;
} }
u32 SyncpointManager::UpdateMin(u32 id) { u32 SyncpointManager::UpdateMin(u32 id) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return 0; return 0;
} }
syncpoints.at(id).counter_min = host1x.GetSyncpointManager().GetHostSyncpointValue(id); syncpoint.counter_min = host1x.GetSyncpointManager().GetHostSyncpointValue(id);
return syncpoints.at(id).counter_min; return syncpoint.counter_min;
} }
NvFence SyncpointManager::GetSyncpointFence(u32 id) { NvFence SyncpointManager::GetSyncpointFence(u32 id) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return NvFence{}; return NvFence{};
} }
return {.id = static_cast<s32>(id), .value = syncpoints.at(id).counter_max}; return {
.id = static_cast<s32>(id),
.value = syncpoint.counter_max,
};
} }
} // namespace Service::Nvidia::NvCore } // namespace Service::Nvidia::NvCore