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
|
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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ namespace Service::android {
|
||||||
|
|
||||||
class IProducerListener {
|
class IProducerListener {
|
||||||
public:
|
public:
|
||||||
|
virtual ~IProducerListener() = default;
|
||||||
virtual void OnBufferReleased() = 0;
|
virtual void OnBufferReleased() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue