summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-02-08 04:03:04 +0100
committerbunnei <bunneidev@gmail.com>2018-02-08 05:31:28 +0100
commita39a65cbe0d787587ad686fbd9474703ac58090c (patch)
treea9a7ab29e0c2e89bf2ec9874df074eb9db792dcc /src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
parentnvdrv: Add MemoryManager class to track GPU memory. (diff)
downloadyuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar.gz
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar.bz2
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar.lz
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar.xz
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.tar.zst
yuzu-a39a65cbe0d787587ad686fbd9474703ac58090c.zip
Diffstat (limited to 'src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp37
1 files changed, 28 insertions, 9 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
u32 nvhost_as_gpu::AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output) {
IoctlAllocSpace params{};
std::memcpy(&params, input.data(), input.size());
- LOG_WARNING(Service_NVDRV, "(STUBBED) called, pages=%x, page_size=%x, flags=%x", params.pages,
- params.page_size, params.flags);
- params.offset = 0xdeadbeef; // TODO(ogniK): Actually allocate space and give a real offset
+ LOG_DEBUG(Service_NVDRV, "called, pages=%x, page_size=%x, flags=%x", params.pages,
+ params.page_size, params.flags);
+
+ const u64 size{static_cast<u64>(params.pages) * static_cast<u64>(params.page_size)};
+ if (params.flags & 1) {
+ params.offset = memory_manager->AllocateSpace(params.offset, size, 1);
+ } else {
+ params.offset = memory_manager->AllocateSpace(size, params.align);
+ }
+
std::memcpy(output.data(), &params, output.size());
return 0;
}
@@ -52,12 +59,24 @@ u32 nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& ou
IoctlMapBufferEx params{};
std::memcpy(&params, input.data(), input.size());
- LOG_WARNING(Service_NVDRV,
- "(STUBBED) called, flags=%x, nvmap_handle=%x, buffer_offset=%lx, mapping_size=%lx, "
- "offset=%lx",
- params.flags, params.nvmap_handle, params.buffer_offset, params.mapping_size,
- params.offset);
- params.offset = 0x0; // TODO(ogniK): Actually map and give a real offset
+ LOG_DEBUG(Service_NVDRV,
+ "called, flags=%x, nvmap_handle=%x, buffer_offset=%lx, mapping_size=%lx, offset=%lx",
+ params.flags, params.nvmap_handle, params.buffer_offset, params.mapping_size,
+ params.offset);
+
+ if (!params.nvmap_handle) {
+ return 0;
+ }
+
+ auto object = nvmap_dev->GetObject(params.nvmap_handle);
+ ASSERT(object);
+
+ if (params.flags & 1) {
+ params.offset = memory_manager->MapBufferEx(object->addr, params.offset, object->size);
+ } else {
+ params.offset = memory_manager->MapBufferEx(object->addr, object->size);
+ }
+
std::memcpy(output.data(), &params, output.size());
return 0;
}