diff options
| author | 2020-10-12 17:35:34 -0700 | |
|---|---|---|
| committer | 2020-10-13 22:11:52 -0700 | |
| commit | 1f186f34a29da8c4e39e3ad25fff1e4a39b33e85 (patch) | |
| tree | 0345d677ffe053bb1ed06ba1728d8ce31ee66fae /src | |
| parent | Merge pull request #4787 from lioncash/conversion (diff) | |
| download | yuzu-1f186f34a29da8c4e39e3ad25fff1e4a39b33e85.tar.gz yuzu-1f186f34a29da8c4e39e3ad25fff1e4a39b33e85.tar.xz yuzu-1f186f34a29da8c4e39e3ad25fff1e4a39b33e85.zip | |
hle: service: vi: Implement BufferQueue::CancelBuffer.
- This is used by Super Mario 3D All-Stars.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/nvflinger/buffer_queue.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/buffer_queue.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 52 |
3 files changed, 53 insertions, 14 deletions
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 637b310d7..4f1e210b1 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp | |||
| @@ -99,6 +99,20 @@ void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform, | |||
| 99 | queue_sequence.push_back(slot); | 99 | queue_sequence.push_back(slot); |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence) { | ||
| 103 | const auto itr = std::find_if(queue.begin(), queue.end(), | ||
| 104 | [slot](const Buffer& buffer) { return buffer.slot == slot; }); | ||
| 105 | ASSERT(itr != queue.end()); | ||
| 106 | ASSERT(itr->status != Buffer::Status::Free); | ||
| 107 | itr->status = Buffer::Status::Free; | ||
| 108 | itr->multi_fence = multi_fence; | ||
| 109 | itr->swap_interval = 0; | ||
| 110 | |||
| 111 | free_buffers.push_back(slot); | ||
| 112 | |||
| 113 | buffer_wait_event.writable->Signal(); | ||
| 114 | } | ||
| 115 | |||
| 102 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { | 116 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { |
| 103 | auto itr = queue.end(); | 117 | auto itr = queue.end(); |
| 104 | // Iterate to find a queued buffer matching the requested slot. | 118 | // Iterate to find a queued buffer matching the requested slot. |
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index 8a837e5aa..e7517c7e1 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h | |||
| @@ -95,6 +95,7 @@ public: | |||
| 95 | void QueueBuffer(u32 slot, BufferTransformFlags transform, | 95 | void QueueBuffer(u32 slot, BufferTransformFlags transform, |
| 96 | const Common::Rectangle<int>& crop_rect, u32 swap_interval, | 96 | const Common::Rectangle<int>& crop_rect, u32 swap_interval, |
| 97 | Service::Nvidia::MultiFence& multi_fence); | 97 | Service::Nvidia::MultiFence& multi_fence); |
| 98 | void CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence); | ||
| 98 | std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer(); | 99 | std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer(); |
| 99 | void ReleaseBuffer(u32 slot); | 100 | void ReleaseBuffer(u32 slot); |
| 100 | void Disconnect(); | 101 | void Disconnect(); |
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index d380c60fb..5b0e371fe 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -215,10 +215,9 @@ public: | |||
| 215 | explicit IGBPConnectRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { | 215 | explicit IGBPConnectRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { |
| 216 | Deserialize(); | 216 | Deserialize(); |
| 217 | } | 217 | } |
| 218 | ~IGBPConnectRequestParcel() override = default; | ||
| 219 | 218 | ||
| 220 | void DeserializeData() override { | 219 | void DeserializeData() override { |
| 221 | std::u16string token = ReadInterfaceToken(); | 220 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); |
| 222 | data = Read<Data>(); | 221 | data = Read<Data>(); |
| 223 | } | 222 | } |
| 224 | 223 | ||
| @@ -279,10 +278,9 @@ public: | |||
| 279 | : Parcel(std::move(buffer)) { | 278 | : Parcel(std::move(buffer)) { |
| 280 | Deserialize(); | 279 | Deserialize(); |
| 281 | } | 280 | } |
| 282 | ~IGBPSetPreallocatedBufferRequestParcel() override = default; | ||
| 283 | 281 | ||
| 284 | void DeserializeData() override { | 282 | void DeserializeData() override { |
| 285 | std::u16string token = ReadInterfaceToken(); | 283 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); |
| 286 | data = Read<Data>(); | 284 | data = Read<Data>(); |
| 287 | buffer = Read<NVFlinger::IGBPBuffer>(); | 285 | buffer = Read<NVFlinger::IGBPBuffer>(); |
| 288 | } | 286 | } |
| @@ -306,15 +304,40 @@ protected: | |||
| 306 | } | 304 | } |
| 307 | }; | 305 | }; |
| 308 | 306 | ||
| 307 | class IGBPCancelBufferRequestParcel : public Parcel { | ||
| 308 | public: | ||
| 309 | explicit IGBPCancelBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { | ||
| 310 | Deserialize(); | ||
| 311 | } | ||
| 312 | |||
| 313 | void DeserializeData() override { | ||
| 314 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); | ||
| 315 | data = Read<Data>(); | ||
| 316 | } | ||
| 317 | |||
| 318 | struct Data { | ||
| 319 | u32_le slot; | ||
| 320 | Service::Nvidia::MultiFence multi_fence; | ||
| 321 | }; | ||
| 322 | |||
| 323 | Data data; | ||
| 324 | }; | ||
| 325 | |||
| 326 | class IGBPCancelBufferResponseParcel : public Parcel { | ||
| 327 | protected: | ||
| 328 | void SerializeData() override { | ||
| 329 | Write<u32>(0); // Success | ||
| 330 | } | ||
| 331 | }; | ||
| 332 | |||
| 309 | class IGBPDequeueBufferRequestParcel : public Parcel { | 333 | class IGBPDequeueBufferRequestParcel : public Parcel { |
| 310 | public: | 334 | public: |
| 311 | explicit IGBPDequeueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { | 335 | explicit IGBPDequeueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { |
| 312 | Deserialize(); | 336 | Deserialize(); |
| 313 | } | 337 | } |
| 314 | ~IGBPDequeueBufferRequestParcel() override = default; | ||
| 315 | 338 | ||
| 316 | void DeserializeData() override { | 339 | void DeserializeData() override { |
| 317 | std::u16string token = ReadInterfaceToken(); | 340 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); |
| 318 | data = Read<Data>(); | 341 | data = Read<Data>(); |
| 319 | } | 342 | } |
| 320 | 343 | ||
| @@ -333,7 +356,6 @@ class IGBPDequeueBufferResponseParcel : public Parcel { | |||
| 333 | public: | 356 | public: |
| 334 | explicit IGBPDequeueBufferResponseParcel(u32 slot, Service::Nvidia::MultiFence& multi_fence) | 357 | explicit IGBPDequeueBufferResponseParcel(u32 slot, Service::Nvidia::MultiFence& multi_fence) |
| 335 | : slot(slot), multi_fence(multi_fence) {} | 358 | : slot(slot), multi_fence(multi_fence) {} |
| 336 | ~IGBPDequeueBufferResponseParcel() override = default; | ||
| 337 | 359 | ||
| 338 | protected: | 360 | protected: |
| 339 | void SerializeData() override { | 361 | void SerializeData() override { |
| @@ -352,10 +374,9 @@ public: | |||
| 352 | explicit IGBPRequestBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { | 374 | explicit IGBPRequestBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { |
| 353 | Deserialize(); | 375 | Deserialize(); |
| 354 | } | 376 | } |
| 355 | ~IGBPRequestBufferRequestParcel() override = default; | ||
| 356 | 377 | ||
| 357 | void DeserializeData() override { | 378 | void DeserializeData() override { |
| 358 | std::u16string token = ReadInterfaceToken(); | 379 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); |
| 359 | slot = Read<u32_le>(); | 380 | slot = Read<u32_le>(); |
| 360 | } | 381 | } |
| 361 | 382 | ||
| @@ -384,10 +405,9 @@ public: | |||
| 384 | explicit IGBPQueueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { | 405 | explicit IGBPQueueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { |
| 385 | Deserialize(); | 406 | Deserialize(); |
| 386 | } | 407 | } |
| 387 | ~IGBPQueueBufferRequestParcel() override = default; | ||
| 388 | 408 | ||
| 389 | void DeserializeData() override { | 409 | void DeserializeData() override { |
| 390 | std::u16string token = ReadInterfaceToken(); | 410 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); |
| 391 | data = Read<Data>(); | 411 | data = Read<Data>(); |
| 392 | } | 412 | } |
| 393 | 413 | ||
| @@ -447,10 +467,9 @@ public: | |||
| 447 | explicit IGBPQueryRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { | 467 | explicit IGBPQueryRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { |
| 448 | Deserialize(); | 468 | Deserialize(); |
| 449 | } | 469 | } |
| 450 | ~IGBPQueryRequestParcel() override = default; | ||
| 451 | 470 | ||
| 452 | void DeserializeData() override { | 471 | void DeserializeData() override { |
| 453 | std::u16string token = ReadInterfaceToken(); | 472 | [[maybe_unused]] const std::u16string token = ReadInterfaceToken(); |
| 454 | type = Read<u32_le>(); | 473 | type = Read<u32_le>(); |
| 455 | } | 474 | } |
| 456 | 475 | ||
| @@ -596,7 +615,12 @@ private: | |||
| 596 | break; | 615 | break; |
| 597 | } | 616 | } |
| 598 | case TransactionId::CancelBuffer: { | 617 | case TransactionId::CancelBuffer: { |
| 599 | LOG_CRITICAL(Service_VI, "(STUBBED) called, transaction=CancelBuffer"); | 618 | IGBPCancelBufferRequestParcel request{ctx.ReadBuffer()}; |
| 619 | |||
| 620 | buffer_queue.CancelBuffer(request.data.slot, request.data.multi_fence); | ||
| 621 | |||
| 622 | IGBPCancelBufferResponseParcel response{}; | ||
| 623 | ctx.WriteBuffer(response.Serialize()); | ||
| 600 | break; | 624 | break; |
| 601 | } | 625 | } |
| 602 | case TransactionId::Disconnect: { | 626 | case TransactionId::Disconnect: { |