mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-27 12:34:37 +00:00
Better sync
This commit is contained in:
parent
b6001e47d6
commit
ef51446b36
@ -201,7 +201,7 @@ void EmitContext::DefineArithmeticTypes() {
|
|||||||
Constant(U64, static_cast<u64>(VideoCore::BufferCache::CACHING_PAGEBITS));
|
Constant(U64, static_cast<u64>(VideoCore::BufferCache::CACHING_PAGEBITS));
|
||||||
caching_pagemask_value = Constant(U64, VideoCore::BufferCache::CACHING_PAGESIZE - 1);
|
caching_pagemask_value = Constant(U64, VideoCore::BufferCache::CACHING_PAGESIZE - 1);
|
||||||
|
|
||||||
// Used to calculate fault readback buffer position and mask
|
// Used to calculate fault buffer position and mask
|
||||||
u32_three_value = ConstU32(3U);
|
u32_three_value = ConstU32(3U);
|
||||||
u32_seven_value = ConstU32(7U);
|
u32_seven_value = ConstU32(7U);
|
||||||
bda_first_time_mask = Constant(U64, 0x1ULL);
|
bda_first_time_mask = Constant(U64, 0x1ULL);
|
||||||
@ -747,8 +747,8 @@ EmitContext::BufferSpv EmitContext::DefineBuffer(bool is_storage, bool is_writte
|
|||||||
case Shader::BufferType::BdaPagetable:
|
case Shader::BufferType::BdaPagetable:
|
||||||
Name(id, "bda_pagetable");
|
Name(id, "bda_pagetable");
|
||||||
break;
|
break;
|
||||||
case Shader::BufferType::FaultReadback:
|
case Shader::BufferType::FaultBuffer:
|
||||||
Name(id, "fault_readback");
|
Name(id, "fault_buffer");
|
||||||
break;
|
break;
|
||||||
case Shader::BufferType::SharedMemory:
|
case Shader::BufferType::SharedMemory:
|
||||||
Name(id, "ssbo_shmem");
|
Name(id, "ssbo_shmem");
|
||||||
@ -782,8 +782,8 @@ void EmitContext::DefineBuffers() {
|
|||||||
flatbuf_index = buffers.size();
|
flatbuf_index = buffers.size();
|
||||||
} else if (desc.buffer_type == BufferType::BdaPagetable) {
|
} else if (desc.buffer_type == BufferType::BdaPagetable) {
|
||||||
bda_pagetable_index = buffers.size();
|
bda_pagetable_index = buffers.size();
|
||||||
} else if (desc.buffer_type == BufferType::FaultReadback) {
|
} else if (desc.buffer_type == BufferType::FaultBuffer) {
|
||||||
fault_readback_index = buffers.size();
|
fault_buffer_index = buffers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define aliases depending on the shader usage.
|
// Define aliases depending on the shader usage.
|
||||||
|
@ -199,7 +199,7 @@ public:
|
|||||||
|
|
||||||
// First time access
|
// First time access
|
||||||
AddLabel(first_time_label);
|
AddLabel(first_time_label);
|
||||||
const auto& fault_buffer = buffers[fault_readback_index];
|
const auto& fault_buffer = buffers[fault_buffer_index];
|
||||||
const auto [fault_buffer_id, fault_pointer_type] = fault_buffer[PointerType::U8];
|
const auto [fault_buffer_id, fault_pointer_type] = fault_buffer[PointerType::U8];
|
||||||
const Id page_div8 = OpShiftRightLogical(U32[1], page32, u32_three_value);
|
const Id page_div8 = OpShiftRightLogical(U32[1], page32, u32_three_value);
|
||||||
const Id page_mod8 = OpBitwiseAnd(U32[1], page32, u32_seven_value);
|
const Id page_mod8 = OpBitwiseAnd(U32[1], page32, u32_seven_value);
|
||||||
@ -248,7 +248,7 @@ public:
|
|||||||
// Merge
|
// Merge
|
||||||
AddLabel(merge_label);
|
AddLabel(merge_label);
|
||||||
const Id final_result =
|
const Id final_result =
|
||||||
OpPhi(type, fallback_result, fallback_label, result, available_label);
|
OpPhi(type, fallback_result, fallback_label, result, after_save_masked_label);
|
||||||
return final_result;
|
return final_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,7 +407,7 @@ public:
|
|||||||
|
|
||||||
size_t flatbuf_index{};
|
size_t flatbuf_index{};
|
||||||
size_t bda_pagetable_index{};
|
size_t bda_pagetable_index{};
|
||||||
size_t fault_readback_index{};
|
size_t fault_buffer_index{};
|
||||||
|
|
||||||
Id sampler_type{};
|
Id sampler_type{};
|
||||||
Id sampler_pointer_type{};
|
Id sampler_pointer_type{};
|
||||||
|
@ -43,7 +43,7 @@ enum class BufferType : u32 {
|
|||||||
Guest,
|
Guest,
|
||||||
Flatbuf,
|
Flatbuf,
|
||||||
BdaPagetable,
|
BdaPagetable,
|
||||||
FaultReadback,
|
FaultBuffer,
|
||||||
GdsBuffer,
|
GdsBuffer,
|
||||||
SharedMemory,
|
SharedMemory,
|
||||||
};
|
};
|
||||||
|
@ -119,8 +119,8 @@ void CollectShaderInfoPass(IR::Program& program) {
|
|||||||
});
|
});
|
||||||
program.info.buffers.push_back({
|
program.info.buffers.push_back({
|
||||||
.used_types = IR::Type::U8,
|
.used_types = IR::Type::U8,
|
||||||
.inline_cbuf = AmdGpu::Buffer::Placeholder(VideoCore::BufferCache::FAULT_READBACK_SIZE),
|
.inline_cbuf = AmdGpu::Buffer::Placeholder(VideoCore::BufferCache::FAULT_BUFFER_SIZE),
|
||||||
.buffer_type = BufferType::FaultReadback,
|
.buffer_type = BufferType::FaultBuffer,
|
||||||
.is_written = true,
|
.is_written = true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& s
|
|||||||
bda_pagetable_buffer{instance, scheduler, MemoryUsage::DeviceLocal,
|
bda_pagetable_buffer{instance, scheduler, MemoryUsage::DeviceLocal,
|
||||||
0, AllFlags, BDA_PAGETABLE_SIZE},
|
0, AllFlags, BDA_PAGETABLE_SIZE},
|
||||||
fault_buffer(instance, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags,
|
fault_buffer(instance, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags,
|
||||||
FAULT_READBACK_SIZE),
|
FAULT_BUFFER_SIZE),
|
||||||
memory_tracker{&tracker} {
|
memory_tracker{&tracker} {
|
||||||
Vulkan::SetObjectName(instance.GetDevice(), gds_buffer.Handle(), "GDS Buffer");
|
Vulkan::SetObjectName(instance.GetDevice(), gds_buffer.Handle(), "GDS Buffer");
|
||||||
Vulkan::SetObjectName(instance.GetDevice(), bda_pagetable_buffer.Handle(),
|
Vulkan::SetObjectName(instance.GetDevice(), bda_pagetable_buffer.Handle(),
|
||||||
@ -628,14 +628,14 @@ BufferId BufferCache::CreateBuffer(VAddr device_addr, u32 wanted_size) {
|
|||||||
void BufferCache::ProcessFaultBuffer() {
|
void BufferCache::ProcessFaultBuffer() {
|
||||||
// Run fault processing shader
|
// Run fault processing shader
|
||||||
const auto [mapped, offset] = download_buffer.Map(MaxPageFaults * sizeof(u64));
|
const auto [mapped, offset] = download_buffer.Map(MaxPageFaults * sizeof(u64));
|
||||||
vk::BufferMemoryBarrier2 fault_readback_barrier{
|
vk::BufferMemoryBarrier2 fault_buffer_barrier{
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eAllCommands,
|
.srcStageMask = vk::PipelineStageFlagBits2::eAllCommands,
|
||||||
.srcAccessMask = vk::AccessFlagBits2::eShaderWrite,
|
.srcAccessMask = vk::AccessFlagBits2::eShaderWrite,
|
||||||
.dstStageMask = vk::PipelineStageFlagBits2::eComputeShader,
|
.dstStageMask = vk::PipelineStageFlagBits2::eComputeShader,
|
||||||
.dstAccessMask = vk::AccessFlagBits2::eShaderRead,
|
.dstAccessMask = vk::AccessFlagBits2::eShaderRead,
|
||||||
.buffer = fault_buffer.Handle(),
|
.buffer = fault_buffer.Handle(),
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = FAULT_READBACK_SIZE,
|
.size = FAULT_BUFFER_SIZE,
|
||||||
};
|
};
|
||||||
vk::BufferMemoryBarrier2 download_barrier{
|
vk::BufferMemoryBarrier2 download_barrier{
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
||||||
@ -646,11 +646,11 @@ void BufferCache::ProcessFaultBuffer() {
|
|||||||
.offset = offset,
|
.offset = offset,
|
||||||
.size = MaxPageFaults * sizeof(u64),
|
.size = MaxPageFaults * sizeof(u64),
|
||||||
};
|
};
|
||||||
std::array<vk::BufferMemoryBarrier2, 2> barriers{fault_readback_barrier, download_barrier};
|
std::array<vk::BufferMemoryBarrier2, 2> barriers{fault_buffer_barrier, download_barrier};
|
||||||
vk::DescriptorBufferInfo fault_readback_info{
|
vk::DescriptorBufferInfo fault_buffer_info{
|
||||||
.buffer = fault_buffer.Handle(),
|
.buffer = fault_buffer.Handle(),
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.range = FAULT_READBACK_SIZE,
|
.range = FAULT_BUFFER_SIZE,
|
||||||
};
|
};
|
||||||
vk::DescriptorBufferInfo download_info{
|
vk::DescriptorBufferInfo download_info{
|
||||||
.buffer = download_buffer.Handle(),
|
.buffer = download_buffer.Handle(),
|
||||||
@ -664,7 +664,7 @@ void BufferCache::ProcessFaultBuffer() {
|
|||||||
.dstArrayElement = 0,
|
.dstArrayElement = 0,
|
||||||
.descriptorCount = 1,
|
.descriptorCount = 1,
|
||||||
.descriptorType = vk::DescriptorType::eStorageBuffer,
|
.descriptorType = vk::DescriptorType::eStorageBuffer,
|
||||||
.pBufferInfo = &fault_readback_info,
|
.pBufferInfo = &fault_buffer_info,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.dstSet = VK_NULL_HANDLE,
|
.dstSet = VK_NULL_HANDLE,
|
||||||
@ -698,7 +698,7 @@ void BufferCache::ProcessFaultBuffer() {
|
|||||||
.dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
|
.dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
|
||||||
.buffer = fault_buffer.Handle(),
|
.buffer = fault_buffer.Handle(),
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = FAULT_READBACK_SIZE,
|
.size = FAULT_BUFFER_SIZE,
|
||||||
};
|
};
|
||||||
const vk::BufferMemoryBarrier2 reset_post_barrier = {
|
const vk::BufferMemoryBarrier2 reset_post_barrier = {
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
||||||
@ -707,14 +707,14 @@ void BufferCache::ProcessFaultBuffer() {
|
|||||||
.dstAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite,
|
.dstAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite,
|
||||||
.buffer = fault_buffer.Handle(),
|
.buffer = fault_buffer.Handle(),
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = FAULT_READBACK_SIZE,
|
.size = FAULT_BUFFER_SIZE,
|
||||||
};
|
};
|
||||||
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
|
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
|
||||||
.dependencyFlags = vk::DependencyFlagBits::eByRegion,
|
.dependencyFlags = vk::DependencyFlagBits::eByRegion,
|
||||||
.bufferMemoryBarrierCount = 1,
|
.bufferMemoryBarrierCount = 1,
|
||||||
.pBufferMemoryBarriers = &reset_pre_barrier,
|
.pBufferMemoryBarriers = &reset_pre_barrier,
|
||||||
});
|
});
|
||||||
cmdbuf.fillBuffer(fault_buffer.buffer, 0, FAULT_READBACK_SIZE, 0);
|
cmdbuf.fillBuffer(fault_buffer.buffer, 0, FAULT_BUFFER_SIZE, 0);
|
||||||
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
|
cmdbuf.pipelineBarrier2(vk::DependencyInfo{
|
||||||
.dependencyFlags = vk::DependencyFlagBits::eByRegion,
|
.dependencyFlags = vk::DependencyFlagBits::eByRegion,
|
||||||
.bufferMemoryBarrierCount = 1,
|
.bufferMemoryBarrierCount = 1,
|
||||||
@ -737,8 +737,8 @@ void BufferCache::ProcessFaultBuffer() {
|
|||||||
for (const auto& range : fault_ranges) {
|
for (const auto& range : fault_ranges) {
|
||||||
const VAddr start = range.lower();
|
const VAddr start = range.lower();
|
||||||
const VAddr end = range.upper();
|
const VAddr end = range.upper();
|
||||||
const VAddr page_start = start >> CACHING_PAGEBITS;
|
const u64 page_start = start >> CACHING_PAGEBITS;
|
||||||
const VAddr page_end = Common::DivCeil(end, CACHING_PAGESIZE);
|
const u64 page_end = Common::DivCeil(end, CACHING_PAGESIZE);
|
||||||
// Mark the pages as synced
|
// Mark the pages as synced
|
||||||
for (u64 page = page_start; page < page_end; ++page) {
|
for (u64 page = page_start; page < page_end; ++page) {
|
||||||
page_table[page].is_dma_synced = true;
|
page_table[page].is_dma_synced = true;
|
||||||
|
@ -44,7 +44,7 @@ public:
|
|||||||
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);
|
||||||
static constexpr u64 FAULT_READBACK_SIZE = CACHING_NUMPAGES / 8; // Bit per page
|
static constexpr u64 FAULT_BUFFER_SIZE = CACHING_NUMPAGES / 8; // Bit per page
|
||||||
|
|
||||||
struct PageData {
|
struct PageData {
|
||||||
BufferId buffer_id{};
|
BufferId buffer_id{};
|
||||||
@ -87,8 +87,8 @@ public:
|
|||||||
return &bda_pagetable_buffer;
|
return &bda_pagetable_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Retrieves the fault readback buffer.
|
/// Retrieves the fault buffer.
|
||||||
[[nodiscard]] Buffer* GetFaultReadbackBuffer() noexcept {
|
[[nodiscard]] Buffer* GetFaultBuffer() noexcept {
|
||||||
return &fault_buffer;
|
return &fault_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,8 +558,8 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding
|
|||||||
} else if (desc.buffer_type == Shader::BufferType::BdaPagetable) {
|
} else if (desc.buffer_type == Shader::BufferType::BdaPagetable) {
|
||||||
const auto* bda_buffer = buffer_cache.GetBdaPageTableBuffer();
|
const auto* bda_buffer = buffer_cache.GetBdaPageTableBuffer();
|
||||||
buffer_infos.emplace_back(bda_buffer->Handle(), 0, bda_buffer->SizeBytes());
|
buffer_infos.emplace_back(bda_buffer->Handle(), 0, bda_buffer->SizeBytes());
|
||||||
} else if (desc.buffer_type == Shader::BufferType::FaultReadback) {
|
} else if (desc.buffer_type == Shader::BufferType::FaultBuffer) {
|
||||||
const auto* fault_buffer = buffer_cache.GetFaultReadbackBuffer();
|
const auto* fault_buffer = buffer_cache.GetFaultBuffer();
|
||||||
buffer_infos.emplace_back(fault_buffer->Handle(), 0, fault_buffer->SizeBytes());
|
buffer_infos.emplace_back(fault_buffer->Handle(), 0, fault_buffer->SizeBytes());
|
||||||
} else if (desc.buffer_type == Shader::BufferType::SharedMemory) {
|
} else if (desc.buffer_type == Shader::BufferType::SharedMemory) {
|
||||||
auto& lds_buffer = buffer_cache.GetStreamBuffer();
|
auto& lds_buffer = buffer_cache.GetStreamBuffer();
|
||||||
|
Loading…
Reference in New Issue
Block a user