diff options
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/service/nvdrv/nvdrv_a.cpp | 169 |
1 files changed, 7 insertions, 162 deletions
diff --git a/src/core/hle/service/nvdrv/nvdrv_a.cpp b/src/core/hle/service/nvdrv/nvdrv_a.cpp index cede4a883..cfecea924 100644 --- a/src/core/hle/service/nvdrv/nvdrv_a.cpp +++ b/src/core/hle/service/nvdrv/nvdrv_a.cpp @@ -4,171 +4,16 @@ #include "common/logging/log.h" #include "core/hle/ipc_helpers.h" +#include "core/hle/service/nvdrv/devices/nvdevice.h" +#include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" +#include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h" +#include "core/hle/service/nvdrv/devices/nvmap.h" #include "core/hle/service/nvdrv/nvdrv.h" #include "core/hle/service/nvdrv/nvdrv_a.h" namespace Service { namespace NVDRV { -class nvhost_as_gpu : public nvdevice { -public: - u32 ioctl(u32 command, const std::vector<u8>& input, std::vector<u8>& output) override { - ASSERT(false, "Unimplemented"); - return 0; - } -}; - -VAddr nvmap::GetObjectAddress(u32 handle) const { - auto itr = handles.find(handle); - ASSERT(itr != handles.end()); - - auto object = itr->second; - ASSERT(object->status == Object::Status::Allocated); - return object->addr; -} - -u32 nvmap::ioctl(u32 command, const std::vector<u8>& input, std::vector<u8>& output) { - switch (command) { - case IocCreateCommand: - return IocCreate(input, output); - case IocAllocCommand: - return IocAlloc(input, output); - case IocGetIdCommand: - return IocGetId(input, output); - case IocFromIdCommand: - return IocFromId(input, output); - case IocParamCommand: - return IocParam(input, output); - } - - ASSERT(false, "Unimplemented"); -} - -u32 nvmap::IocCreate(const std::vector<u8>& input, std::vector<u8>& output) { - IocCreateParams params; - std::memcpy(¶ms, input.data(), sizeof(params)); - - // Create a new nvmap object and obtain a handle to it. - auto object = std::make_shared<Object>(); - object->id = next_id++; - object->size = params.size; - object->status = Object::Status::Created; - - u32 handle = next_handle++; - handles[handle] = std::move(object); - - LOG_WARNING(Service, "(STUBBED) size 0x%08X", params.size); - - params.handle = handle; - - std::memcpy(output.data(), ¶ms, sizeof(params)); - return 0; -} - -u32 nvmap::IocAlloc(const std::vector<u8>& input, std::vector<u8>& output) { - IocAllocParams params; - std::memcpy(¶ms, input.data(), sizeof(params)); - - auto itr = handles.find(params.handle); - ASSERT(itr != handles.end()); - - auto object = itr->second; - object->flags = params.flags; - object->align = params.align; - object->kind = params.kind; - object->addr = params.addr; - object->status = Object::Status::Allocated; - - LOG_WARNING(Service, "(STUBBED) Allocated address 0x%llx", params.addr); - - std::memcpy(output.data(), ¶ms, sizeof(params)); - return 0; -} - -u32 nvmap::IocGetId(const std::vector<u8>& input, std::vector<u8>& output) { - IocGetIdParams params; - std::memcpy(¶ms, input.data(), sizeof(params)); - - LOG_WARNING(Service, "called"); - - auto itr = handles.find(params.handle); - ASSERT(itr != handles.end()); - - params.id = itr->second->id; - - std::memcpy(output.data(), ¶ms, sizeof(params)); - return 0; -} - -u32 nvmap::IocFromId(const std::vector<u8>& input, std::vector<u8>& output) { - IocFromIdParams params; - std::memcpy(¶ms, input.data(), sizeof(params)); - - LOG_WARNING(Service, "(STUBBED) called"); - - auto itr = std::find_if(handles.begin(), handles.end(), - [&](const auto& entry) { return entry.second->id == params.id; }); - ASSERT(itr != handles.end()); - - // Make a new handle for the object - u32 handle = next_handle++; - handles[handle] = itr->second; - - params.handle = handle; - - std::memcpy(output.data(), ¶ms, sizeof(params)); - return 0; -} - -u32 nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) { - enum class ParamTypes { Size = 1, Alignment = 2, Base = 3, Heap = 4, Kind = 5, Compr = 6 }; - - IocParamParams params; - std::memcpy(¶ms, input.data(), sizeof(params)); - - LOG_WARNING(Service, "(STUBBED) called type=%u", params.type); - - auto itr = handles.find(params.handle); - ASSERT(itr != handles.end()); - - auto object = itr->second; - ASSERT(object->status == Object::Status::Allocated); - - switch (static_cast<ParamTypes>(params.type)) { - case ParamTypes::Size: - params.value = object->size; - break; - case ParamTypes::Alignment: - params.value = object->align; - break; - case ParamTypes::Heap: - // TODO(Subv): Seems to be a hardcoded value? - params.value = 0x40000000; - break; - case ParamTypes::Kind: - params.value = object->kind; - break; - default: - ASSERT(false, "Unimplemented"); - } - - std::memcpy(output.data(), ¶ms, sizeof(params)); - return 0; -} - -u32 nvdisp_disp0::ioctl(u32 command, const std::vector<u8>& input, std::vector<u8>& output) { - ASSERT(false, "Unimplemented"); - return 0; -} - -void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u32 height, - u32 stride) { - VAddr addr = nvmap_dev->GetObjectAddress(buffer_handle); - LOG_WARNING(Service, - "Drawing from address %llx offset %08X Width %u Height %u Stride %u Format %u", - addr, offset, width, height, stride, format); -} - void NVDRV_A::Open(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service, "(STUBBED) called"); @@ -229,10 +74,10 @@ NVDRV_A::NVDRV_A() : ServiceFramework("nvdrv:a") { }; RegisterHandlers(functions); - auto nvmap_dev = std::make_shared<nvmap>(); - devices["/dev/nvhost-as-gpu"] = std::make_shared<nvhost_as_gpu>(); + auto nvmap_dev = std::make_shared<Devices::nvmap>(); + devices["/dev/nvhost-as-gpu"] = std::make_shared<Devices::nvhost_as_gpu>(); devices["/dev/nvmap"] = nvmap_dev; - devices["/dev/nvdisp_disp0"] = std::make_shared<nvdisp_disp0>(nvmap_dev); + devices["/dev/nvdisp_disp0"] = std::make_shared<Devices::nvdisp_disp0>(nvmap_dev); } } // namespace NVDRV |