summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-02-07 21:53:31 -0500
committerGravatar bunnei2018-02-07 22:55:12 -0500
commit196f8dff084b7229982af214617d55ca084dfed2 (patch)
tree0d2f60713d7a0035409640e88ff1c7d6b7762cbe /src
parentnvhost_as_gpu: Add nvmap as a class member. (diff)
downloadyuzu-196f8dff084b7229982af214617d55ca084dfed2.tar.gz
yuzu-196f8dff084b7229982af214617d55ca084dfed2.tar.xz
yuzu-196f8dff084b7229982af214617d55ca084dfed2.zip
nvmap: Refactor to expose nvmap objects.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvmap.cpp27
-rw-r--r--src/core/hle/service/nvdrv/devices/nvmap.h14
2 files changed, 22 insertions, 19 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp
index cb3692689..02b33374a 100644
--- a/src/core/hle/service/nvdrv/devices/nvmap.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp
@@ -13,10 +13,8 @@ namespace Nvidia {
13namespace Devices { 13namespace Devices {
14 14
15VAddr nvmap::GetObjectAddress(u32 handle) const { 15VAddr nvmap::GetObjectAddress(u32 handle) const {
16 auto itr = handles.find(handle); 16 auto object = GetObject(handle);
17 ASSERT(itr != handles.end()); 17 ASSERT(object);
18
19 auto object = itr->second;
20 ASSERT(object->status == Object::Status::Allocated); 18 ASSERT(object->status == Object::Status::Allocated);
21 return object->addr; 19 return object->addr;
22} 20}
@@ -52,7 +50,7 @@ u32 nvmap::IocCreate(const std::vector<u8>& input, std::vector<u8>& output) {
52 u32 handle = next_handle++; 50 u32 handle = next_handle++;
53 handles[handle] = std::move(object); 51 handles[handle] = std::move(object);
54 52
55 LOG_WARNING(Service_NVDRV, "(STUBBED) size 0x%08X", params.size); 53 LOG_DEBUG(Service_NVDRV, "size=0x%08X", params.size);
56 54
57 params.handle = handle; 55 params.handle = handle;
58 56
@@ -64,17 +62,16 @@ u32 nvmap::IocAlloc(const std::vector<u8>& input, std::vector<u8>& output) {
64 IocAllocParams params; 62 IocAllocParams params;
65 std::memcpy(&params, input.data(), sizeof(params)); 63 std::memcpy(&params, input.data(), sizeof(params));
66 64
67 auto itr = handles.find(params.handle); 65 auto object = GetObject(params.handle);
68 ASSERT(itr != handles.end()); 66 ASSERT(object);
69 67
70 auto object = itr->second;
71 object->flags = params.flags; 68 object->flags = params.flags;
72 object->align = params.align; 69 object->align = params.align;
73 object->kind = params.kind; 70 object->kind = params.kind;
74 object->addr = params.addr; 71 object->addr = params.addr;
75 object->status = Object::Status::Allocated; 72 object->status = Object::Status::Allocated;
76 73
77 LOG_WARNING(Service_NVDRV, "(STUBBED) Allocated address 0x%llx", params.addr); 74 LOG_DEBUG(Service_NVDRV, "called, addr=0x%llx", params.addr);
78 75
79 std::memcpy(output.data(), &params, sizeof(params)); 76 std::memcpy(output.data(), &params, sizeof(params));
80 return 0; 77 return 0;
@@ -86,10 +83,10 @@ u32 nvmap::IocGetId(const std::vector<u8>& input, std::vector<u8>& output) {
86 83
87 LOG_WARNING(Service_NVDRV, "called"); 84 LOG_WARNING(Service_NVDRV, "called");
88 85
89 auto itr = handles.find(params.handle); 86 auto object = GetObject(params.handle);
90 ASSERT(itr != handles.end()); 87 ASSERT(object);
91 88
92 params.id = itr->second->id; 89 params.id = object->id;
93 90
94 std::memcpy(output.data(), &params, sizeof(params)); 91 std::memcpy(output.data(), &params, sizeof(params));
95 return 0; 92 return 0;
@@ -123,10 +120,8 @@ u32 nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) {
123 120
124 LOG_WARNING(Service_NVDRV, "(STUBBED) called type=%u", params.type); 121 LOG_WARNING(Service_NVDRV, "(STUBBED) called type=%u", params.type);
125 122
126 auto itr = handles.find(params.handle); 123 auto object = GetObject(params.handle);
127 ASSERT(itr != handles.end()); 124 ASSERT(object);
128
129 auto object = itr->second;
130 ASSERT(object->status == Object::Status::Allocated); 125 ASSERT(object->status == Object::Status::Allocated);
131 126
132 switch (static_cast<ParamTypes>(params.type)) { 127 switch (static_cast<ParamTypes>(params.type)) {
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.h b/src/core/hle/service/nvdrv/devices/nvmap.h
index 1591ac8ff..4681e438b 100644
--- a/src/core/hle/service/nvdrv/devices/nvmap.h
+++ b/src/core/hle/service/nvdrv/devices/nvmap.h
@@ -26,8 +26,7 @@ public:
26 26
27 u32 ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; 27 u32 ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override;
28 28
29private: 29 /// Represents an nvmap object.
30 // Represents an nvmap object.
31 struct Object { 30 struct Object {
32 enum class Status { Created, Allocated }; 31 enum class Status { Created, Allocated };
33 u32 id; 32 u32 id;
@@ -39,10 +38,19 @@ private:
39 Status status; 38 Status status;
40 }; 39 };
41 40
41 std::shared_ptr<Object> GetObject(u32 handle) const {
42 auto itr = handles.find(handle);
43 if (itr != handles.end()) {
44 return itr->second;
45 }
46 return {};
47 }
48
49private:
42 /// Id to use for the next handle that is created. 50 /// Id to use for the next handle that is created.
43 u32 next_handle = 1; 51 u32 next_handle = 1;
44 52
45 // Id to use for the next object that is created. 53 /// Id to use for the next object that is created.
46 u32 next_id = 1; 54 u32 next_id = 1;
47 55
48 /// Mapping of currently allocated handles to the objects they represent. 56 /// Mapping of currently allocated handles to the objects they represent.