mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-22 19:00:14 -05:00
hle: service: vi: Implement BufferQueue::CancelBuffer.
- This is used by Super Mario 3D All-Stars.
This commit is contained in:
parent
ca416a0fb8
commit
1f186f34a2
3 changed files with 53 additions and 14 deletions
|
@ -99,6 +99,20 @@ void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform,
|
||||||
queue_sequence.push_back(slot);
|
queue_sequence.push_back(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence) {
|
||||||
|
const auto itr = std::find_if(queue.begin(), queue.end(),
|
||||||
|
[slot](const Buffer& buffer) { return buffer.slot == slot; });
|
||||||
|
ASSERT(itr != queue.end());
|
||||||
|
ASSERT(itr->status != Buffer::Status::Free);
|
||||||
|
itr->status = Buffer::Status::Free;
|
||||||
|
itr->multi_fence = multi_fence;
|
||||||
|
itr->swap_interval = 0;
|
||||||
|
|
||||||
|
free_buffers.push_back(slot);
|
||||||
|
|
||||||
|
buffer_wait_event.writable->Signal();
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
|
std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
|
||||||
auto itr = queue.end();
|
auto itr = queue.end();
|
||||||
// Iterate to find a queued buffer matching the requested slot.
|
// Iterate to find a queued buffer matching the requested slot.
|
||||||
|
|
|
@ -95,6 +95,7 @@ public:
|
||||||
void QueueBuffer(u32 slot, BufferTransformFlags transform,
|
void QueueBuffer(u32 slot, BufferTransformFlags transform,
|
||||||
const Common::Rectangle<int>& crop_rect, u32 swap_interval,
|
const Common::Rectangle<int>& crop_rect, u32 swap_interval,
|
||||||
Service::Nvidia::MultiFence& multi_fence);
|
Service::Nvidia::MultiFence& multi_fence);
|
||||||
|
void CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence);
|
||||||
std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();
|
std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();
|
||||||
void ReleaseBuffer(u32 slot);
|
void ReleaseBuffer(u32 slot);
|
||||||
void Disconnect();
|
void Disconnect();
|
||||||
|
|
|
@ -215,10 +215,9 @@ public:
|
||||||
explicit IGBPConnectRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
explicit IGBPConnectRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
||||||
Deserialize();
|
Deserialize();
|
||||||
}
|
}
|
||||||
~IGBPConnectRequestParcel() override = default;
|
|
||||||
|
|
||||||
void DeserializeData() override {
|
void DeserializeData() override {
|
||||||
std::u16string token = ReadInterfaceToken();
|
[[maybe_unused]] const std::u16string token = ReadInterfaceToken();
|
||||||
data = Read<Data>();
|
data = Read<Data>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,10 +278,9 @@ public:
|
||||||
: Parcel(std::move(buffer)) {
|
: Parcel(std::move(buffer)) {
|
||||||
Deserialize();
|
Deserialize();
|
||||||
}
|
}
|
||||||
~IGBPSetPreallocatedBufferRequestParcel() override = default;
|
|
||||||
|
|
||||||
void DeserializeData() override {
|
void DeserializeData() override {
|
||||||
std::u16string token = ReadInterfaceToken();
|
[[maybe_unused]] const std::u16string token = ReadInterfaceToken();
|
||||||
data = Read<Data>();
|
data = Read<Data>();
|
||||||
buffer = Read<NVFlinger::IGBPBuffer>();
|
buffer = Read<NVFlinger::IGBPBuffer>();
|
||||||
}
|
}
|
||||||
|
@ -306,15 +304,40 @@ protected:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class IGBPCancelBufferRequestParcel : public Parcel {
|
||||||
|
public:
|
||||||
|
explicit IGBPCancelBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
||||||
|
Deserialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DeserializeData() override {
|
||||||
|
[[maybe_unused]] const std::u16string token = ReadInterfaceToken();
|
||||||
|
data = Read<Data>();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Data {
|
||||||
|
u32_le slot;
|
||||||
|
Service::Nvidia::MultiFence multi_fence;
|
||||||
|
};
|
||||||
|
|
||||||
|
Data data;
|
||||||
|
};
|
||||||
|
|
||||||
|
class IGBPCancelBufferResponseParcel : public Parcel {
|
||||||
|
protected:
|
||||||
|
void SerializeData() override {
|
||||||
|
Write<u32>(0); // Success
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class IGBPDequeueBufferRequestParcel : public Parcel {
|
class IGBPDequeueBufferRequestParcel : public Parcel {
|
||||||
public:
|
public:
|
||||||
explicit IGBPDequeueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
explicit IGBPDequeueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
||||||
Deserialize();
|
Deserialize();
|
||||||
}
|
}
|
||||||
~IGBPDequeueBufferRequestParcel() override = default;
|
|
||||||
|
|
||||||
void DeserializeData() override {
|
void DeserializeData() override {
|
||||||
std::u16string token = ReadInterfaceToken();
|
[[maybe_unused]] const std::u16string token = ReadInterfaceToken();
|
||||||
data = Read<Data>();
|
data = Read<Data>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,7 +356,6 @@ class IGBPDequeueBufferResponseParcel : public Parcel {
|
||||||
public:
|
public:
|
||||||
explicit IGBPDequeueBufferResponseParcel(u32 slot, Service::Nvidia::MultiFence& multi_fence)
|
explicit IGBPDequeueBufferResponseParcel(u32 slot, Service::Nvidia::MultiFence& multi_fence)
|
||||||
: slot(slot), multi_fence(multi_fence) {}
|
: slot(slot), multi_fence(multi_fence) {}
|
||||||
~IGBPDequeueBufferResponseParcel() override = default;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void SerializeData() override {
|
void SerializeData() override {
|
||||||
|
@ -352,10 +374,9 @@ public:
|
||||||
explicit IGBPRequestBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
explicit IGBPRequestBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
||||||
Deserialize();
|
Deserialize();
|
||||||
}
|
}
|
||||||
~IGBPRequestBufferRequestParcel() override = default;
|
|
||||||
|
|
||||||
void DeserializeData() override {
|
void DeserializeData() override {
|
||||||
std::u16string token = ReadInterfaceToken();
|
[[maybe_unused]] const std::u16string token = ReadInterfaceToken();
|
||||||
slot = Read<u32_le>();
|
slot = Read<u32_le>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,10 +405,9 @@ public:
|
||||||
explicit IGBPQueueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
explicit IGBPQueueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
||||||
Deserialize();
|
Deserialize();
|
||||||
}
|
}
|
||||||
~IGBPQueueBufferRequestParcel() override = default;
|
|
||||||
|
|
||||||
void DeserializeData() override {
|
void DeserializeData() override {
|
||||||
std::u16string token = ReadInterfaceToken();
|
[[maybe_unused]] const std::u16string token = ReadInterfaceToken();
|
||||||
data = Read<Data>();
|
data = Read<Data>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,10 +467,9 @@ public:
|
||||||
explicit IGBPQueryRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
explicit IGBPQueryRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
|
||||||
Deserialize();
|
Deserialize();
|
||||||
}
|
}
|
||||||
~IGBPQueryRequestParcel() override = default;
|
|
||||||
|
|
||||||
void DeserializeData() override {
|
void DeserializeData() override {
|
||||||
std::u16string token = ReadInterfaceToken();
|
[[maybe_unused]] const std::u16string token = ReadInterfaceToken();
|
||||||
type = Read<u32_le>();
|
type = Read<u32_le>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,7 +615,12 @@ private:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TransactionId::CancelBuffer: {
|
case TransactionId::CancelBuffer: {
|
||||||
LOG_CRITICAL(Service_VI, "(STUBBED) called, transaction=CancelBuffer");
|
IGBPCancelBufferRequestParcel request{ctx.ReadBuffer()};
|
||||||
|
|
||||||
|
buffer_queue.CancelBuffer(request.data.slot, request.data.multi_fence);
|
||||||
|
|
||||||
|
IGBPCancelBufferResponseParcel response{};
|
||||||
|
ctx.WriteBuffer(response.Serialize());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TransactionId::Disconnect: {
|
case TransactionId::Disconnect: {
|
||||||
|
|
Loading…
Reference in a new issue