early-access version 3166
This commit is contained in:
parent
16daf3faf8
commit
c7b0ae563c
15 changed files with 119 additions and 96 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace Service::android {
|
|||
|
||||
class IProducerListener {
|
||||
public:
|
||||
virtual ~IProducerListener() = default;
|
||||
virtual void OnBufferReleased() = 0;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue