early-access version 3539
This commit is contained in:
@@ -657,8 +657,8 @@ bool BufferCache<P>::IsRegionGpuModified(VAddr addr, size_t size) {
|
||||
template <class P>
|
||||
bool BufferCache<P>::IsRegionRegistered(VAddr addr, size_t size) {
|
||||
const VAddr end_addr = addr + size;
|
||||
const u64 page_end = Common::DivCeil(end_addr, PAGE_SIZE);
|
||||
for (u64 page = addr >> PAGE_BITS; page < page_end;) {
|
||||
const u64 page_end = Common::DivCeil(end_addr, CACHING_PAGESIZE);
|
||||
for (u64 page = addr >> CACHING_PAGEBITS; page < page_end;) {
|
||||
const BufferId buffer_id = page_table[page];
|
||||
if (!buffer_id) {
|
||||
++page;
|
||||
@@ -670,7 +670,7 @@ bool BufferCache<P>::IsRegionRegistered(VAddr addr, size_t size) {
|
||||
if (buf_start_addr < end_addr && addr < buf_end_addr) {
|
||||
return true;
|
||||
}
|
||||
page = Common::DivCeil(end_addr, PAGE_SIZE);
|
||||
page = Common::DivCeil(end_addr, CACHING_PAGESIZE);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1001,7 +1001,7 @@ void BufferCache<P>::UpdateIndexBuffer() {
|
||||
flags[Dirty::IndexBuffer] = false;
|
||||
if (!draw_state.inline_index_draw_indexes.empty()) [[unlikely]] {
|
||||
auto inline_index_size = static_cast<u32>(draw_state.inline_index_draw_indexes.size());
|
||||
u32 buffer_size = Common::AlignUp(inline_index_size, PAGE_SIZE);
|
||||
u32 buffer_size = Common::AlignUp(inline_index_size, CACHING_PAGESIZE);
|
||||
if (inline_buffer_id == NULL_BUFFER_ID) [[unlikely]] {
|
||||
inline_buffer_id = CreateBuffer(0, buffer_size);
|
||||
}
|
||||
@@ -1230,7 +1230,7 @@ BufferId BufferCache<P>::FindBuffer(VAddr cpu_addr, u32 size) {
|
||||
if (cpu_addr == 0) {
|
||||
return NULL_BUFFER_ID;
|
||||
}
|
||||
const u64 page = cpu_addr >> PAGE_BITS;
|
||||
const u64 page = cpu_addr >> CACHING_PAGEBITS;
|
||||
const BufferId buffer_id = page_table[page];
|
||||
if (!buffer_id) {
|
||||
return CreateBuffer(cpu_addr, size);
|
||||
@@ -1259,8 +1259,9 @@ typename BufferCache<P>::OverlapResult BufferCache<P>::ResolveOverlaps(VAddr cpu
|
||||
.has_stream_leap = has_stream_leap,
|
||||
};
|
||||
}
|
||||
for (; cpu_addr >> PAGE_BITS < Common::DivCeil(end, PAGE_SIZE); cpu_addr += PAGE_SIZE) {
|
||||
const BufferId overlap_id = page_table[cpu_addr >> PAGE_BITS];
|
||||
for (; cpu_addr >> CACHING_PAGEBITS < Common::DivCeil(end, CACHING_PAGESIZE);
|
||||
cpu_addr += CACHING_PAGESIZE) {
|
||||
const BufferId overlap_id = page_table[cpu_addr >> CACHING_PAGEBITS];
|
||||
if (!overlap_id) {
|
||||
continue;
|
||||
}
|
||||
@@ -1286,11 +1287,11 @@ typename BufferCache<P>::OverlapResult BufferCache<P>::ResolveOverlaps(VAddr cpu
|
||||
// as a stream buffer. Increase the size to skip constantly recreating buffers.
|
||||
has_stream_leap = true;
|
||||
if (expands_right) {
|
||||
begin -= PAGE_SIZE * 256;
|
||||
begin -= CACHING_PAGESIZE * 256;
|
||||
cpu_addr = begin;
|
||||
}
|
||||
if (expands_left) {
|
||||
end += PAGE_SIZE * 256;
|
||||
end += CACHING_PAGESIZE * 256;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1323,8 +1324,8 @@ void BufferCache<P>::JoinOverlap(BufferId new_buffer_id, BufferId overlap_id,
|
||||
|
||||
template <class P>
|
||||
BufferId BufferCache<P>::CreateBuffer(VAddr cpu_addr, u32 wanted_size) {
|
||||
VAddr cpu_addr_end = Common::AlignUp(cpu_addr + wanted_size, PAGE_SIZE);
|
||||
cpu_addr = Common::AlignDown(cpu_addr, PAGE_SIZE);
|
||||
VAddr cpu_addr_end = Common::AlignUp(cpu_addr + wanted_size, CACHING_PAGESIZE);
|
||||
cpu_addr = Common::AlignDown(cpu_addr, CACHING_PAGESIZE);
|
||||
wanted_size = static_cast<u32>(cpu_addr_end - cpu_addr);
|
||||
const OverlapResult overlap = ResolveOverlaps(cpu_addr, wanted_size);
|
||||
const u32 size = static_cast<u32>(overlap.end - overlap.begin);
|
||||
@@ -1363,8 +1364,8 @@ void BufferCache<P>::ChangeRegister(BufferId buffer_id) {
|
||||
}
|
||||
const VAddr cpu_addr_begin = buffer.CpuAddr();
|
||||
const VAddr cpu_addr_end = cpu_addr_begin + size;
|
||||
const u64 page_begin = cpu_addr_begin / PAGE_SIZE;
|
||||
const u64 page_end = Common::DivCeil(cpu_addr_end, PAGE_SIZE);
|
||||
const u64 page_begin = cpu_addr_begin / CACHING_PAGESIZE;
|
||||
const u64 page_end = Common::DivCeil(cpu_addr_end, CACHING_PAGESIZE);
|
||||
for (u64 page = page_begin; page != page_end; ++page) {
|
||||
if constexpr (insert) {
|
||||
page_table[page] = buffer_id;
|
||||
|
@@ -90,10 +90,8 @@ template <typename P>
|
||||
class BufferCache : public VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo> {
|
||||
// Page size for caching purposes.
|
||||
// This is unrelated to the CPU page size and it can be changed as it seems optimal.
|
||||
static constexpr u32 PAGE_BITS = 16;
|
||||
static constexpr u64 PAGE_SIZE = u64{1} << PAGE_BITS;
|
||||
static constexpr u32 CPU_PAGE_BITS = 12;
|
||||
static constexpr u64 CPU_PAGE_SIZE = u64{1} << CPU_PAGE_BITS;
|
||||
static constexpr u32 CACHING_PAGEBITS = 16;
|
||||
static constexpr u64 CACHING_PAGESIZE = u64{1} << CACHING_PAGEBITS;
|
||||
|
||||
static constexpr bool IS_OPENGL = P::IS_OPENGL;
|
||||
static constexpr bool HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS =
|
||||
@@ -290,8 +288,8 @@ private:
|
||||
|
||||
template <typename Func>
|
||||
void ForEachBufferInRange(VAddr cpu_addr, u64 size, Func&& func) {
|
||||
const u64 page_end = Common::DivCeil(cpu_addr + size, PAGE_SIZE);
|
||||
for (u64 page = cpu_addr >> PAGE_BITS; page < page_end;) {
|
||||
const u64 page_end = Common::DivCeil(cpu_addr + size, CACHING_PAGESIZE);
|
||||
for (u64 page = cpu_addr >> CACHING_PAGEBITS; page < page_end;) {
|
||||
const BufferId buffer_id = page_table[page];
|
||||
if (!buffer_id) {
|
||||
++page;
|
||||
@@ -301,7 +299,7 @@ private:
|
||||
func(buffer_id, buffer);
|
||||
|
||||
const VAddr end_addr = buffer.CpuAddr() + buffer.SizeBytes();
|
||||
page = Common::DivCeil(end_addr, PAGE_SIZE);
|
||||
page = Common::DivCeil(end_addr, CACHING_PAGESIZE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -576,7 +574,7 @@ private:
|
||||
|
||||
bool active_async_buffers = false;
|
||||
|
||||
std::array<BufferId, ((1ULL << 39) >> PAGE_BITS)> page_table;
|
||||
std::array<BufferId, ((1ULL << 39) >> CACHING_PAGEBITS)> page_table;
|
||||
};
|
||||
|
||||
} // namespace VideoCommon
|
||||
|
Reference in New Issue
Block a user