early-access version 3166

This commit is contained in:
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 yuzu emulator early access
============= =============
This is the source code for early-access 3165. This is the source code for early-access 3166.
## Legal Notice ## Legal Notice

View file

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

View file

@ -28,13 +28,15 @@ SyncpointManager::SyncpointManager(Tegra::Host1x::Host1x& host1x_) : host1x{host
SyncpointManager::~SyncpointManager() = default; SyncpointManager::~SyncpointManager() = default;
u32 SyncpointManager::ReserveSyncpoint(u32 id, bool client_managed) { 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"); ASSERT_MSG(false, "Requested syncpoint is in use");
return 0; return 0;
} }
syncpoints.at(id).reserved = true; syncpoint.reserved = true;
syncpoints.at(id).interface_managed = client_managed; syncpoint.interface_managed = client_managed;
return id; return id;
} }
@ -56,11 +58,12 @@ u32 SyncpointManager::AllocateSyncpoint(bool client_managed) {
void SyncpointManager::FreeSyncpoint(u32 id) { void SyncpointManager::FreeSyncpoint(u32 id) {
std::lock_guard lock(reservation_lock); std::lock_guard lock(reservation_lock);
ASSERT(syncpoints.at(id).reserved); auto& syncpoint = syncpoints.at(id);
syncpoints.at(id).reserved = false; ASSERT(syncpoint.reserved);
syncpoint.reserved = false;
} }
bool SyncpointManager::IsSyncpointAllocated(u32 id) { bool SyncpointManager::IsSyncpointAllocated(u32 id) const {
return (id <= SyncpointCount) && syncpoints[id].reserved; return (id <= SyncpointCount) && syncpoints[id].reserved;
} }
@ -69,7 +72,7 @@ bool SyncpointManager::HasSyncpointExpired(u32 id, u32 threshold) const {
if (!syncpoint.reserved) { if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return 0; return false;
} }
// If the interface manages counters then we don't keep track of the maximum value as it handles // 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) { u32 SyncpointManager::IncrementSyncpointMaxExt(u32 id, u32 amount) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return 0; return 0;
} }
return syncpoints.at(id).counter_max += amount; return syncpoint.counter_max += amount;
} }
u32 SyncpointManager::ReadSyncpointMinValue(u32 id) { u32 SyncpointManager::ReadSyncpointMinValue(u32 id) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return 0; return 0;
} }
return syncpoints.at(id).counter_min; return syncpoint.counter_min;
} }
u32 SyncpointManager::UpdateMin(u32 id) { u32 SyncpointManager::UpdateMin(u32 id) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return 0; return 0;
} }
syncpoints.at(id).counter_min = host1x.GetSyncpointManager().GetHostSyncpointValue(id); syncpoint.counter_min = host1x.GetSyncpointManager().GetHostSyncpointValue(id);
return syncpoints.at(id).counter_min; return syncpoint.counter_min;
} }
NvFence SyncpointManager::GetSyncpointFence(u32 id) { NvFence SyncpointManager::GetSyncpointFence(u32 id) {
if (!syncpoints.at(id).reserved) { auto& syncpoint = syncpoints.at(id);
if (!syncpoint.reserved) {
ASSERT(false); ASSERT(false);
return NvFence{}; 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 } // 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 * @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 * @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) Module::Module(Core::System& system)
: container{system.Host1x()}, service_context{system, "nvdrv"}, events_interface{*this} { : container{system.Host1x()}, service_context{system, "nvdrv"}, events_interface{*this} {
builders["/dev/nvhost-as-gpu"] = [this, &system](DeviceFD fd) { builders["/dev/nvhost-as-gpu"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvhost_as_gpu>(system, *this, container);
std::make_shared<Devices::nvhost_as_gpu>(system, *this, container); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
builders["/dev/nvhost-gpu"] = [this, &system](DeviceFD fd) { builders["/dev/nvhost-gpu"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvhost_gpu>(system, events_interface, container);
std::make_shared<Devices::nvhost_gpu>(system, events_interface, container); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
builders["/dev/nvhost-ctrl-gpu"] = [this, &system](DeviceFD fd) { builders["/dev/nvhost-ctrl-gpu"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvhost_ctrl_gpu>(system, events_interface);
std::make_shared<Devices::nvhost_ctrl_gpu>(system, events_interface); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
builders["/dev/nvmap"] = [this, &system](DeviceFD fd) { builders["/dev/nvmap"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvmap>(system, container);
std::make_shared<Devices::nvmap>(system, container); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
builders["/dev/nvdisp_disp0"] = [this, &system](DeviceFD fd) { builders["/dev/nvdisp_disp0"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvdisp_disp0>(system, container);
std::make_shared<Devices::nvdisp_disp0>(system, container); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
builders["/dev/nvhost-ctrl"] = [this, &system](DeviceFD fd) { builders["/dev/nvhost-ctrl"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvhost_ctrl>(system, events_interface, container);
std::make_shared<Devices::nvhost_ctrl>(system, events_interface, container); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
builders["/dev/nvhost-nvdec"] = [this, &system](DeviceFD fd) { builders["/dev/nvhost-nvdec"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvhost_nvdec>(system, container);
std::make_shared<Devices::nvhost_nvdec>(system, container); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
builders["/dev/nvhost-nvjpg"] = [this, &system](DeviceFD fd) { builders["/dev/nvhost-nvjpg"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = std::make_shared<Devices::nvhost_nvjpg>(system); auto device = std::make_shared<Devices::nvhost_nvjpg>(system);
return open_files.emplace(fd, device).first; return open_files.emplace(fd, std::move(device)).first;
}; };
builders["/dev/nvhost-vic"] = [this, &system](DeviceFD fd) { builders["/dev/nvhost-vic"] = [this, &system](DeviceFD fd) {
std::shared_ptr<Devices::nvdevice> device = auto device = std::make_shared<Devices::nvhost_vic>(system, container);
std::make_shared<Devices::nvhost_vic>(system, container); return open_files.emplace(fd, std::move(device)).first;
return open_files.emplace(fd, device).first;
}; };
} }

View file

@ -39,7 +39,7 @@ Status BufferItemConsumer::AcquireBuffer(BufferItem* item, std::chrono::nanoseco
return Status::NoError; 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}; std::scoped_lock lock{mutex};
if (const auto status = AddReleaseFenceLocked(item.buf, item.graphic_buffer, release_fence); 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); explicit BufferItemConsumer(std::unique_ptr<BufferQueueConsumer> consumer);
Status AcquireBuffer(BufferItem* item, std::chrono::nanoseconds present_when, Status AcquireBuffer(BufferItem* item, std::chrono::nanoseconds present_when,
bool wait_for_fence = true); 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 } // namespace Service::android

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1048,22 +1048,19 @@ void Config::SaveMotionTouchValues() {
WriteBasicSetting(Settings::values.udp_input_servers); WriteBasicSetting(Settings::values.udp_input_servers);
WriteBasicSetting(Settings::values.enable_udp_controller); WriteBasicSetting(Settings::values.enable_udp_controller);
if (Settings::values.touch_from_button_maps.empty()) {
return;
}
qt_config->beginWriteArray(QStringLiteral("touch_from_button_maps")); qt_config->beginWriteArray(QStringLiteral("touch_from_button_maps"));
for (std::size_t p = 0; p < Settings::values.touch_from_button_maps.size(); ++p) { 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)); 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")); QStringLiteral("default"));
qt_config->beginWriteArray(QStringLiteral("entries")); 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)); 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(); qt_config->endArray();
} }

View file

@ -30,7 +30,7 @@
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item> <item>
<widget class="QWidget" name="player_1" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -65,7 +65,7 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="player_2" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -100,7 +100,7 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="player_3" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -135,7 +135,7 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="player_4" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -170,7 +170,7 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="player_5" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -205,7 +205,7 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="player_6" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -240,7 +240,7 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="player_7" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>
@ -275,7 +275,7 @@
</item> </item>
<item> <item>
<widget class="QWidget" name="player_8" native="true"> <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"> <property name="leftMargin">
<number>0</number> <number>0</number>
</property> </property>