summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-02-07 22:03:04 -0500
committerGravatar bunnei2018-02-07 23:31:28 -0500
commita39a65cbe0d787587ad686fbd9474703ac58090c (patch)
treea9a7ab29e0c2e89bf2ec9874df074eb9db792dcc /src
parentnvdrv: Add MemoryManager class to track GPU memory. (diff)
downloadyuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar.gz
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar.xz
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.zip
nvhost_as_gpu: Implement AllocateSpace and MapBufferEx.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp37
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h6
2 files changed, 33 insertions, 10 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
index 3701c182f..cf3601f02 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
@@ -41,9 +41,16 @@ u32 nvhost_as_gpu::InitalizeEx(const std::vector<u8>& input, std::vector<u8>& ou
41u32 nvhost_as_gpu::AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output) { 41u32 nvhost_as_gpu::AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output) {
42 IoctlAllocSpace params{}; 42 IoctlAllocSpace params{};
43 std::memcpy(&params, input.data(), input.size()); 43 std::memcpy(&params, input.data(), input.size());
44 LOG_WARNING(Service_NVDRV, "(STUBBED) called, pages=%x, page_size=%x, flags=%x", params.pages, 44 LOG_DEBUG(Service_NVDRV, "called, pages=%x, page_size=%x, flags=%x", params.pages,
45 params.page_size, params.flags); 45 params.page_size, params.flags);
46 params.offset = 0xdeadbeef; // TODO(ogniK): Actually allocate space and give a real offset 46
47 const u64 size{static_cast<u64>(params.pages) * static_cast<u64>(params.page_size)};
48 if (params.flags & 1) {
49 params.offset = memory_manager->AllocateSpace(params.offset, size, 1);
50 } else {
51 params.offset = memory_manager->AllocateSpace(size, params.align);
52 }
53
47 std::memcpy(output.data(), &params, output.size()); 54 std::memcpy(output.data(), &params, output.size());
48 return 0; 55 return 0;
49} 56}
@@ -52,12 +59,24 @@ u32 nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& ou
52 IoctlMapBufferEx params{}; 59 IoctlMapBufferEx params{};
53 std::memcpy(&params, input.data(), input.size()); 60 std::memcpy(&params, input.data(), input.size());
54 61
55 LOG_WARNING(Service_NVDRV, 62 LOG_DEBUG(Service_NVDRV,
56 "(STUBBED) called, flags=%x, nvmap_handle=%x, buffer_offset=%lx, mapping_size=%lx, " 63 "called, flags=%x, nvmap_handle=%x, buffer_offset=%lx, mapping_size=%lx, offset=%lx",
57 "offset=%lx", 64 params.flags, params.nvmap_handle, params.buffer_offset, params.mapping_size,
58 params.flags, params.nvmap_handle, params.buffer_offset, params.mapping_size, 65 params.offset);
59 params.offset); 66
60 params.offset = 0x0; // TODO(ogniK): Actually map and give a real offset 67 if (!params.nvmap_handle) {
68 return 0;
69 }
70
71 auto object = nvmap_dev->GetObject(params.nvmap_handle);
72 ASSERT(object);
73
74 if (params.flags & 1) {
75 params.offset = memory_manager->MapBufferEx(object->addr, params.offset, object->size);
76 } else {
77 params.offset = memory_manager->MapBufferEx(object->addr, object->size);
78 }
79
61 std::memcpy(output.data(), &params, output.size()); 80 std::memcpy(output.data(), &params, output.size());
62 return 0; 81 return 0;
63} 82}
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h
index 6b3b67113..9d37b971a 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h
@@ -10,6 +10,7 @@
10#include "common/common_types.h" 10#include "common/common_types.h"
11#include "common/swap.h" 11#include "common/swap.h"
12#include "core/hle/service/nvdrv/devices/nvdevice.h" 12#include "core/hle/service/nvdrv/devices/nvdevice.h"
13#include "core/hle/service/nvdrv/memory_manager.h"
13 14
14namespace Service { 15namespace Service {
15namespace Nvidia { 16namespace Nvidia {
@@ -19,7 +20,9 @@ class nvmap;
19 20
20class nvhost_as_gpu final : public nvdevice { 21class nvhost_as_gpu final : public nvdevice {
21public: 22public:
22 nvhost_as_gpu(std::shared_ptr<nvmap> nvmap_dev) : nvdevice(), nvmap_dev(std::move(nvmap_dev)) {} 23 nvhost_as_gpu(std::shared_ptr<nvmap> nvmap_dev) : nvdevice(), nvmap_dev(std::move(nvmap_dev)) {
24 memory_manager = std::make_shared<MemoryManager>();
25 }
23 ~nvhost_as_gpu() override = default; 26 ~nvhost_as_gpu() override = default;
24 27
25 u32 ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; 28 u32 ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override;
@@ -98,6 +101,7 @@ private:
98 u32 GetVARegions(const std::vector<u8>& input, std::vector<u8>& output); 101 u32 GetVARegions(const std::vector<u8>& input, std::vector<u8>& output);
99 102
100 std::shared_ptr<nvmap> nvmap_dev; 103 std::shared_ptr<nvmap> nvmap_dev;
104 std::shared_ptr<MemoryManager> memory_manager;
101}; 105};
102 106
103} // namespace Devices 107} // namespace Devices