early-access version 3166

main
pineappleEA 2022-11-29 16:18:39 +01:00
parent 16daf3faf8
commit c7b0ae563c
15 changed files with 119 additions and 96 deletions

View File

@ -1,7 +1,7 @@
yuzu emulator early access
=============
This is the source code for early-access 3165.
This is the source code for early-access 3166.
## Legal Notice

View File

@ -129,6 +129,9 @@ static_assert(sizeof(NifmNetworkProfileData) == 0x18E,
"NifmNetworkProfileData has incorrect size.");
#pragma pack(pop)
constexpr Result ResultPendingConnection{ErrorModule::NIFM, 111};
constexpr Result ResultNetworkCommunicationDisabled{ErrorModule::NIFM, 1111};
class IScanRequest final : public ServiceFramework<IScanRequest> {
public:
explicit IScanRequest(Core::System& system_) : ServiceFramework{system_, "IScanRequest"} {
@ -192,6 +195,10 @@ private:
void Submit(Kernel::HLERequestContext& ctx) {
LOG_WARNING(Service_NIFM, "(STUBBED) called");
if (state == RequestState::NotSubmitted) {
UpdateState(RequestState::Pending);
}
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
@ -201,19 +208,32 @@ private:
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
if (Network::GetHostIPv4Address().has_value()) {
rb.PushEnum(RequestState::Connected);
} else {
rb.PushEnum(RequestState::NotSubmitted);
}
rb.PushEnum(state);
}
void GetResult(Kernel::HLERequestContext& ctx) {
LOG_WARNING(Service_NIFM, "(STUBBED) called");
const auto result = [this] {
const auto has_connection = Network::GetHostIPv4Address().has_value();
switch (state) {
case RequestState::NotSubmitted:
return has_connection ? ResultSuccess : ResultNetworkCommunicationDisabled;
case RequestState::Pending:
if (has_connection) {
UpdateState(RequestState::Connected);
} else {
UpdateState(RequestState::Error);
}
return ResultPendingConnection;
case RequestState::Connected:
default:
return ResultSuccess;
}
}();
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
rb.Push(result);
}
void GetSystemEventReadableHandles(Kernel::HLERequestContext& ctx) {
@ -252,8 +272,15 @@ private:
rb.Push<u32>(0);
}
void UpdateState(RequestState new_state) {
state = new_state;
event1->Signal();
}
KernelHelpers::ServiceContext service_context;
RequestState state;
Kernel::KEvent* event1;
Kernel::KEvent* event2;
};

View File

@ -28,13 +28,15 @@ SyncpointManager::SyncpointManager(Tegra::Host1x::Host1x& host1x_) : host1x{host
SyncpointManager::~SyncpointManager() = default;
u32 SyncpointManager::ReserveSyncpoint(u32 id, bool client_managed) {
if (syncpoints.at(id).reserved) {
auto& syncpoint = syncpoints.at(id);
if (syncpoint.reserved) {
ASSERT_MSG(false, "Requested syncpoint is in use");
return 0;
}
syncpoints.at(id).reserved = true;
syncpoints.at(id).interface_managed = client_managed;
syncpoint.reserved = true;
syncpoint.interface_managed = client_managed;
return id;
}
@ -56,11 +58,12 @@ u32 SyncpointManager::AllocateSyncpoint(bool client_managed) {
void SyncpointManager::FreeSyncpoint(u32 id) {
std::lock_guard lock(reservation_lock);
ASSERT(syncpoints.at(id).reserved);
syncpoints.at(id).reserved = false;
auto& syncpoint = syncpoints.at(id);
ASSERT(syncpoint.reserved);
syncpoint.reserved = false;
}
bool SyncpointManager::IsSyncpointAllocated(u32 id) {
bool SyncpointManager::IsSyncpointAllocated(u32 id) const {
return (id <= SyncpointCount) && syncpoints[id].reserved;
}
@ -69,7 +72,7 @@ bool SyncpointManager::HasSyncpointExpired(u32 id, u32 threshold) const {
if (!syncpoint.reserved) {
ASSERT(false);
return 0;
return false;
}
// If the interface manages counters then we don't keep track of the maximum value as it handles
@ -82,40 +85,51 @@ bool SyncpointManager::HasSyncpointExpired(u32 id, u32 threshold) const {
}
u32 SyncpointManager::IncrementSyncpointMaxExt(u32 id, u32 amount) {
if (!syncpoints.at(id).reserved) {
auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false);
return 0;
}
return syncpoints.at(id).counter_max += amount;
return syncpoint.counter_max += amount;
}
u32 SyncpointManager::ReadSyncpointMinValue(u32 id) {
if (!syncpoints.at(id).reserved) {
auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false);
return 0;
}
return syncpoints.at(id).counter_min;
return syncpoint.counter_min;
}
u32 SyncpointManager::UpdateMin(u32 id) {
if (!syncpoints.at(id).reserved) {
auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false);
return 0;
}
syncpoints.at(id).counter_min = host1x.GetSyncpointManager().GetHostSyncpointValue(id);
return syncpoints.at(id).counter_min;
syncpoint.counter_min = host1x.GetSyncpointManager().GetHostSyncpointValue(id);
return syncpoint.counter_min;
}
NvFence SyncpointManager::GetSyncpointFence(u32 id) {
if (!syncpoints.at(id).reserved) {
auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false);
return NvFence{};
}
return {.id = static_cast<s32>(id), .value = syncpoints.at(id).counter_max};
return {
.id = static_cast<s32>(id),
.value = syncpoint.counter_max,
};
}
} // namespace Service::Nvidia::NvCore

View File

@ -44,7 +44,7 @@ public:
/**
* @brief Checks if the given syncpoint is both allocated and below the number of HW syncpoints
*/
bool IsSyncpointAllocated(u32 id);
bool IsSyncpointAllocated(u32 id) const;
/**
* @brief Finds a free syncpoint and reserves it

View File

@ -55,48 +55,40 @@ void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger
Module::Module(Core::System& system)
: container{system.Host1x()}, service_context{system, "nvdrv"}, events_interface{*this} {
builders["/dev/nvhost-as-gpu"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvhost_as_gpu>(system, *this, container);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvhost_as_gpu>(system, *this, container);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvhost-gpu"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvhost_gpu>(system, events_interface, container);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvhost_gpu>(system, events_interface, container);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvhost-ctrl-gpu"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvhost_ctrl_gpu>(system, events_interface);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvhost_ctrl_gpu>(system, events_interface);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvmap"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvmap>(system, container);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvmap>(system, container);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvdisp_disp0"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvdisp_disp0>(system, container);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvdisp_disp0>(system, container);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvhost-ctrl"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvhost_ctrl>(system, events_interface, container);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvhost_ctrl>(system, events_interface, container);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvhost-nvdec"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvhost_nvdec>(system, container);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvhost_nvdec>(system, container);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvhost-nvjpg"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = std::make_shared<Devices::nvhost_nvjpg>(system);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvhost_nvjpg>(system);
return open_files.emplace(fd, std::move(device)).first;
};
builders["/dev/nvhost-vic"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device =
std::make_shared<Devices::nvhost_vic>(system, container);
return open_files.emplace(fd, device).first;
auto device = std::make_shared<Devices::nvhost_vic>(system, container);
return open_files.emplace(fd, std::move(device)).first;
};
}

View File

@ -39,7 +39,7 @@ Status BufferItemConsumer::AcquireBuffer(BufferItem* item, std::chrono::nanoseco
return Status::NoError;
}
Status BufferItemConsumer::ReleaseBuffer(const BufferItem& item, Fence& release_fence) {
Status BufferItemConsumer::ReleaseBuffer(const BufferItem& item, const Fence& release_fence) {
std::scoped_lock lock{mutex};
if (const auto status = AddReleaseFenceLocked(item.buf, item.graphic_buffer, release_fence);

View File

@ -22,7 +22,7 @@ public:
explicit BufferItemConsumer(std::unique_ptr<BufferQueueConsumer> consumer);
Status AcquireBuffer(BufferItem* item, std::chrono::nanoseconds present_when,
bool wait_for_fence = true);
Status ReleaseBuffer(const BufferItem& item, Fence& release_fence);
Status ReleaseBuffer(const BufferItem& item, const Fence& release_fence);
};
} // namespace Service::android

View File

@ -169,7 +169,7 @@ Status BufferQueueConsumer::Connect(std::shared_ptr<IConsumerListener> consumer_
return Status::NoInit;
}
core->consumer_listener = consumer_listener;
core->consumer_listener = std::move(consumer_listener);
core->consumer_controlled_by_app = controlled_by_app;
return Status::NoError;

View File

@ -83,7 +83,7 @@ Status ConsumerBase::AcquireBufferLocked(BufferItem* item, std::chrono::nanoseco
}
Status ConsumerBase::AddReleaseFenceLocked(s32 slot,
const std::shared_ptr<GraphicBuffer> graphic_buffer,
const std::shared_ptr<GraphicBuffer>& graphic_buffer,
const Fence& fence) {
LOG_DEBUG(Service_NVFlinger, "slot={}", slot);
@ -100,7 +100,7 @@ Status ConsumerBase::AddReleaseFenceLocked(s32 slot,
}
Status ConsumerBase::ReleaseBufferLocked(s32 slot,
const std::shared_ptr<GraphicBuffer> graphic_buffer) {
const std::shared_ptr<GraphicBuffer>& graphic_buffer) {
// If consumer no longer tracks this graphic_buffer (we received a new
// buffer on the same slot), the buffer producer is definitely no longer
// tracking it.
@ -121,7 +121,7 @@ Status ConsumerBase::ReleaseBufferLocked(s32 slot,
}
bool ConsumerBase::StillTracking(s32 slot,
const std::shared_ptr<GraphicBuffer> graphic_buffer) const {
const std::shared_ptr<GraphicBuffer>& graphic_buffer) const {
if (slot < 0 || slot >= BufferQueueDefs::NUM_BUFFER_SLOTS) {
return false;
}

View File

@ -27,18 +27,18 @@ public:
protected:
explicit ConsumerBase(std::unique_ptr<BufferQueueConsumer> consumer_);
virtual ~ConsumerBase();
~ConsumerBase() override;
virtual void OnFrameAvailable(const BufferItem& item) override;
virtual void OnFrameReplaced(const BufferItem& item) override;
virtual void OnBuffersReleased() override;
virtual void OnSidebandStreamChanged() override;
void OnFrameAvailable(const BufferItem& item) override;
void OnFrameReplaced(const BufferItem& item) override;
void OnBuffersReleased() override;
void OnSidebandStreamChanged() override;
void FreeBufferLocked(s32 slot_index);
Status AcquireBufferLocked(BufferItem* item, std::chrono::nanoseconds present_when);
Status ReleaseBufferLocked(s32 slot, const std::shared_ptr<GraphicBuffer> graphic_buffer);
bool StillTracking(s32 slot, const std::shared_ptr<GraphicBuffer> graphic_buffer) const;
Status AddReleaseFenceLocked(s32 slot, const std::shared_ptr<GraphicBuffer> graphic_buffer,
Status ReleaseBufferLocked(s32 slot, const std::shared_ptr<GraphicBuffer>& graphic_buffer);
bool StillTracking(s32 slot, const std::shared_ptr<GraphicBuffer>& graphic_buffer) const;
Status AddReleaseFenceLocked(s32 slot, const std::shared_ptr<GraphicBuffer>& graphic_buffer,
const Fence& fence);
struct Slot final {

View File

@ -307,8 +307,7 @@ void NVFlinger::Compose() {
swap_interval = buffer.swap_interval;
auto fence = android::Fence::NoFence();
layer.GetConsumer().ReleaseBuffer(buffer, fence);
layer.GetConsumer().ReleaseBuffer(buffer, android::Fence::NoFence());
}
}

View File

@ -10,6 +10,7 @@ namespace Service::android {
class IProducerListener {
public:
virtual ~IProducerListener() = default;
virtual void OnBufferReleased() = 0;
};

View File

@ -214,23 +214,16 @@ PixelFormat PixelFormatFromGPUPixelFormat(Service::android::PixelFormat format)
}
SurfaceType GetFormatType(PixelFormat pixel_format) {
if (static_cast<std::size_t>(pixel_format) <
static_cast<std::size_t>(PixelFormat::MaxColorFormat)) {
if (pixel_format < PixelFormat::MaxColorFormat) {
return SurfaceType::ColorTexture;
}
if (static_cast<std::size_t>(pixel_format) <
static_cast<std::size_t>(PixelFormat::MaxDepthFormat)) {
if (pixel_format < PixelFormat::MaxDepthFormat) {
return SurfaceType::Depth;
}
if (static_cast<std::size_t>(pixel_format) <
static_cast<std::size_t>(PixelFormat::MaxStencilFormat)) {
if (pixel_format < PixelFormat::MaxStencilFormat) {
return SurfaceType::Stencil;
}
if (static_cast<std::size_t>(pixel_format) <
static_cast<std::size_t>(PixelFormat::MaxDepthStencilFormat)) {
if (pixel_format < PixelFormat::MaxDepthStencilFormat) {
return SurfaceType::DepthStencil;
}

View File

@ -1048,22 +1048,19 @@ void Config::SaveMotionTouchValues() {
WriteBasicSetting(Settings::values.udp_input_servers);
WriteBasicSetting(Settings::values.enable_udp_controller);
if (Settings::values.touch_from_button_maps.empty()) {
return;
}
qt_config->beginWriteArray(QStringLiteral("touch_from_button_maps"));
for (std::size_t p = 0; p < Settings::values.touch_from_button_maps.size(); ++p) {
const auto& map = Settings::values.touch_from_button_maps[p];
if (map.buttons.empty()) {
continue;
}
qt_config->setArrayIndex(static_cast<int>(p));
WriteSetting(QStringLiteral("name"), QString::fromStdString(map.name),
WriteSetting(QStringLiteral("name"),
QString::fromStdString(Settings::values.touch_from_button_maps[p].name),
QStringLiteral("default"));
qt_config->beginWriteArray(QStringLiteral("entries"));
for (std::size_t q = 0; q < map.buttons.size(); ++q) {
for (std::size_t q = 0; q < Settings::values.touch_from_button_maps[p].buttons.size();
++q) {
qt_config->setArrayIndex(static_cast<int>(q));
WriteSetting(QStringLiteral("bind"), QString::fromStdString(map.buttons[q]));
WriteSetting(
QStringLiteral("bind"),
QString::fromStdString(Settings::values.touch_from_button_maps[p].buttons[q]));
}
qt_config->endArray();
}

View File

@ -30,7 +30,7 @@
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QWidget" name="player_1" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_1">
<property name="leftMargin">
<number>0</number>
</property>
@ -65,7 +65,7 @@
</item>
<item>
<widget class="QWidget" name="player_2" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_2">
<property name="leftMargin">
<number>0</number>
</property>
@ -100,7 +100,7 @@
</item>
<item>
<widget class="QWidget" name="player_3" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_3">
<property name="leftMargin">
<number>0</number>
</property>
@ -135,7 +135,7 @@
</item>
<item>
<widget class="QWidget" name="player_4" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_4">
<property name="leftMargin">
<number>0</number>
</property>
@ -170,7 +170,7 @@
</item>
<item>
<widget class="QWidget" name="player_5" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_5">
<property name="leftMargin">
<number>0</number>
</property>
@ -205,7 +205,7 @@
</item>
<item>
<widget class="QWidget" name="player_6" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_6">
<property name="leftMargin">
<number>0</number>
</property>
@ -240,7 +240,7 @@
</item>
<item>
<widget class="QWidget" name="player_7" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_7">
<property name="leftMargin">
<number>0</number>
</property>
@ -275,7 +275,7 @@
</item>
<item>
<widget class="QWidget" name="player_8" native="true">
<layout class="QHBoxLayout" name="input_profile_layout">
<layout class="QHBoxLayout" name="input_profile_layout_8">
<property name="leftMargin">
<number>0</number>
</property>