mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-12-28 08:45:29 +03:00
Address CR Comments (#102)
This commit is contained in:
parent
bb2c31264d
commit
4970e58999
@ -115,7 +115,6 @@ namespace skyline {
|
|||||||
*/
|
*/
|
||||||
template<typename TypeVal, typename TypeMul>
|
template<typename TypeVal, typename TypeMul>
|
||||||
constexpr inline TypeVal AlignUp(TypeVal value, TypeMul multiple) {
|
constexpr inline TypeVal AlignUp(TypeVal value, TypeMul multiple) {
|
||||||
static_assert(std::is_integral<TypeVal>() && std::is_integral<TypeMul>());
|
|
||||||
multiple--;
|
multiple--;
|
||||||
return (value + multiple) & ~(multiple);
|
return (value + multiple) & ~(multiple);
|
||||||
}
|
}
|
||||||
@ -130,7 +129,6 @@ namespace skyline {
|
|||||||
*/
|
*/
|
||||||
template<typename TypeVal, typename TypeMul>
|
template<typename TypeVal, typename TypeMul>
|
||||||
constexpr inline TypeVal AlignDown(TypeVal value, TypeMul multiple) {
|
constexpr inline TypeVal AlignDown(TypeVal value, TypeMul multiple) {
|
||||||
static_assert(std::is_integral<TypeVal>() && std::is_integral<TypeMul>());
|
|
||||||
return value & ~(multiple - 1);
|
return value & ~(multiple - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,9 +136,14 @@ namespace skyline {
|
|||||||
* @param value The value to check for alignment
|
* @param value The value to check for alignment
|
||||||
* @param multiple The multiple to check alignment with
|
* @param multiple The multiple to check alignment with
|
||||||
* @return If the address is aligned with the multiple
|
* @return If the address is aligned with the multiple
|
||||||
|
* @note The multiple must be divisible by 2
|
||||||
*/
|
*/
|
||||||
constexpr inline bool IsAligned(u64 value, u64 multiple) {
|
template<typename TypeVal, typename TypeMul>
|
||||||
return !(value & (multiple - 1U));
|
constexpr inline bool IsAligned(TypeVal value, TypeMul multiple) {
|
||||||
|
if ((multiple & (multiple - 1)) == 0)
|
||||||
|
return !(value & (multiple - 1U));
|
||||||
|
else
|
||||||
|
return (value % multiple) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -203,17 +206,17 @@ namespace skyline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Out, typename In>
|
template<typename Out, typename In>
|
||||||
constexpr Out& As(const std::span<In> &span) {
|
constexpr Out &As(std::span<In> span) {
|
||||||
if (span.size_bytes() < sizeof(Out))
|
if (IsAligned(span.size_bytes(), sizeof(Out)))
|
||||||
throw exception("Span size less than Out type size");
|
return *reinterpret_cast<Out *>(span.data());
|
||||||
return *reinterpret_cast<Out*>(span.data());
|
throw exception("Span size not aligned with Out type size (0x{:X}/0x{:X})", span.size_bytes(), sizeof(Out));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Out, typename In>
|
template<typename Out, typename In>
|
||||||
constexpr std::span<Out> AsSpan(const std::span<In> &span) {
|
constexpr std::span<Out> AsSpan(std::span<In> span) {
|
||||||
if (span.size_bytes() < sizeof(Out))
|
if (IsAligned(span.size_bytes(), sizeof(Out)))
|
||||||
throw exception("Span size less than Out type size");
|
return std::span(reinterpret_cast<Out *>(span.data()), span.size_bytes() / sizeof(Out));
|
||||||
return std::span(reinterpret_cast<Out*>(span.data()), span.size_bytes() / sizeof(Out));
|
throw exception("Span size not aligned with Out type size (0x{:X}/0x{:X})", span.size_bytes(), sizeof(Out));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,10 +14,10 @@ namespace skyline::loader {
|
|||||||
u64 roSize = executable.ro.contents.size();
|
u64 roSize = executable.ro.contents.size();
|
||||||
u64 dataSize = executable.data.contents.size() + executable.bssSize;
|
u64 dataSize = executable.data.contents.size() + executable.bssSize;
|
||||||
|
|
||||||
if (!util::IsAligned(textSize, PAGE_SIZE) || !util::IsAligned(roSize, PAGE_SIZE) || !util::IsAligned(dataSize, PAGE_SIZE))
|
if (!util::PageAligned(textSize) || !util::PageAligned(roSize) || !util::PageAligned(dataSize))
|
||||||
throw exception("LoadProcessData: Sections are not aligned with page size: 0x{:X}, 0x{:X}, 0x{:X}", textSize, roSize, dataSize);
|
throw exception("LoadProcessData: Sections are not aligned with page size: 0x{:X}, 0x{:X}, 0x{:X}", textSize, roSize, dataSize);
|
||||||
|
|
||||||
if (!util::IsAligned(executable.text.offset, PAGE_SIZE) || !util::IsAligned(executable.ro.offset, PAGE_SIZE) || !util::IsAligned(executable.data.offset, PAGE_SIZE))
|
if (!util::PageAligned(executable.text.offset) || !util::PageAligned(executable.ro.offset) || !util::PageAligned(executable.data.offset))
|
||||||
throw exception("LoadProcessData: Section offsets are not aligned with page size: 0x{:X}, 0x{:X}, 0x{:X}", executable.text.offset, executable.ro.offset, executable.data.offset);
|
throw exception("LoadProcessData: Section offsets are not aligned with page size: 0x{:X}, 0x{:X}, 0x{:X}", executable.text.offset, executable.ro.offset, executable.data.offset);
|
||||||
|
|
||||||
// The data section will always be the last section in memory, so put the patch section after it
|
// The data section will always be the last section in memory, so put the patch section after it
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <os.h>
|
#include <os.h>
|
||||||
#include <services/hosbinder/GraphicBufferProducer.h>
|
#include <services/hosbinder/GraphicBufferProducer.h>
|
||||||
#include <services/hosbinder/display.h>
|
|
||||||
#include "ISelfController.h"
|
#include "ISelfController.h"
|
||||||
|
|
||||||
namespace skyline::service::am {
|
namespace skyline::service::am {
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#include <services/common/fence.h>
|
#include <services/common/fence.h>
|
||||||
#include <gpu/format.h>
|
#include <gpu/format.h>
|
||||||
#include "GraphicBufferProducer.h"
|
#include "GraphicBufferProducer.h"
|
||||||
#include "display.h"
|
|
||||||
|
|
||||||
namespace skyline::service::hosbinder {
|
namespace skyline::service::hosbinder {
|
||||||
Buffer::Buffer(const GbpBuffer &gbpBuffer, const std::shared_ptr<gpu::PresentationTexture> &texture) : gbpBuffer(gbpBuffer), texture(texture) {}
|
Buffer::Buffer(const GbpBuffer &gbpBuffer, const std::shared_ptr<gpu::PresentationTexture> &texture) : gbpBuffer(gbpBuffer), texture(texture) {}
|
||||||
@ -190,11 +189,21 @@ namespace skyline::service::hosbinder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A mapping from a display's name to it's displayType entry
|
||||||
|
*/
|
||||||
|
static frz::unordered_map<frz::string, DisplayId, 5> DisplayTypeMap{
|
||||||
|
{"Default", DisplayId::Default},
|
||||||
|
{"External", DisplayId::External},
|
||||||
|
{"Edid", DisplayId::Edid},
|
||||||
|
{"Internal", DisplayId::Internal},
|
||||||
|
{"Null", DisplayId::Null},
|
||||||
|
};
|
||||||
|
|
||||||
void GraphicBufferProducer::SetDisplay(const std::string &name) {
|
void GraphicBufferProducer::SetDisplay(const std::string &name) {
|
||||||
try {
|
try {
|
||||||
const auto type = DisplayTypeMap.at(name);
|
|
||||||
if (displayId == DisplayId::Null)
|
if (displayId == DisplayId::Null)
|
||||||
displayId = type;
|
displayId = DisplayTypeMap.at(frz::string(name.data(), name.size()));
|
||||||
else
|
else
|
||||||
throw exception("Trying to change display type from non-null type");
|
throw exception("Trying to change display type from non-null type");
|
||||||
} catch (const std::out_of_range &) {
|
} catch (const std::out_of_range &) {
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <gpu.h>
|
#include <gpu.h>
|
||||||
#include <services/common/parcel.h>
|
#include <services/common/parcel.h>
|
||||||
#include "display.h"
|
|
||||||
|
|
||||||
namespace skyline::service::hosbinder {
|
namespace skyline::service::hosbinder {
|
||||||
/**
|
/**
|
||||||
@ -51,7 +50,24 @@ namespace skyline::service::hosbinder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief nvnflinger:dispdrv or nns::hosbinder::IHOSBinderDriver is responsible for writing buffers to the display
|
* @brief An enumeration of all the possible display IDs (https://switchbrew.org/wiki/Display_services#DisplayName)
|
||||||
|
*/
|
||||||
|
enum class DisplayId : u64 {
|
||||||
|
Default, //!< Refers to the default display used by most applications
|
||||||
|
External, //!< Refers to an external display
|
||||||
|
Edid, //!< Refers to an external display with EDID capabilities
|
||||||
|
Internal, //!< Refers to the the internal display
|
||||||
|
Null, //!< Refers to the null display which is used for discarding data
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class LayerStatus {
|
||||||
|
Uninitialized, //!< The layer hasn't been initialized
|
||||||
|
Stray, //!< The layer has been initialized as a stray layer
|
||||||
|
Managed, //!< The layer has been initialized as a managed layer
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief IGraphicBufferProducer is responsible for presenting buffers to the display as well as compositing and frame pacing (https://android.googlesource.com/platform/frameworks/native/+/8dc5539/libs/gui/IGraphicBufferProducer.cpp)
|
||||||
*/
|
*/
|
||||||
class GraphicBufferProducer {
|
class GraphicBufferProducer {
|
||||||
private:
|
private:
|
||||||
@ -110,7 +126,7 @@ namespace skyline::service::hosbinder {
|
|||||||
Disconnect = 11, //!< https://android.googlesource.com/platform/frameworks/native/+/8dc5539/libs/gui/IGraphicBufferProducer.cpp#396
|
Disconnect = 11, //!< https://android.googlesource.com/platform/frameworks/native/+/8dc5539/libs/gui/IGraphicBufferProducer.cpp#396
|
||||||
SetSidebandStream = 12, //!< https://android.googlesource.com/platform/frameworks/native/+/8dc5539/libs/gui/IGraphicBufferProducer.cpp#403
|
SetSidebandStream = 12, //!< https://android.googlesource.com/platform/frameworks/native/+/8dc5539/libs/gui/IGraphicBufferProducer.cpp#403
|
||||||
AllocateBuffers = 13, //!< https://android.googlesource.com/platform/frameworks/native/+/8dc5539/libs/gui/IGraphicBufferProducer.cpp#413
|
AllocateBuffers = 13, //!< https://android.googlesource.com/platform/frameworks/native/+/8dc5539/libs/gui/IGraphicBufferProducer.cpp#413
|
||||||
SetPreallocatedBuffer = 14, //!< No source on this but it's used to set a existing buffer according to libtransistor and libNX
|
SetPreallocatedBuffer = 14, //!< No source on this but it's used to set a existing buffer according to libtransistor and libnx
|
||||||
};
|
};
|
||||||
|
|
||||||
GraphicBufferProducer(const DeviceState &state);
|
GraphicBufferProducer(const DeviceState &state);
|
||||||
|
@ -10,7 +10,7 @@ namespace skyline::service::hosbinder {
|
|||||||
class GraphicBufferProducer;
|
class GraphicBufferProducer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief nvnflinger:dispdrv or nns::hosbinder::IHOSBinderDriver is responsible for writing buffers to the display
|
* @brief nvnflinger:dispdrv or nns::hosbinder::IHOSBinderDriver is a translation layer between Android Binder IPC and HOS IPC to communicate with the Android display stack
|
||||||
*/
|
*/
|
||||||
class IHOSBinderDriver : public BaseService {
|
class IHOSBinderDriver : public BaseService {
|
||||||
private:
|
private:
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
|
||||||
// Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/)
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
#include <services/common/parcel.h>
|
|
||||||
#include <services/nvdrv/devices/nvmap.h>
|
|
||||||
#include <gpu.h>
|
|
||||||
|
|
||||||
namespace skyline::service::hosbinder {
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
// SPDX-License-Identifier: MPL-2.0
|
|
||||||
// Copyright © 2020 Skyline Team and Contributors (https://github.com/skyline-emu/)
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <common.h>
|
|
||||||
|
|
||||||
namespace skyline::service::hosbinder {
|
|
||||||
/**
|
|
||||||
* @brief An enumeration of all the possible display IDs (https://switchbrew.org/wiki/Display_services#DisplayName)
|
|
||||||
*/
|
|
||||||
enum class DisplayId : u64 {
|
|
||||||
Default, //!< Refers to the default display used by most applications
|
|
||||||
External, //!< Refers to an external display
|
|
||||||
Edid, //!< Refers to an external display with EDID capabilities
|
|
||||||
Internal, //!< Refers to the the internal display
|
|
||||||
Null, //!< Refers to the null display which is used for discarding data
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief A mapping from a display's name to it's displayType entry
|
|
||||||
*/
|
|
||||||
static const std::unordered_map<std::string, DisplayId> DisplayTypeMap{
|
|
||||||
{"Default", DisplayId::Default},
|
|
||||||
{"External", DisplayId::External},
|
|
||||||
{"Edid", DisplayId::Edid},
|
|
||||||
{"Internal", DisplayId::Internal},
|
|
||||||
{"Null", DisplayId::Null},
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief The status of a display layer
|
|
||||||
*/
|
|
||||||
enum class LayerStatus {
|
|
||||||
Uninitialized, //!< The layer hasn't been initialized
|
|
||||||
Stray, //!< The layer has been initialized as a stray layer
|
|
||||||
Managed, //!< The layer has been initialized as a managed layer
|
|
||||||
};
|
|
||||||
}
|
|
@ -18,19 +18,20 @@ namespace skyline::service::nvdrv::device {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NvStatus NvDevice::HandleIoctl(u32 cmd, IoctlType type, std::span<u8> buffer, std::span<u8> inlineBuffer) {
|
NvStatus NvDevice::HandleIoctl(u32 cmd, IoctlType type, std::span<u8> buffer, std::span<u8> inlineBuffer) {
|
||||||
|
std::string_view typeString{[type] {
|
||||||
|
switch (type) {
|
||||||
|
case IoctlType::Ioctl:
|
||||||
|
return "IOCTL";
|
||||||
|
case IoctlType::Ioctl2:
|
||||||
|
return "IOCTL2";
|
||||||
|
case IoctlType::Ioctl3:
|
||||||
|
return "IOCTL3";
|
||||||
|
}
|
||||||
|
}()};
|
||||||
|
|
||||||
std::pair<std::function<NvStatus(IoctlType, std::span<u8>, std::span<u8>)>, std::string_view> function;
|
std::pair<std::function<NvStatus(IoctlType, std::span<u8>, std::span<u8>)>, std::string_view> function;
|
||||||
try {
|
try {
|
||||||
function = GetIoctlFunction(cmd);
|
function = GetIoctlFunction(cmd);
|
||||||
std::string_view typeString{[type] {
|
|
||||||
switch (type) {
|
|
||||||
case IoctlType::Ioctl:
|
|
||||||
return "IOCTL";
|
|
||||||
case IoctlType::Ioctl2:
|
|
||||||
return "IOCTL2";
|
|
||||||
case IoctlType::Ioctl3:
|
|
||||||
return "IOCTL3";
|
|
||||||
}
|
|
||||||
}()};
|
|
||||||
state.logger->Debug("{} @ {}: {}", typeString, GetName(), function.second);
|
state.logger->Debug("{} @ {}: {}", typeString, GetName(), function.second);
|
||||||
} catch (std::out_of_range &) {
|
} catch (std::out_of_range &) {
|
||||||
state.logger->Warn("Cannot find IOCTL for device '{}': 0x{:X}", GetName(), cmd);
|
state.logger->Warn("Cannot find IOCTL for device '{}': 0x{:X}", GetName(), cmd);
|
||||||
@ -39,8 +40,7 @@ namespace skyline::service::nvdrv::device {
|
|||||||
try {
|
try {
|
||||||
return function.first(type, buffer, inlineBuffer);
|
return function.first(type, buffer, inlineBuffer);
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
throw exception("{} (Device: {})", e.what(), GetName());
|
throw exception("{} ({} @ {}: {})", e.what(), typeString, GetName(), function.second);
|
||||||
}
|
}
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@ namespace skyline::service::nvdrv {
|
|||||||
class Driver {
|
class Driver {
|
||||||
private:
|
private:
|
||||||
const DeviceState &state;
|
const DeviceState &state;
|
||||||
std::vector<std::shared_ptr<device::NvDevice>> devices; //!< A map from an FD to a shared pointer to it's NvDevice object
|
std::vector<std::shared_ptr<device::NvDevice>> devices; //!< A vector of shared pointers to NvDevice object that correspond to FDs
|
||||||
u32 fdIndex{}; //!< The index of a file descriptor
|
u32 fdIndex{}; //!< The next file descriptor to assign
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NvHostSyncpoint hostSyncpoint;
|
NvHostSyncpoint hostSyncpoint;
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <os.h>
|
#include <os.h>
|
||||||
#include <services/hosbinder/GraphicBufferProducer.h>
|
#include <services/hosbinder/GraphicBufferProducer.h>
|
||||||
#include <services/hosbinder/display.h>
|
|
||||||
#include "IDisplayService.h"
|
#include "IDisplayService.h"
|
||||||
|
|
||||||
namespace skyline::service::visrv {
|
namespace skyline::service::visrv {
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <os.h>
|
#include <os.h>
|
||||||
#include <services/hosbinder/GraphicBufferProducer.h>
|
#include <services/hosbinder/GraphicBufferProducer.h>
|
||||||
#include <services/hosbinder/display.h>
|
|
||||||
#include "IManagerDisplayService.h"
|
#include "IManagerDisplayService.h"
|
||||||
|
|
||||||
namespace skyline::service::visrv {
|
namespace skyline::service::visrv {
|
||||||
|
Loading…
Reference in New Issue
Block a user