From 34ae2ec644f49b04d6c6b82742812b6a8a3ef8b5 Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 8 Jan 2018 21:30:22 -0500 Subject: NV: Expose the nvdisp_disp0 device and a weak reference to the nvdrv:a service. NVFlinger will call into the nvdisp_disp0 device to perform screen flips, bypassing the ioctl interface. We now have the address of the framebuffer to draw, we just need to actually put it on the screen. --- src/core/hle/service/nvdrv/nvdrv.h | 94 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) (limited to 'src/core/hle/service/nvdrv/nvdrv.h') diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h index a8f305d33..fd59c1dba 100644 --- a/src/core/hle/service/nvdrv/nvdrv.h +++ b/src/core/hle/service/nvdrv/nvdrv.h @@ -4,6 +4,8 @@ #pragma once +#include +#include #include #include "common/common_types.h" #include "core/hle/service/service.h" @@ -18,6 +20,98 @@ public: virtual u32 ioctl(u32 command, const std::vector& input, std::vector& output) = 0; }; +class nvmap : public nvdevice { +public: + /// Returns the allocated address of an nvmap object given its handle. + VAddr GetObjectAddress(u32 handle) const; + + u32 ioctl(u32 command, const std::vector& input, std::vector& output) override; +private: + // Represents an nvmap object. + struct Object { + enum class Status { Created, Allocated }; + u32 id; + u32 size; + u32 flags; + u32 align; + u8 kind; + VAddr addr; + Status status; + }; + + u32 next_handle = 1; + u32 next_id = 1; + std::unordered_map> handles; + + enum IoctlCommands { + IocCreateCommand = 0xC0080101, + IocFromIdCommand = 0xC0080103, + IocAllocCommand = 0xC0200104, + IocParamCommand = 0xC00C0109, + IocGetIdCommand = 0xC008010E + }; + + struct IocCreateParams { + // Input + u32_le size; + // Output + u32_le handle; + }; + + struct IocAllocParams { + // Input + u32_le handle; + u32_le heap_mask; + u32_le flags; + u32_le align; + u8 kind; + INSERT_PADDING_BYTES(7); + u64_le addr; + }; + + struct IocGetIdParams { + // Output + u32_le id; + // Input + u32_le handle; + }; + + struct IocFromIdParams { + // Input + u32_le id; + // Output + u32_le handle; + }; + + struct IocParamParams { + // Input + u32_le handle; + u32_le type; + // Output + u32_le value; + }; + + u32 IocCreate(const std::vector& input, std::vector& output); + u32 IocAlloc(const std::vector& input, std::vector& output); + u32 IocGetId(const std::vector& input, std::vector& output); + u32 IocFromId(const std::vector& input, std::vector& output); + u32 IocParam(const std::vector& input, std::vector& output); +}; + +class nvdisp_disp0 : public nvdevice { +public: + nvdisp_disp0(std::shared_ptr nvmap_dev) : nvdevice(), nvmap_dev(std::move(nvmap_dev)) {} + ~nvdisp_disp0() = default; + + u32 ioctl(u32 command, const std::vector& input, std::vector& output) override; + + /// Performs a screen flip, drawing the buffer pointed to by the handle. + void flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u32 height, u32 stride); + +private: + std::shared_ptr nvmap_dev; +}; + /// Registers all NVDRV services with the specified service manager. void InstallInterfaces(SM::ServiceManager& service_manager); -- cgit v1.2.3