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 07:10:42 +0100
committerGitHub <noreply@github.com>2018-02-08 07:10:42 +0100
commitdb11c9a0b927a8f1d09f4cdf6bbe524485cb61b4 (patch)
treea9a7ab29e0c2e89bf2ec9874df074eb9db792dcc /src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
parentMerge pull request #168 from mailwl/new-stubs (diff)
parentnvhost_as_gpu: Implement AllocateSpace and MapBufferEx. (diff)
downloadyuzu-db11c9a0b927a8f1d09f4cdf6bbe524485cb61b4.tar
yuzu-db11c9a0b927a8f1d09f4cdf6bbe524485cb61b4.tar.gz
yuzu-db11c9a0b927a8f1d09f4cdf6bbe524485cb61b4.tar.bz2
yuzu-db11c9a0b927a8f1d09f4cdf6bbe524485cb61b4.tar.lz
yuzu-db11c9a0b927a8f1d09f4cdf6bbe524485cb61b4.tar.xz
yuzu-db11c9a0b927a8f1d09f4cdf6bbe524485cb61b4.tar.zst
yuzu-db11c9a0b927a8f1d09f4cdf6bbe524485cb61b4.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp38
1 files changed, 29 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 11ab25545..cf3601f02 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
@@ -5,6 +5,7 @@
#include "common/assert.h"
#include "common/logging/log.h"
#include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h"
+#include "core/hle/service/nvdrv/devices/nvmap.h"
namespace Service {
namespace Nvidia {
@@ -40,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;
}
@@ -51,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;
}