mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-06 14:09:58 +00:00
Address son sync issues
This commit is contained in:
@@ -26,6 +26,15 @@ namespace Vulkan {
|
||||
namespace {
|
||||
constexpr u32 COMPACT_VERTEX_BINDINGS = 8;
|
||||
|
||||
constexpr VkMemoryBarrier2 HOST_READ_BARRIER{
|
||||
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
|
||||
.pNext = nullptr,
|
||||
.srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
|
||||
.srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT,
|
||||
.dstStageMask = VK_PIPELINE_STAGE_2_HOST_BIT,
|
||||
.dstAccessMask = VK_ACCESS_2_HOST_READ_BIT,
|
||||
};
|
||||
|
||||
template <u32 N>
|
||||
struct VertexBindings {
|
||||
std::array<VkBuffer, N> buffers;
|
||||
@@ -527,9 +536,16 @@ bool BufferCacheRuntime::CanReorderUpload(const Buffer& buffer,
|
||||
|
||||
std::span<const u8> BufferCacheRuntime::DirectDownloadSpan(Buffer& buffer) {
|
||||
const std::span<u8> mapping = buffer.CoherentMapping();
|
||||
if (!mapping.empty()) {
|
||||
scheduler.Wait((std::max)(buffer.getWriteTick(), buffer.LastUploadTick()));
|
||||
if (mapping.empty()) {
|
||||
return mapping;
|
||||
}
|
||||
if ((std::max)(buffer.getWriteTick(), buffer.LastUploadTick()) > host_read_tick) {
|
||||
scheduler.RequestOutsideRenderPassOperationContext();
|
||||
scheduler.Record(
|
||||
[](vk::CommandBuffer cmdbuf) { cmdbuf.PipelineBarrier(HOST_READ_BARRIER); });
|
||||
host_read_tick = scheduler.CurrentTick();
|
||||
}
|
||||
scheduler.Wait(host_read_tick);
|
||||
return mapping;
|
||||
}
|
||||
|
||||
|
||||
@@ -291,6 +291,7 @@ private:
|
||||
|
||||
VkMemoryBarrier2 read_barrier;
|
||||
VkMemoryBarrier2 write_barrier;
|
||||
u64 host_read_tick = 0;
|
||||
|
||||
bool limit_dynamic_storage_buffers = false;
|
||||
u32 max_dynamic_storage_buffers = (std::numeric_limits<u32>::max)();
|
||||
|
||||
@@ -898,7 +898,9 @@ void RasterizerVulkan::TiledCacheBarrier() {
|
||||
}
|
||||
|
||||
void RasterizerVulkan::FlushCommands() {
|
||||
if (draw_counter == 0) {
|
||||
if (draw_tick != scheduler.CurrentTick() ||
|
||||
(scheduler.IsRenderPassActive() &&
|
||||
!maxwell3d->dirty.flags[VideoCommon::Dirty::RenderTargets])) {
|
||||
return;
|
||||
}
|
||||
draw_counter = 0;
|
||||
@@ -1008,11 +1010,10 @@ void RasterizerVulkan::FlushWork() {
|
||||
maxwell3d->dirty.flags[VideoCommon::Dirty::RenderTargets])) {
|
||||
scheduler.Flush();
|
||||
draw_counter = 0;
|
||||
return;
|
||||
}
|
||||
if ((draw_counter & CHECK_MASK) == CHECK_MASK && !scheduler.IsRenderPassActive()) {
|
||||
} else if ((draw_counter & CHECK_MASK) == CHECK_MASK && !scheduler.IsRenderPassActive()) {
|
||||
scheduler.DispatchWork();
|
||||
}
|
||||
draw_tick = scheduler.CurrentTick();
|
||||
}
|
||||
|
||||
AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_, TextureCache& texture_cache_,
|
||||
|
||||
@@ -227,6 +227,7 @@ private:
|
||||
boost::container::static_vector<VkSampler, MAX_TEXTURES> sampler_handles;
|
||||
|
||||
u32 draw_counter = 0;
|
||||
u64 draw_tick = 0;
|
||||
Tegra::DepthFormat depth_bias_zeta_format{};
|
||||
std::array<u32, Tegra::Engines::Maxwell3D::Regs::NumVertexArrays> vertex_input_strides{};
|
||||
u32 vertex_input_attributes{};
|
||||
|
||||
@@ -32,15 +32,6 @@ namespace Vulkan {
|
||||
namespace {
|
||||
constexpr size_t DEPTH_VIEW = 8;
|
||||
|
||||
constexpr VkMemoryBarrier2 HOST_READ_BARRIER{
|
||||
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
|
||||
.pNext = nullptr,
|
||||
.srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
|
||||
.srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT,
|
||||
.dstStageMask = VK_PIPELINE_STAGE_2_HOST_BIT,
|
||||
.dstAccessMask = VK_ACCESS_2_HOST_READ_BIT,
|
||||
};
|
||||
|
||||
struct BeginRenderingCommand {
|
||||
void operator()(vk::CommandBuffer cmdbuf, vk::CommandBuffer) const {
|
||||
BeginRendering(cmdbuf, attachments);
|
||||
@@ -478,6 +469,7 @@ void Scheduler::AllocateWorkerCommandBuffer() {
|
||||
}
|
||||
|
||||
u64 Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_semaphore) {
|
||||
master_semaphore->Refresh();
|
||||
EndPendingOperations();
|
||||
InvalidateState();
|
||||
|
||||
@@ -486,9 +478,6 @@ u64 Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_se
|
||||
this](vk::CommandBuffer cmdbuf, vk::CommandBuffer upload_cmdbuf) {
|
||||
upload_cmdbuf.PipelineBarrier(upload_write_barrier);
|
||||
upload_cmdbuf.End();
|
||||
if (device.IsUMA()) {
|
||||
cmdbuf.PipelineBarrier(HOST_READ_BARRIER);
|
||||
}
|
||||
cmdbuf.End();
|
||||
|
||||
if (on_submit) {
|
||||
|
||||
Reference in New Issue
Block a user