summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp13
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_gpu.h1
2 files changed, 11 insertions, 3 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
index 2b9a8722c..152019548 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
@@ -16,7 +16,10 @@ namespace Service::Nvidia::Devices {
16 16
17nvhost_gpu::nvhost_gpu(Core::System& system, std::shared_ptr<nvmap> nvmap_dev, 17nvhost_gpu::nvhost_gpu(Core::System& system, std::shared_ptr<nvmap> nvmap_dev,
18 SyncpointManager& syncpoint_manager) 18 SyncpointManager& syncpoint_manager)
19 : nvdevice(system), nvmap_dev(std::move(nvmap_dev)), syncpoint_manager{syncpoint_manager} {} 19 : nvdevice(system), nvmap_dev(std::move(nvmap_dev)), syncpoint_manager{syncpoint_manager} {
20 channel_fence.id = syncpoint_manager.AllocateSyncpoint();
21 channel_fence.value = system.GPU().GetSyncpointValue(channel_fence.id);
22}
20 23
21nvhost_gpu::~nvhost_gpu() = default; 24nvhost_gpu::~nvhost_gpu() = default;
22 25
@@ -129,8 +132,9 @@ u32 nvhost_gpu::AllocGPFIFOEx2(const std::vector<u8>& input, std::vector<u8>& ou
129 params.num_entries, params.flags, params.unk0, params.unk1, params.unk2, 132 params.num_entries, params.flags, params.unk0, params.unk1, params.unk2,
130 params.unk3); 133 params.unk3);
131 134
132 params.fence_out.id = syncpoint_manager.AllocateSyncpoint(); 135 channel_fence.value = system.GPU().GetSyncpointValue(channel_fence.id);
133 params.fence_out.value = syncpoint_manager.RefreshSyncpoint(params.fence_out.id); 136
137 params.fence_out = channel_fence;
134 138
135 std::memcpy(output.data(), &params, output.size()); 139 std::memcpy(output.data(), &params, output.size());
136 return 0; 140 return 0;
@@ -194,6 +198,9 @@ u32 nvhost_gpu::SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::vector<u8>& out
194 params.num_entries, params.flags.raw); 198 params.num_entries, params.flags.raw);
195 199
196 auto& gpu = system.GPU(); 200 auto& gpu = system.GPU();
201
202 params.fence_out.id = channel_fence.id;
203
197 if (params.flags.add_wait.Value() && 204 if (params.flags.add_wait.Value() &&
198 !syncpoint_manager.IsSyncpointExpired(params.fence_out.id, params.fence_out.value)) { 205 !syncpoint_manager.IsSyncpointExpired(params.fence_out.id, params.fence_out.value)) {
199 gpu.PushGPUEntries(Tegra::CommandList{BuildWaitCommandList(params.fence_out)}); 206 gpu.PushGPUEntries(Tegra::CommandList{BuildWaitCommandList(params.fence_out)});
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h
index 80054510f..a252fc06d 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h
@@ -212,6 +212,7 @@ private:
212 212
213 std::shared_ptr<nvmap> nvmap_dev; 213 std::shared_ptr<nvmap> nvmap_dev;
214 SyncpointManager& syncpoint_manager; 214 SyncpointManager& syncpoint_manager;
215 Fence channel_fence;
215}; 216};
216 217
217} // namespace Service::Nvidia::Devices 218} // namespace Service::Nvidia::Devices