forked from ShuriZma/suyu
1
0
Fork 0

hle service: nvdrv: Update to instantiate SyncpointManager.

This commit is contained in:
bunnei 2020-10-26 21:58:59 -07:00
parent d567b7e841
commit 4a3fd97e48
2 changed files with 18 additions and 5 deletions

View File

@ -21,6 +21,7 @@
#include "core/hle/service/nvdrv/interface.h" #include "core/hle/service/nvdrv/interface.h"
#include "core/hle/service/nvdrv/nvdrv.h" #include "core/hle/service/nvdrv/nvdrv.h"
#include "core/hle/service/nvdrv/nvmemp.h" #include "core/hle/service/nvdrv/nvmemp.h"
#include "core/hle/service/nvdrv/syncpoint_manager.h"
#include "core/hle/service/nvflinger/nvflinger.h" #include "core/hle/service/nvflinger/nvflinger.h"
namespace Service::Nvidia { namespace Service::Nvidia {
@ -40,7 +41,7 @@ Module::Module(Core::System& system) : syncpoint_manager{system.GPU()} {
auto& kernel = system.Kernel(); auto& kernel = system.Kernel();
for (u32 i = 0; i < MaxNvEvents; i++) { for (u32 i = 0; i < MaxNvEvents; i++) {
std::string event_label = fmt::format("NVDRV::NvEvent_{}", i); std::string event_label = fmt::format("NVDRV::NvEvent_{}", i);
events_interface.events[i] = Kernel::WritableEvent::CreateEventPair(kernel, event_label); events_interface.events[i] = {Kernel::WritableEvent::CreateEventPair(kernel, event_label)};
events_interface.status[i] = EventState::Free; events_interface.status[i] = EventState::Free;
events_interface.registered[i] = false; events_interface.registered[i] = false;
} }
@ -95,17 +96,17 @@ void Module::SignalSyncpt(const u32 syncpoint_id, const u32 value) {
if (events_interface.assigned_syncpt[i] == syncpoint_id && if (events_interface.assigned_syncpt[i] == syncpoint_id &&
events_interface.assigned_value[i] == value) { events_interface.assigned_value[i] == value) {
events_interface.LiberateEvent(i); events_interface.LiberateEvent(i);
events_interface.events[i].writable->Signal(); events_interface.events[i].event.writable->Signal();
} }
} }
} }
std::shared_ptr<Kernel::ReadableEvent> Module::GetEvent(const u32 event_id) const { std::shared_ptr<Kernel::ReadableEvent> Module::GetEvent(const u32 event_id) const {
return events_interface.events[event_id].readable; return events_interface.events[event_id].event.readable;
} }
std::shared_ptr<Kernel::WritableEvent> Module::GetEventWriteable(const u32 event_id) const { std::shared_ptr<Kernel::WritableEvent> Module::GetEventWriteable(const u32 event_id) const {
return events_interface.events[event_id].writable; return events_interface.events[event_id].event.writable;
} }
} // namespace Service::Nvidia } // namespace Service::Nvidia

View File

@ -10,6 +10,7 @@
#include "common/common_types.h" #include "common/common_types.h"
#include "core/hle/kernel/writable_event.h" #include "core/hle/kernel/writable_event.h"
#include "core/hle/service/nvdrv/nvdata.h" #include "core/hle/service/nvdrv/nvdata.h"
#include "core/hle/service/nvdrv/syncpoint_manager.h"
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Core { namespace Core {
@ -22,15 +23,23 @@ class NVFlinger;
namespace Service::Nvidia { namespace Service::Nvidia {
class SyncpointManager;
namespace Devices { namespace Devices {
class nvdevice; class nvdevice;
} }
/// Represents an Nvidia event
struct NvEvent {
Kernel::EventPair event;
Fence fence{};
};
struct EventInterface { struct EventInterface {
// Mask representing currently busy events // Mask representing currently busy events
u64 events_mask{}; u64 events_mask{};
// Each kernel event associated to an NV event // Each kernel event associated to an NV event
std::array<Kernel::EventPair, MaxNvEvents> events; std::array<NvEvent, MaxNvEvents> events;
// The status of the current NVEvent // The status of the current NVEvent
std::array<EventState, MaxNvEvents> status{}; std::array<EventState, MaxNvEvents> status{};
// Tells if an NVEvent is registered or not // Tells if an NVEvent is registered or not
@ -119,6 +128,9 @@ public:
std::shared_ptr<Kernel::WritableEvent> GetEventWriteable(u32 event_id) const; std::shared_ptr<Kernel::WritableEvent> GetEventWriteable(u32 event_id) const;
private: private:
/// Manages syncpoints on the host
SyncpointManager syncpoint_manager;
/// Id to use for the next open file descriptor. /// Id to use for the next open file descriptor.
u32 next_fd = 1; u32 next_fd = 1;