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

View File

@ -39,9 +39,9 @@ class TextureCache;
class BufferCache { class BufferCache {
public: 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 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 CACHING_NUMPAGES = u64{1} << (40 - CACHING_PAGEBITS);
static constexpr u64 BDA_PAGETABLE_SIZE = CACHING_NUMPAGES * sizeof(vk::DeviceAddress); static constexpr u64 BDA_PAGETABLE_SIZE = CACHING_NUMPAGES * sizeof(vk::DeviceAddress);
@ -50,7 +50,7 @@ public:
struct Traits { struct Traits {
using Entry = BufferId; using Entry = BufferId;
static constexpr size_t AddressSpaceBits = 40; 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; static constexpr size_t PageBits = CACHING_PAGEBITS;
}; };
using PageTable = MultiLevelPageTable<Traits>; using PageTable = MultiLevelPageTable<Traits>;
@ -200,6 +200,8 @@ private:
Buffer gds_buffer; Buffer gds_buffer;
Buffer bda_pagetable_buffer; Buffer bda_pagetable_buffer;
Buffer fault_readback_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<VAddr> queued_imports;
boost::icl::interval_set<u64> imported_regions; boost::icl::interval_set<u64> imported_regions;
std::vector<ImportedHostBuffer> imported_buffers; std::vector<ImportedHostBuffer> imported_buffers;