mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-28 10:31:18 +00:00
[video_core/buffer_cache] fix PAGE_SHIFT macro clash on FBSD
Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
@@ -9,13 +9,13 @@
|
|||||||
namespace VideoCommon {
|
namespace VideoCommon {
|
||||||
|
|
||||||
class UsageTracker {
|
class UsageTracker {
|
||||||
static constexpr size_t BYTES_PER_BIT_SHIFT = 6;
|
// PAGE_SHIFT is a macro on FreeBSD
|
||||||
static constexpr size_t PAGE_SHIFT = 6 + BYTES_PER_BIT_SHIFT;
|
static constexpr size_t BUFFER_BYTES_PER_BITSHIFT = 6;
|
||||||
static constexpr size_t PAGE_BYTES = 1 << PAGE_SHIFT;
|
static constexpr size_t BUFFER_PAGE_SHIFT = 6 + BUFFER_BYTES_PER_BITSHIFT;
|
||||||
|
static constexpr size_t BUFFER_PAGE_BYTES = 1 << BUFFER_PAGE_SHIFT;
|
||||||
public:
|
public:
|
||||||
explicit UsageTracker(size_t size) {
|
explicit UsageTracker(size_t size) {
|
||||||
const size_t num_pages = (size >> PAGE_SHIFT) + 1;
|
const size_t num_pages = (size >> BUFFER_PAGE_SHIFT) + 1;
|
||||||
pages.resize(num_pages, 0ULL);
|
pages.resize(num_pages, 0ULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,8 +24,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Track(u64 offset, u64 size) noexcept {
|
void Track(u64 offset, u64 size) noexcept {
|
||||||
const size_t page = offset >> PAGE_SHIFT;
|
const size_t page = offset >> BUFFER_PAGE_SHIFT;
|
||||||
const size_t page_end = (offset + size) >> PAGE_SHIFT;
|
const size_t page_end = (offset + size) >> BUFFER_PAGE_SHIFT;
|
||||||
if (page_end < page || page_end >= pages.size()) {
|
if (page_end < page || page_end >= pages.size()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -37,13 +37,13 @@ public:
|
|||||||
pages[i] = ~u64{0};
|
pages[i] = ~u64{0};
|
||||||
}
|
}
|
||||||
const size_t offset_end = offset + size;
|
const size_t offset_end = offset + size;
|
||||||
const size_t offset_end_page_aligned = Common::AlignDown(offset_end, PAGE_BYTES);
|
const size_t offset_end_page_aligned = Common::AlignDown(offset_end, BUFFER_PAGE_BYTES);
|
||||||
TrackPage(page_end, offset_end_page_aligned, offset_end - offset_end_page_aligned);
|
TrackPage(page_end, offset_end_page_aligned, offset_end - offset_end_page_aligned);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] bool IsUsed(u64 offset, u64 size) const noexcept {
|
[[nodiscard]] bool IsUsed(u64 offset, u64 size) const noexcept {
|
||||||
const size_t page = offset >> PAGE_SHIFT;
|
const size_t page = offset >> BUFFER_PAGE_SHIFT;
|
||||||
const size_t page_end = (offset + size) >> PAGE_SHIFT;
|
const size_t page_end = (offset + size) >> BUFFER_PAGE_SHIFT;
|
||||||
if (page_end < page || page_end >= pages.size()) {
|
if (page_end < page || page_end >= pages.size()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -56,23 +56,23 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const size_t offset_end = offset + size;
|
const size_t offset_end = offset + size;
|
||||||
const size_t offset_end_page_aligned = Common::AlignDown(offset_end, PAGE_BYTES);
|
const size_t offset_end_page_aligned = Common::AlignDown(offset_end, BUFFER_PAGE_BYTES);
|
||||||
return IsPageUsed(page_end, offset_end_page_aligned, offset_end - offset_end_page_aligned);
|
return IsPageUsed(page_end, offset_end_page_aligned, offset_end - offset_end_page_aligned);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void TrackPage(u64 page, u64 offset, u64 size) noexcept {
|
void TrackPage(u64 page, u64 offset, u64 size) noexcept {
|
||||||
const size_t offset_in_page = offset % PAGE_BYTES;
|
const size_t offset_in_page = offset % BUFFER_PAGE_BYTES;
|
||||||
const size_t first_bit = offset_in_page >> BYTES_PER_BIT_SHIFT;
|
const size_t first_bit = offset_in_page >> BUFFER_BYTES_PER_BITSHIFT;
|
||||||
const size_t num_bits = std::min<size_t>(size, PAGE_BYTES) >> BYTES_PER_BIT_SHIFT;
|
const size_t num_bits = std::min<size_t>(size, BUFFER_PAGE_BYTES) >> BUFFER_BYTES_PER_BITSHIFT;
|
||||||
const size_t mask = ~u64{0} >> (64 - num_bits);
|
const size_t mask = ~u64{0} >> (64 - num_bits);
|
||||||
pages[page] |= (~u64{0} & mask) << first_bit;
|
pages[page] |= (~u64{0} & mask) << first_bit;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsPageUsed(u64 page, u64 offset, u64 size) const noexcept {
|
bool IsPageUsed(u64 page, u64 offset, u64 size) const noexcept {
|
||||||
const size_t offset_in_page = offset % PAGE_BYTES;
|
const size_t offset_in_page = offset % BUFFER_PAGE_BYTES;
|
||||||
const size_t first_bit = offset_in_page >> BYTES_PER_BIT_SHIFT;
|
const size_t first_bit = offset_in_page >> BUFFER_BYTES_PER_BITSHIFT;
|
||||||
const size_t num_bits = std::min<size_t>(size, PAGE_BYTES) >> BYTES_PER_BIT_SHIFT;
|
const size_t num_bits = std::min<size_t>(size, BUFFER_PAGE_BYTES) >> BUFFER_BYTES_PER_BITSHIFT;
|
||||||
const size_t mask = ~u64{0} >> (64 - num_bits);
|
const size_t mask = ~u64{0} >> (64 - num_bits);
|
||||||
const size_t mask2 = (~u64{0} & mask) << first_bit;
|
const size_t mask2 = (~u64{0} & mask) << first_bit;
|
||||||
return (pages[page] & mask2) != 0;
|
return (pages[page] & mask2) != 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user