diff options
| author | 2018-02-07 22:03:04 -0500 | |
|---|---|---|
| committer | 2018-02-07 23:31:28 -0500 | |
| commit | a39a65cbe0d787587ad686fbd9474703ac58090c (patch) | |
| tree | a9a7ab29e0c2e89bf2ec9874df074eb9db792dcc /src | |
| parent | nvdrv: Add MemoryManager class to track GPU memory. (diff) | |
| download | yuzu-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.cpp | 37 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h | 6 |
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 | |||
| 41 | u32 nvhost_as_gpu::AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output) { | 41 | u32 nvhost_as_gpu::AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output) { |
| 42 | IoctlAllocSpace params{}; | 42 | IoctlAllocSpace params{}; |
| 43 | std::memcpy(¶ms, input.data(), input.size()); | 43 | std::memcpy(¶ms, 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(), ¶ms, output.size()); | 54 | std::memcpy(output.data(), ¶ms, 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(¶ms, input.data(), input.size()); | 60 | std::memcpy(¶ms, 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(), ¶ms, output.size()); | 80 | std::memcpy(output.data(), ¶ms, 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 | ||
| 14 | namespace Service { | 15 | namespace Service { |
| 15 | namespace Nvidia { | 16 | namespace Nvidia { |
| @@ -19,7 +20,9 @@ class nvmap; | |||
| 19 | 20 | ||
| 20 | class nvhost_as_gpu final : public nvdevice { | 21 | class nvhost_as_gpu final : public nvdevice { |
| 21 | public: | 22 | public: |
| 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 |