16K pages and stack overflow fix

This commit is contained in:
Lander Gallastegi 2025-04-20 17:01:57 +02:00
parent 68a33cd38c
commit 31df795701
2 changed files with 8 additions and 7 deletions

View File

@ -566,18 +566,17 @@ void BufferCache::CreateFaultBuffers() {
const auto cmdbuf = scheduler.CommandBuffer();
cmdbuf.copyBuffer(fault_readback_buffer.buffer, staging_buffer.Handle(), copy);
scheduler.Finish();
std::array<u8, FAULT_READBACK_SIZE> buffer{};
std::memcpy(buffer.data(), mapped, FAULT_READBACK_SIZE);
std::memcpy(fault_readback_cpu.data(), mapped, FAULT_READBACK_SIZE);
// Create the fault buffers batched
boost::icl::interval_set<VAddr> fault_ranges;
for (u64 i = 0; i < FAULT_READBACK_SIZE; ++i) {
if (buffer[i] == 0) {
if (fault_readback_cpu[i] == 0) {
continue;
}
// Each bit is a page
const u64 page = i * 8;
for (u8 j = 0; j < 8; ++j) {
if ((buffer[i] & (1 << j)) == 0) {
if ((fault_readback_cpu[i] & (1 << j)) == 0) {
continue;
}
const VAddr start = (page + j) << CACHING_PAGEBITS;

View File

@ -39,9 +39,9 @@ class TextureCache;
class BufferCache {
public:
static constexpr u32 CACHING_PAGEBITS = 16;
static constexpr u32 CACHING_PAGEBITS = 14;
static constexpr u64 CACHING_PAGESIZE = u64{1} << CACHING_PAGEBITS;
static constexpr u64 DEVICE_PAGESIZE = 64_KB;
static constexpr u64 DEVICE_PAGESIZE = 16_KB;
static constexpr u64 CACHING_NUMPAGES = u64{1} << (40 - CACHING_PAGEBITS);
static constexpr u64 BDA_PAGETABLE_SIZE = CACHING_NUMPAGES * sizeof(vk::DeviceAddress);
@ -50,7 +50,7 @@ public:
struct Traits {
using Entry = BufferId;
static constexpr size_t AddressSpaceBits = 40;
static constexpr size_t FirstLevelBits = 18;
static constexpr size_t FirstLevelBits = 16;
static constexpr size_t PageBits = CACHING_PAGEBITS;
};
using PageTable = MultiLevelPageTable<Traits>;
@ -200,6 +200,8 @@ private:
Buffer gds_buffer;
Buffer bda_pagetable_buffer;
Buffer fault_readback_buffer;
// We need to define here to avoid stack overflow
std::array<u8, FAULT_READBACK_SIZE> fault_readback_cpu;
boost::icl::interval_set<VAddr> queued_imports;
boost::icl::interval_set<u64> imported_regions;
std::vector<ImportedHostBuffer> imported_buffers;