mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-28 04:54:30 +00:00
16K pages and stack overflow fix
This commit is contained in:
parent
68a33cd38c
commit
31df795701
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user